객체지향 프로그래밍
- 메세지는 객체들이 서로 협력하기 위해 사용할 수 있는 유일한 의사소통 수단입니다.
- 객체가 메시지를 수신할 수 있다는 것은 객체가 메시지에 해당하는 책임을 수행할 수 있다는 것을 의미합니다.
- 외부의 객체는 메시지에 관해서만 볼 수 있고 객체 내부는 볼 수 없기 때문에 자연스럽게 객체의 외부와 내부가 분리됩니다.
- 독립된 객체의 상태와 행위에 대해 고민하지 말고 시스템의 기능을 구현하기 위해 객체가 다른 객체에게 제공해야하는 메시지에 대해 더욱 고민하는 것이 좋습니다.
- 책임-주도 설계의 기본 아이디어는 객체들 간에 주고받는 메시지를 기반으로 적절한 역할과 책임, 협력을 발견하는 것입니다.
- what/who 사이클은 어떤 행위(메시지)를 수행할지 결정하고 누가 그 행위를 수행할지 생각하고 필요한 메시지를 결정한 다음 적합한 객체를 선택하는 것 입니다. 즉, 수신된 메시지가 객체의 책임을 결정합니다.
- 인터페이스는 어떤 사물이 마주치는 경계 지점에서 서로 상호작용할 수 있게 이어주는 장치나 방법입니다. 가령 사람과 사람 사이의 인터페이스는 말,몸짓, 손짓, 휴대폰이 될 수 있습니다.
-생성자란
바에서 생성자(Constructor)는 객체를 초기화하는 특별한 종류의 메소드입니다. 생성자는 클래스와 동일한 이름을 가지며, 반환 값이 없습니다. 객체가 생성될 때 자동으로 호출되며, 객체의 인스턴스 변수를 초기화하고 다른 초기화 작업을 수행합니다.
생성자는 다음과 같은 특징을 가집니다:
- 생성자 이름은 클래스 이름과 동일합니다.
- 생성자는 반환 값이 없으며, void 타입으로 선언하지 않습니다.
- 생성자는 객체 생성 시 자동으로 호출됩니다.
- 생성자는 오버로딩될 수 있습니다.
- 생성자는 매개변수를 가질 수 있으며, 매개변수를 이용해 초기화 작업을 수행할 수 있습니다.
예를 들어, 다음은 생성자를 사용하여 Person 클래스의 인스턴스 변수를 초기화하는 예시입니다.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
위의 코드에서 Person 클래스는 두 개의 인스턴스 변수인 name과 age를 가집니다. 생성자는 매개변수로 name과 age를 받아 객체의 인스턴스 변수를 초기화합니다. 이를 통해 객체를 생성하면, name과 age가 초기화된 상태로 생성됩니다.
-오퍼레이션
오퍼레이션(Operation)은 객체 지향 프로그래밍에서 객체가 수행할 수 있는 작업 또는 동작을 의미합니다. Java에서 오퍼레이션은 일반적으로 클래스 내의 메소드로 구현됩니다.
오퍼레이션은 객체가 수행할 수 있는 작업을 추상화하여 객체의 행동을 정의합니다. 객체는 다른 객체와 메시지를 주고받으며, 이를 통해 오퍼레이션을 수행합니다. 이러한 객체 간의 상호작용은 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다.
Java에서는 클래스를 사용하여 객체를 추상화하고, 객체의 오퍼레이션을 메소드로 구현합니다. 메소드는 클래스 내에서 정의되며, 객체가 수행할 수 있는 작업을 구체적으로 정의합니다. 메소드는 객체의 속성을 변경하거나, 다른 객체와 상호작용하며, 결과 값을 반환할 수 있습니다.
-결합도
결합도(Coupling)는 객체 지향 프로그래밍에서 한 모듈이 다른 모듈에 얼마나 의존하는지를 나타내는 정도를 의미합니다. 즉, 한 모듈이 다른 모듈과 얼마나 강하게 연결되어 있는지를 나타냅니다. 높은 결합도는 모듈 간의 의존도가 높다는 것을 의미하며, 이는 유지보수와 확장성에 부정적인 영향을 미칠 수 있습니다.
Java에서는 결합도를 낮추기 위해 다음과 같은 방법을 사용할 수 있습니다.
- 추상화: 추상화는 구체적인 구현을 추상적인 개념으로 대체하는 것을 의미합니다. 추상화를 통해 모듈의 구현 세부 정보를 숨길 수 있으며, 다른 모듈에서 모듈의 구현에 대한 직접적인 의존성을 줄일 수 있습니다.
- 인터페이스: 인터페이스는 추상화의 한 형태로, 모듈이 다른 모듈과 상호작용할 수 있는 방법을 정의합니다. 인터페이스를 사용하여 모듈 간의 결합도를 낮출 수 있습니다.
- 의존성 주입(Dependency Injection): 의존성 주입은 모듈이 다른 모듈을 직접적으로 참조하지 않고, 외부에서 모듈이 필요로 하는 의존 객체를 주입하는 방식입니다. 이를 통해 모듈 간의 결합도를 낮출 수 있습니다.
- 패키지 구조: 패키지 구조는 모듈을 그룹화하여 모듈 간의 관계를 정의하는 방식입니다. 패키지 구조를 잘 설계하여 모듈 간의 결합도를 낮출 수 있습니다.
결합도는 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다. 모듈 간의 결합도를 낮추는 것은 유지보수와 확장성을 향상시키는 데 도움이 됩니다.
-List 와 ArrayList
Java에서 List 인터페이스는 추상적인 개념으로, List 타입의 객체를 생성할 수 없습니다. 따라서 List를 구현하는 클래스 중 하나를 선택하여 객체를 생성해야 합니다. ArrayList는 List 인터페이스를 구현하는 클래스 중 하나이며, 동적으로 크기가 조정되는 배열을 사용하여 요소를 저장하므로 자주 사용됩니다.
따라서, List<String> list = new ArrayList<>(); 구문은 List 인터페이스를 구현한 ArrayList 클래스의 객체를 생성하고, list 변수에 할당하는 것입니다. 이렇게 하면 list 변수는 ArrayList 객체를 참조하게 됩니다.
-List 와 ArrayList 차이점
ArrayList<String> list = new ArrayList<>();와 List<String> list = new ArrayList<>();은 기능상 큰 차이가 없습니다. 다만, 두 문장의 차이점은 변수의 타입에 있습니다.
ArrayList<String>은 클래스 타입을 직접 지정한 것이고, List<String>는 인터페이스 타입을 사용한 것입니다. 인터페이스 타입을 사용하는 것은 유연성을 높이는 데 도움이 됩니다. 예를 들어, 이후에 코드에서 리스트의 구현체를 바꿔야할 때, List 타입을 사용하면 구현체만 바꾸면 되므로 코드 수정이 쉬워집니다.
따라서, 코드 작성 시에는 가능하면 인터페이스 타입을 사용하는 것이 좋습니다. 하지만, 특정한 경우에는 구현체의 특별한 기능을 사용해야 할 때, 구현체 타입을 사용해야 하는 경우도 있을 수 있습니다
-구현체
구현체(Implementation)는 인터페이스(Interface)를 구현한 클래스(Class)를 의미합니다. 인터페이스는 추상 메소드의 집합으로, 인터페이스를 상속받은 구현체 클래스는 해당 인터페이스의 모든 추상 메소드를 구현해야 합니다. 구현체를 이용하면, 인터페이스에서 정의한 규격대로 동작하는 객체를 생성할 수 있으며, 객체를 생성한 후에는 인터페이스에서 정의한 메소드를 호출하여 객체를 사용할 수 있습니다. 구현체는 다형성(Polymorphism)의 개념을 구현하는 데 사용되며, 같은 인터페이스를 구현한 다른 구현체를 사용할 수 있습니다.
-인터페이스
인터페이스(Interface)는 객체 지향 프로그래밍에서 클래스나 다른 인터페이스에서 구현할 메소드의 원형(시그니처)만을 선언한 추상화된 형태의 클래스입니다. 즉, 인터페이스는 클래스가 가져야 할 메소드의 이름, 매개변수, 반환값 등을 정의하는데 사용됩니다.
인터페이스는 다음과 같은 특징을 가집니다.
- 추상화: 인터페이스는 추상화의 한 형태로, 구현 세부 정보를 감추고 필요한 동작만을 정의합니다.
- 다중 상속: 클래스는 단일 상속만을 허용하지만, 인터페이스는 다중 상속이 가능합니다. 따라서 여러 개의 인터페이스를 구현하여 하나의 클래스가 여러 동작을 수행할 수 있도록 할 수 있습니다.
- 표준화: 인터페이스는 메소드의 시그니처만을 선언하므로, 여러 클래스에서 동일한 메소드 이름, 매개변수, 반환값을 사용할 수 있습니다. 이를 통해 코드의 일관성과 가독성을 높일 수 있습니다.
인터페이스는 다른 클래스가 해당 인터페이스를 구현하여 동일한 메소드를 제공할 수 있도록 하는 역할을 합니다. 인터페이스를 구현한 클래스는 반드시 인터페이스에서 선언한 모든 메소드를 구현해야 하며, 이를 통해 클래스 간의 결합도를 낮추고 유연성을 높일 수 있습니다.
'TIL' 카테고리의 다른 글
Day33(자바 컴파일 순서,반복의 3요소, 라이브러리와 framework차이, 객체지향 프로그램과 절차적 프로그램의 차이를 캡슐화 개념을 통해 설명,Value Object와 entity의 차이 ) (0) | 2023.03.06 |
---|---|
Day32(입력받은 값이 비어 있지 않고, 숫자로 이루어져 있는지를 확인하는 조건문) (0) | 2023.03.05 |
Day30(예약어,List,Class,생성자,this,도메인 모델, 상속,위임,오버로딩,라이브러리) (0) | 2023.03.03 |
Day29(객체지향 프로그램 작성에 대한 방향성,TDD 작성시 생각할 점,참조) (0) | 2023.03.02 |
Day28(프로그램 종료 후에도 화면 그대로 유지,getComponent) (0) | 2023.03.01 |