Fundamental
72
FundamentalOOP
오브젝트; 동적 메서드 탐색과 다형성
객체지향 언어가 제공하는 업캐스팅과 동적 바인딩을 이용하면 부모 클래스 참조에 대한 메시지 전송을 자식 클래스에 대한 메서드 호출로 변환할 수 있다. 객체지향 시스템은 다음 규칙에 따라 실행할 메서드를 선택한다. 메시지를 수신한 객체는 먼저 자신을 생성한 클래스에 적합한 메서드가 존재하는지 검사하낟. 존재하면 메서드를 실행하고 탐색을 종료한다. 메서드를 찾지 못했다면 부모 클래스에서 메서드 탐색을 계속 한다. 이 과정은 적합한 메서드를 찾을 때 까지 상속 계층을 따라 올라가며 계속된다. 상속 계층의 가장 최상위 클래스에 이르렀지만
FundamentalOOP
오브젝트; 업캐스팅과 동적 바인딩
실행 시점에 메서드를 탐색하는 과정을 살펴보자. 다음은 다익스트라 교수가 강의하는 알고리즘 과목의 성적 통계를 계산하는 코드다. Lecture대신 아래와 같이 GradeLecture로 전달할 수 있다 생성자의 인자 타입은 Lecture로 선언되어 있지만 GradeLecture의 인스턴스를 전달하더라도 아무 문제 없이 실행된다. 동일한 객체 참조인 lecture에 대해 동일한 evaluate메시지를 전송하는 동일한 코드 안에서 서로 다른 클래스 안에 구현된 메서드를 실행할 수 있다는 사실을 알 수 있다. 이처럼 코드 안에서 선언된 참
FundamentalOOP
오브젝트; 상속과 다형성
코드 재사용을 목적으로 상속을 사용하면 변경이 어렵고 유연하지 못한 설계에 이른다. 상속은 타입 계층을 구조화하기 위해 사용해야 한다. 타입 계층은 다형성의 기반을 제공한다. 상속은 인스턴스를 동일하게 행동하는 그룹으로 묶기 위한 관점으로 사용되어야 한다. 다형성 Polymorphism은 많은 형태를 가질 수 있는 능력을 의미한다. 컴퓨터 과학에서 다형성은 하나의 추상 인터페이스에 대해 코드를 작성하고 이 추상 인터페이스에 대해 서로 다른 구현을 연결 할 수 있는 능력으로 정의한다. 다형성의 구분은 위 그림과 같다. 오버로딩 다형성
FundamentalOOP
오브젝트; 상속을 합성으로 바꾸기
컴파일 타임 관계를 런타임 관계로 변경함으로써 이 문제를 해결한다. 이것이 합성이다. 상속을 사용하는 것은 컴파일 타임의 의존성과 런타임의 의존성을 동일하게 만들겠다고 선언하는 것이다. 그래서 상속을 사용하면 부모 클래스와 자식 클래스 사이의 관계가 정적으로 고정되기 때문에 실행 시점에 동적으로 관계를 변경할 수 있는 방법이 없다. 합성을 사용하면 구현 시점에 정책들의 관계를 고정시킬 필요가 없으며 실행 시점에 정책들의 관계를 유연하게 변경할 수 있게 된다. 상속이 조합의 결과를 개별 클래스 안으로 밀어 넣는 방법이라면, 합성은 조
FundamentalOOP
오브젝트; 상속의 문제
객체지향 프로그래밍에서 코드를 재사용하기 위한 기법으로 상속과 합성은 가장 널리 사용된다. 상속 부모클래스와 자식클래스를 연결해 부모클래스의 코드를 재사용한다. 클래스 사이의 의존성은 컴파일 타임에 결정된다. is-a 관계 상속을 제대로 사용하기 위해서는 부모의 내부 구현을 상세하게 알아야 하기 때문에 결합도가 높음 정적인 관계 합성 전체를 표현하는 객체가 부분을 표현하는 객체를 포함해 부분 객체의 코드를 재사용한다. 객체 사이의 의존성은 런타임에 결정된다. has-a 관계 퍼블릭 인터페이스에 의존하기 때문에 내부 구현이 변경되더라
FundamentalOOP
오브젝트; 추상화에 의존하는 상속
부모 클래스의 변경에 의해 자식 클래스가 영향을 받는 현상을 취약한 기반 클래스 문제 라고 부른다. 이제 결합도의 개념을 상속에 적용해보자. 구현을 상속한 경우(extends) 파생 클래스는 기반 클래스에 강하게 결합되며, 이 둘 사이의 밀접한 연결은 바람직하지 않다. 설계자들은 이런 현상에 대해 "취약한 기반 클래스 문제"라는 명칭을 붙였다. 겉으로 보기에는 안전한 방식으로 클래스를 수정한 것 처럼 보이더라도 이 새로운 행동이 파생 클래스에게 상속될 경우 파생 클래스의 잘못된 동작을 초래할 수 있기 때문에 기반 클래스는 "취약하다
FundamentalOOP
오브젝트; 상속과 중복 코드
객체지향 프로그래밍의 장점 중 하나는 코드의 재사용이다. 객체지향은 코드를 재사용 하기 위해 새로운 코드를 추가한다. 객체지향에서 클래스를 재사용 하는 전통적인 방법은 클래스를 추가하는 것이다. 이 장에서는 클래스를 재사용하기 위해 클래스를 추가하는 대표적인 방법인 상속에 관한 내용이다. 상속 외에도 새로운 클래스의 인스턴스 내에 기존 클래스의 인스턴스를 포함시키는 합성이라는 방법도 있다. 중복 코드를 제거해야 하는 이유 중복 코드는 변경을 방해한다. 중복 코드는 코드를 수정하기 위해 어떤 코드가 중복인지 먼저 찾아야 하는 시간이
FundamentalOOP
오브젝트; 의존성 주입과 의존 역전
의존성 주입 Dependency Injection : 사용하는 객체가 아닌 외부의 독립적인 객체가 인스턴스를 생성한 후 이를 전달해서 의존성을 해결하는 방법 의존성 주입 기법 생성자 주입 Setter 주입 메서드 주입 SERVICE LOCATOR 패턴 서비스를 사용하는 코드로부터 서비스가 누구인지 (서비스를 구현한 구체 클래스의 타입이 무엇인지), 어디에 있는지(클래스 인스턴스를 어떻게 얻을지)를 몰라도 되게 해준다. 사용처에서 특정 인스터스에 의존하기 원한다면 아래와 같이 사용해야 한다. Movie 생성자 만으로 의존성이 해결되지