Kotlin : Type-compatibility (ft. Upcast, Downcast)

언어/Kotlin

Kotlin : Type-compatibility (ft. Upcast, Downcast)

해리누나 2022. 10. 31. 01:24
반응형

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) 강의

 

728x90
반응형