1.타입과 클래스
속성의 상속은 코드중복을 피할 수 있는, 합리적인 방법일 뿐만이 아니라 객체들 사이간에 타입관계들을 결정짓는다. 한 객체의 Type은 그 객체에서 수행할 수 있는 모든 작업들을 결정짓는다. 숫자 자료형들이 특정 연산만 가능한 것처럼, 객체의 유형에 따라 특정 작업만이 가능하다. 예를 들어 객체 내에 정의된 메서드들. 작업에는 보여지는 속성의 읽기와 쓰기도 포함된다.
1.5 Supertypes and Subtypes, 상위타입과 하위타입
Director 클래스는 Person 클래스에서 파생되었고 확장되었다. '확장'이란 속성과 메서드들이 추가돠는 동시에 Person 클래스가 가지고 있던 기존 속성 및 메서드가 모두 상속되는 것을 의미한다. 이는 하위 클래스의 객체들이 상위 클래스의 객체들이 할 수 있는 모든 일을 할 수 있다는 뜻이다. 위에 아까 든 예시로 예를 들자면, 감독 클래스의 객체는 Person 클래스의 객체들이 할 수 있는 모든 작업을 할 수 있다는 거다.
=> 또한 이는 Person Type이 Director Type의 Supertype (상위타입) 이라는 뜻이다. Director는 Director Typ 일 분만이 아니라 Person Type 이기도 한다. 상속은 Type 계층에 영향을 준다.
val steve : Director = Director("Steve","Spielburg", emma)
Director type을 가진 Director의 객체 steve가 생성되었다. 의심의 여지 없이 steve는 Director type을 가지고 있는데 만일 다음과 같이 정의하면 어떨까?
val steve : Person = Director("Steve","Spielburg", emma)
이렇게 작성 시, 컴파일러 에러가 뜨지 않는다. 상속때문에 Director Type의 개체는 Person Type이 지정하는 모든 작업을 수행할 수 있기 때문이다 따라서 Director 유형의 객체를 Person 유형의 객체처럼 취급하는게 가능하다. 그러나 steve는 이제 Person Type의 객체에만 정의된 모든 속성과 메서드에만 참조할 수 있다.
2. Generalization and Specialization, 일반화와 전문화
한 가지 실험(?)아닌 시도를 해보자. 다음과 같은 메서드 하나를 만들었다 해보자.
메서드 whoEarnsMoreMoney는 Person 타입을 파라메터로 받고 두 객체의 급여를 비교 후 더 큰 큽여를 가진 객체 (Person타입)을 반환한다.
who는 whoEarnsMoreMoney 메서드의 반환값이니 Person타입을 가지고 있을 것이다. Person 타입으로 반환하는 메서드이기에 Actor도 Director 타입도 메서드에 사용이가능해 범용성이 넓지만 단점이 있다. Person 타입인 만큼 Actor나 Director 타입만이 추가로 가지고 있는 속성이나 메서드 참조가 불가능하다는 것이다. (밑에 사진 참조)
Q. 그럼 그 참조가 가능하게 할려면 어떻게 해야할까? Actor나 Director 타입처럼 취급해주면 된다.
=> 바로 as 를 붙여서!
이렇게 빨간부분 없이 컴파일러가 허용은 해준게 보이는데 프로그램을 실행해보면 에러가 뜬다. 쉬운 거 하나 없다...
+++ 에러 관련된 내용인 타입 호환성에 대한 글
출처:
내용 / 도움준 곳: 학교 교수님 (Christian Kohls) 강의
'언어 > Kotlin' 카테고리의 다른 글
Kotlin : Movie Maker 에서 Object 키워드 사용해보기 (1) | 2022.11.03 |
---|---|
Kotlin : Type-compatibility (ft. Upcast, Downcast) (1) | 2022.10.31 |
Kotlin : Polymorphie (ft.오버라이딩) (0) | 2022.10.30 |
Kotlin : 상속 (inheritance) 적용해보기 (0) | 2022.10.28 |
Kotlin : 상속 (inheritance) (0) | 2022.10.20 |