1. Type-compatibility, 타입 호환성
일반적으로 더 일반적인 타입의 변수에 더 구체적인(더 전문화된) 타입의 개체를 할당하는 것은 항상 가능하다. 더 일반적인 유형은 더 적은 수의 가능한 작업을 정의하고 하위 타입이 상위 타입의 모든 작업을 허용한다는 것이 보장되어 있기 때문이다. 밑에 예를 보자.
a와 p는 당연히 문제될 게 전혀 없다. 반면에 좀 살펴봐야 할 부분은 p2와 a2 다. p2는 Actor 타입이 상위 타입인 Person 타입의 모든 작업들이 허용 가능하니 문제되지 않는다 [모든 영화배우는 사람이다]. a2는 Person 타입이 하위타입(더 전문화된)인 Actor의 모든 작업들이 실행 가능하지 않으므로 프로그래밍 실행 전 이미 컴파일러 에러가 뜬다 [모든 사람은 영화배우가 아니다].
Heap 에 데이터 필드 이름, 성 및 급여가 생성된다. 여기에 대해 Person 및 Actor 타입의 개체가 생성된다 (p와 a)
하위 타입인 Actor는 Person 타입을 확장시켜 추가로 배우가 찍은 영화의 장르목록들을 읽을 수가 있다.
Person 타입의 p는 하위타입인 Actor 타입의 a 참조가 가능하다. 컴파일러 에러가 보이지 않는 이유는 p가 가지고 있는 모든 작업들을(firstname 읽기, lastname 읽기, salary 읽기 쓰기) Actor 클래스의 개체인 a가 다 가지고 있기 때문이다. 그럼 그 반대의 경우는 어떨까?
개체 a 가 상위 클래스(Person)의 개체인 p를 참조한다 할 경우, 바로 컴파일러 에러가 뜬다. 그림을 보면 a의 Genre 읽기가 불가능해 진것을 볼 수 있다. a가 해야할 작업들 중 가능해지지 않는게 생기니 에러가 뜬 것이다.
2. Upcast와 Downcast
Cast를 사용하면 한 유형을 다른 유형으로 생각할 수가 있다 (관점의 변화에 가깝다). Upcast는 항상 작동하며, 이는 우리가 항상 보다 구체적인 것(하위클래스)을 보다 일반적인 것(상위 클래스)으로 간주할 수 있음을 의미한다.
=> 예: [ 배우는 사람이다. ]
Actor 클래스를 사람처럼 다루는 건 배우가 결국은 사람이기 때문에 가능한 것이다. 사람이 할 수 있는 모든 작업들은 배우도 할수 있다.
=> 그러나, [ 모든 사람이 배우는 아니다. ]
배우가 하는 일들을 모든 사람이 할 수 있는 것이 아니다. 사람이 기본적으로 할 수 있는 일들 추가적으로 배우는 배우만의 일이 있다. 그래서 배우를 단순히 사람이란 행위자로 간주할 수가 없는 것이다.
*하지만 아까 위에 두번째 그림처럼 상위 타입 개체인 p가 더 구체적인 하위 타입의 개체를 참조할 수는 있다. 명시적 Downcast가 허용된 것이다. 실제로 이건 다음을 의미한다. [ 이 사람은 실제 배우다 ].
****************************
[정적 및 동적 Type 검사]
정적 type 검사는 프로그램이 실행되기 전에 Type이 호환되는지에 대한 여부를 판별하는데 사용할 수 있다. 컴파일 시간에 컴파일러는 허용되는 작업(동작)들과 Type 호환성이 보장되는지에 대한 여부를 판별한다. 이는 프로그램이 진행되는 동안 변경될 수 없기에 정적검사인 것이다.
동적 Type 검사는 일단 런타임 시간에만 판별할 수 있다. 작업들이 허용되는지에 대한 여부가.
+ 컴파일러는 정적 유형 검사를 수행하고 다음과 같은 오류들을 방지할 수있다.
*존재하지 않는 변수 참조, 존재하지 않는 메서드 호출 등
출처:
내용 / 도움준 곳: 학교 교수님 (Christian Kohls) 강의
'언어 > Kotlin' 카테고리의 다른 글
Kotlin : Object Composition & Aggregation 이란 (0) | 2022.11.03 |
---|---|
Kotlin : Movie Maker 에서 Object 키워드 사용해보기 (1) | 2022.11.03 |
Kotlin : Supertypes and Subtypes (0) | 2022.10.30 |
Kotlin : Polymorphie (ft.오버라이딩) (0) | 2022.10.30 |
Kotlin : 상속 (inheritance) 적용해보기 (0) | 2022.10.28 |