해결된 질문
작성
·
413
답변 1
3
안녕하세요, Hyeonuk Kim님!! 아이고~ 너무너무 좋은 질문이십니다!!! 👍👍
가장 흥미로운(?) 문제의 부분부터 바로 한 번 살펴보겠습니다!
val targetNum = if (cond == "y") 10 else 10.0
이 코드인데요!!
결론부터 말씀드리면 위의 코드는 다형성이 사용된 코드로, 컴파일 타임 때 진작 타입이 결정되어 있습니다. 단지 상위 타입으로 결정되어 있을 뿐이죠!
자 우선 다음 Java 코드를 하나 보고 오도록 하겠습니다!
public class Apple {
}
public class Banana {
}
여기 Apple 클래스와 Banana 클래스가 있습니다. 이 두 클래스는 정말 아무런 관련이 없어 보이죠!
하지만 이 코드는 다음과 같은 표현이 가능합니다.
Object fruit = "y".equals(cond) ? new Apple() : new Banana();
Object fruit
대신 Apple fruit
라고 하거나 Banana fruit
라고 하는 것은 불가능하지만, Apple이건 Banana이건 사실 Object 클래스의 하위 클래스 이기 때문에 위와 같은 표현이 가능한 것입니다!
Java 역시 정적 타입 언어이지만, fruit
에 대한 타입이 정적으로 Object로 정해졌을 뿐 실제 Apple일지 Banana일지는 cond에 따라 달라질 수 있습니다. 다형성을 활용해서 말이죠!!!! (바로 이 다형성이 객체지향 프로그래밍의 핵심이기도 하고요! ㅎㅎㅎㅎ)
다시 코틀린으로 돌아와서 코틀린에도 Object
와 비슷한 역할을 하는 Any
가 있기에
val targetNum: Any = if (cond == "y") 10 else 10.0
라고 생각할 수도 있고,
이 경우는 특별히 Number
라는 상위 타입이 공통적으로 존재하기에
val targetNum: Number = if (cond == "y") 10 else 10.0
라고도 생각해볼 수 있습니다!!
결론적으로, 정적 타입이기에 코드상 타입은 정해져 있고, 런타임이 진정한 구현 타입은 바뀔 수 있다고 생각해주시면 될 것 같습니다!!!
혹시나 조금 더 설명이 필요한 부분 있으시면 편하게 말씀해주세요!!! 감사합니다!! 🙏🙏
답변감사합니다!