조영호님의 책 오브젝트를 보며 정리한 내용입니다.
문제가 될 시 해당글 삭제하겠습니다.
객체지향이란?
- 객체를 지향하는 것으로! 그 중심에는 객체가 위치한다.
- 객체지향에서 가장 중요한 것은 애플리케이션의 기능을 수행하기 위해 협력에 참여하는 객체들 사이의 상호작용이다.
- 객체들은 협력에 참여하기 위해 역할을 부여받고 그에 적합한 책임을 수행한다.
객체지향 프로그래밍 주의사항!
1. 어떤 클래스가 필요한지가 아닌, 어떤 객체가 필요한지 생각해라!
-> 설계를 단순하고 깔끔하게 만든다.
2. 객체를 독립적인 존재가 아닌 기능을 구현하기 위해 협력하는 공동체로 바라봐라!
자율적인 객체
1. 객체가 상태와 행동을 함께 가지는 복합적인 존재이다!(캡슐화)
2. 객체가 스스로 판단하고 행동하는 자율적인 존재이다!
3. 접근 수정자를 사용해 객체 내부에 대한 접근을 통제한다.
-> 자율적인 객체 == 외부의 간섭을 최소화!
-> 외부에서 접근 가능한 부분 : 퍼블릭 인터페이스(행동)
-> 오직 내부에서만 접근 가능한 부분 : 구현
협력에 관한 짧은 이야기
1. 객체는 다른 객체의 인터페이스에 공개된 행동을 수행하도록 요청(request)할 수 있다.
2. 요청을 받은 객체는 자율적인 방법에 따라 요청을 처리한 후 응답(response)한다.
-> 객체가 다른 객체와 상호작용하는 유일한 방법은, 메시지를 전송(request)하는 것 뿐이다!
3. 메시지를 수신한 객체는 스스로의 결정의 따라서, 자율적으로 메시지를 처리할 방법을 결정한다.
-> 수신된 메시지를 처리하기 위한, 자신만의 방법을 메서드(method) 라고 부른다.
다형성
- 상속을 통해 다형적인 관계를 만들어낼 수 있다.
-> 상속을 할 때, 추상클래스(구현)가 아닌 인터페이스를 상속해야 한다!
-> 인터페이스를 재사용할 목적이 아닌, 구현을 재사용할 목적으로 상속을 사용하게 되면, 변경에 취약한 코드를 낳는다.
- 코드 상에서 객체가 동일한 메시지를 전달하지만, 실제로 어떤 메시지가 실행되는지는
메시지를 수신하는 객체의 인스턴스가 무엇이냐에 따라서 달라진다 이를 다형성이라 부른다.
- 다형성은 객체지향 프로그램의 컴파일타임 의존성과 런타임 의존성이 다를 수 있다는 사실을 기반한다.
-> 런타임에 의존성이 정해지는 것을 지연 바인딩, 동적 바인딩이라 부른다.
-> 컴파일타임에 의존성이 정해지는 것을 초기 바인딩, 정적 바인딩이라 부른다.
추상화를 사용할 때 장점
1. 추상화의 계층만 따로 떼어 놓고 살펴보면 요구사항을 더욱 높은 수준에서 서술 할 수 있다.
2. 추상화를 사용하면 설계가 조금 더 유연해 진다.
코드의 재사용
- 상속은 코드를 재사용하는 방법이지만, 상속보다 더 좋은 방법은 합성이다.
-> 합성 : 다른 객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 재사용하는 방식.
상속
상속의 단점
1. 캡슐화를 위반한다.
- 상속을 사용하기 위해서는 부모 클래스의 내부를 알고 있어야 한다.
-> 부모 클래스의 구현이 자식 클래스에 노출되기 때문에, 캡슐화가 약화된다.
-> 자식 클래스가 부모 클래스에 강하게 결합.(코드 변경이 어려워진다)
2. 설계를 유연하게 만들지 못한다.
- 부모 클래스와 자식 클래스 사이의 관계를 컴파일 타임에 결정한다.
-> 실행 시점에 객체의 종류를 변경하는 것이 불가능하다.
합성
- 상속은 부모 클래스의 코드와 식 클래스의 코드가 컴파일타임 시점에 강하게 결합되어 있다.
- 하지만 합성은 인터페이스에 정의된 메시지를 통해서 런타임 시점에 약하게 결합되게 된다.
'아키텍처 > OOP' 카테고리의 다른 글
[오브젝트] Chapter4 설계 품질과 트레이드 오프 (0) | 2022.11.02 |
---|---|
[오브젝트] Chapter3 역할, 책임, 협력 (0) | 2022.11.02 |
[오브젝트] Chapter1 객체 / 설계 (0) | 2022.11.02 |
상속과 합성 (0) | 2022.09.26 |
캡슐화? (0) | 2022.09.21 |