인프런 커뮤니티 질문&답변

Hyeonuk Kim님의 프로필 이미지
Hyeonuk Kim

작성한 질문수

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

6강. 코틀린에서 반복문을 다루는 방법

안녕하세요. 대입문에 조건문이 들어갈 때, 변수 타입이 결정되는 방식에 대해서 질문이 있습니다.

해결된 질문

작성

·

413

2

안녕하세요. 강사님

코틀린 질문이 있습니다.

코틀린은 정적타입 언어로 알고 컴파일 시점에 변수의 타입이 결정되는 것으로 알고 있습니다.

또 코틀린은 if-else문과 같은 조건을 표현식으로 사용하는 것으로 압니다.

그래서 다음 처럼 조건식을 넣고 사용자 입력에 따라 정수/실수를 결정해서 할당하니

스크린샷 2023-01-08 오후 5.51.16.png

다음처럼 입력에 따라 정수일 수도 있고 실수일 수도 있습니다.

스크린샷 2023-01-08 오후 5.43.20.png스크린샷 2023-01-08 오후 5.43.55.png마치 런타임 시점에 결정되는 듯이 보이는데, 내부적으로 어떻게 처리되는 것인지 궁금합니다.

답변 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

라고도 생각해볼 수 있습니다!!

 

결론적으로, 정적 타입이기에 코드상 타입은 정해져 있고, 런타임이 진정한 구현 타입은 바뀔 수 있다고 생각해주시면 될 것 같습니다!!!

혹시나 조금 더 설명이 필요한 부분 있으시면 편하게 말씀해주세요!!! 감사합니다!! 🙏🙏

Hyeonuk Kim님의 프로필 이미지
Hyeonuk Kim
질문자

답변감사합니다!

Hyeonuk Kim님의 프로필 이미지
Hyeonuk Kim

작성한 질문수

질문하기