다형성
다형성이란 쉽게 얘기해서 콜라를 '콜라 자체'로도 볼 수 있지만 '음료라는 특성'으로도 볼 수 있도록 만드는 것이 다형성의 개념이다.
class Drink{…}
class Cola : Drink() {…}
var a: Drink = Cola( ) // 음료(Drink)를 담는 변수에 저장하면 '음료의 기능만 사용'하게되고, (즉 Cola의 인스턴스를 생성했지만, Cola의 메소드와 속성은 사용할 수 없고, Drink의 메소드와 속성만 사용할 수 있다. ★★★참고로 두 클래스 모두 drink( )라는 함수가 정의되어있고, Cola클래스에의 drink( )가 override가 된 상태라면 a.drink( )구문을 실행했을때 비록 "음료(drink)의 기능만 사용"한다 했지만, override된 Cola의 메소드 drink함수를 실행하게 된다.)
var b:Cola = Cola( ) // 콜라를 담는 변수에 저장하면 '음료의 기능을 포함하여 콜라의 기능까지' 모두 사용할 수 있다.(즉 Drink와 Cola의 모든 메소드와 속성을 사용할 수 있다.)
// *변수의 자료형을 Cola로 할땐 타입추론 기능으로 Cola 자료형은 생략가능 ex) var b: = Cola( )
Cola 인스턴스를 자료형이 Drink인 변수에 저장하게 할 때 하위 자료형이 상위 자료형인 수퍼클래스로 변환한다고 하여 Up-Casting이라고 업캐스팅된 인스턴스를 다시 하위 자료형으로 변환하면 Down-Casting이라 부른다.
업캐스팅은 그냥 상위자료형에 담는것으로 동작하지만,
다운캐스팅은 '별도의 연산자'가 필요한데, 바로 'as'와 'is' 연산자이다.
as
'as'는 변수를 호환되는 자료형으로 변환해주는 캐스팅 연산자로 코드내에서 사용할 시 즉시 자료형을 변환(즉시 다운캐스팅)해주며 변환된 자료형을 반환도 해주는 연산자이다.
var a : Drink = Cola()
var b : a as Cola // Cola자료형으로 변환된 결과를 반환받아 변수에 대입!
is
'is'는 변수가 자료형에 호환되는지를 먼저 '체크한 후 변환'해주는 '캐스팅 연산자'로
조건문 내에서 사용되는 특징이 있다.
var a : Drink = Cola( )
if(a is Cola){
// 이 안에서만 a가 cola가 된다. 빠져나오면 a는 다시 Drink가 된다
}
fun main(){
var a = Drink()
a.drink()
var b:Drink= Cola()
b.drink()
if(b is Cola){
b.washDishes()
}
var c = b as Cola
c.washDishes()
c.washDishes() // 에러! 이유는 b is Cola { 이 구문을 빠져나가면 Drink가 되기때문}
}
open class Drink {
var name = "음료"
open fun drink(){
println("${name}을 마십니다.")
}
}
class Cola: Drink(){
var type = "콜라"
override fun drink(){
println("${name}중에 ${type}을 마십니다.")
}
fun washDishes(){
println("${type}로 설거지를 합니다.")
}
}
다형성은 클래스의 상속관계에서 오는 인스턴스의 호환성을 적극 활용할 수 있는 기능으로 수퍼클래스가 같은 인스턴스를 한번에 관리하거나 인터페이스를 구현하여 사용하는 코드내에서도 이용하니 이해가 꼭 필요하다.
다형성을 활용하면 기능을 묶어서 관리하기가 편하다.
호환성을 유지하면서 기능확장도 가능하고, 서브클래스에서 생성한 객체들은 수퍼클래스를 담는 변수나 리스트등에도 담을 수 있다.
다만 너무 다형성에 집착해서 무조건 서브클래스로 나누려고 노력하지는 마시고요. 설계에 따라 적절히 사용하시는것이 중요하다.
'코틀린' 카테고리의 다른 글
코틀린(17) - 컬렉션 객체, 리스트 (0) | 2022.03.23 |
---|---|
코틀린(16) - 제너릭 (0) | 2022.03.23 |
코틀린(14) - 람다함수를 이용한 스코프 함수 (0) | 2022.03.21 |
코틀린(13) - 고차함수, 람다함수 (0) | 2022.03.21 |
코틀린(12) - 스코프, 접근제한자 (0) | 2022.03.21 |
댓글