인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

costco8255님의 프로필 이미지

작성한 질문수

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

3강. 코틀린에서 Type을 다루는 방법

타입캐스팅 궁금한점 질문드립니다.

작성

·

165

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

안녕하세요 코틀린을 처음 접해봤습니다. 질문이 이상하더라도 양해를 구하며 상세히 알려주시면 정말 감사하겠습니다.

fun printAgeIfPerson(obf:Any?){

val person = obj as? Person

......

}

여기서 질문 드립니다.

  1. 앞에서 변수 선언을 할 때 val,var을 배웠는데, 매개변수를 선언하는 부분에서 obf:Any? 대신에 val obj:Any?로는 안 쓰나요? 앞에서 모든 변수에는 var/val 을 붙여서 선언한다고 하셨어서요. obj는 매개변수에서 선언된 변수 아닌가요?

2.위 코드에서 obj as? Person 의 값이 결과값 또는 null로 나온다고 하셨는데, 그렇게 되면 lvalue인 val person에도 null이 들어갈 여지가 있으므로 val person? 나 val person:Person?으로 선언이 되어야 하는 것 아닌가요?

자바와 다른 점이 많아서 헷갈립니다.

답변 2

0

costco8255님의 프로필 이미지
costco8255
질문자

감사합니다!!

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! costco8255님! 🙂 질문 주셔서 감사합니다.

하나씩 답변 드려 보겠습니다.

  1. 앞에서 변수 선언을 할 때 val,var을 배웠는데, 매개변수를 선언하는 부분에서 obf:Any? 대신에 val obj:Any?로는 안 쓰나요? 앞에서 모든 변수에는 var/val 을 붙여서 선언한다고 하셨어서요. obj는 매개변수에서 선언된 변수 아닌가요?

네네 맞습니다! variable (변수) 는 val 혹은 var을 반드시 붙여야 하지만 argument (매개변수)는 val 또는 var을 붙이면 안됩니다!

사실 자바도 동일한데요! 자바의 var 키워드는 지역 변수에만 붙일 수 있고 매개변수에는 붙일 수 없습니다. 이걸 생각하시면 약간은 이해가 더 되실 수 있을 것 같아요!

 

2.위 코드에서 obj as? Person 의 값이 결과값 또는 null로 나온다고 하셨는데, 그렇게 되면 lvalue인 val person에도 null이 들어갈 여지가 있으므로 val person? 나 val person:Person?으로 선언이 되어야 하는 것 아닌가요?

val person = obj as? Person

먼저 val person? 이라는 문법은 코틀린에 없습니다! ? 자체는 "타입" 뒤에 붙여야 하기 때문에 변수 이름 뒤에는 붙일 수 없어요! 🥲 그리고 val person: Person? 은 가능합니다! Person 이 하나의 타입이니까요~

다만 타입을 생략할 수 있기 때문에 이 경우는 타입을 생략한 코드로 봐주시면 될 것 같습니다! 자바에서도 var을 사용하면 타입을 생략할 수 있는 것과 같습니다.

감사합니다! 🙇

최태현님의 프로필 이미지
최태현
지식공유자

또 궁금하신 점 있으시면 편하게 질문 남겨주세요! 🙏

costco8255님의 프로필 이미지
costco8255
질문자

그러면 val person: Person? 에서는 : Person 타입과 safecall인 ? 가 모두 생략 되어서

val person 만 남았다고 보면되는 건가요?

그리고

강사님께서 변수 뒤에는 safecall인 ?이 붙지 않는다고 하셨는데요.

그렇다면

이 전 강의에서 safecall 강의를 하실 때

str?.starswith() 같은 경우는 변수인 str 뒤에 붙은 것이 아닌 건가요? 호출되는 것만 보면 변수 뒤에 ?이 붙은 형태 같아서 질문드립니다.

최태현님의 프로필 이미지
최태현
지식공유자

그러면 val person: Person? 에서는 : Person 타입과 safecall인 ? 가 모두 생략 되어서

에 대해서 말씀드려보면, Person? 이라는 것 자체를 하나의 타입으로 봐주시면 될 것 같습니다. safe call 이란 것은 ? 기호를 의미하는 것이 아니라 ?. 라는 호출 방법을 의미합니다. ?. 가 한 세트이죠!

자바로 비유하면

@Nullable
private Person person;

@NotNullable
private Person person;

으로 봐주시면 될 것 같습니다 🙂

 

강사님께서 변수 뒤에는 safecall인 ?이 붙지 않는다고 하셨는데요.

str?.starswith() 같은 경우는 변수인 str 뒤에 붙은 것이 아닌 건가요?

위에서 말씀드린 것처럼 ? 자체가 safe call을 의미하는 것이 아닙니다

?. 이 하나의 safe call 이고요! 제가 말씀드린 변수 뒤에 ? 가 붙지 않는다는 의미는

질문주신 'nullable 한 변수를 선언하는 과정에서' val str?: String 처럼 ? 가 str이라는 선언된 변수 뒤에 나오지 않는다는 의미입니다.

(물론 코틀린에서 ? 가 단독으로 변수 뒤에 나오는 경우는 없습니다!)

TS 같은 몇몇 언어는 변수가 없을 수도 없다는 것을 표현하기 위해 num ?: number 처럼 타입을 선언하기도 하거든요 🙂 코틀린은 Int? 처럼 타입 뒤에 물음표가 붙는다는 뜻입니다.

 

답변이 도움이 되었으면 좋겠습니다. 감사합니다! 🙇