강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của costco82559948
costco82559948

câu hỏi đã được viết

Hướng dẫn dành cho người mới bắt đầu sử dụng Java và Kotlin

Bài 3. Cách xử lý Type trong Kotlin

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

Viết

·

232

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?으로 선언이 되어야 하는 것 아닌가요?

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

javakotlin객체지향

Câu trả lời 2

0

costco8255님의 프로필 이미지
costco8255
Người đặt câu hỏi

감사합니다!!

0

lannstark님의 프로필 이미지
lannstark
Người chia sẻ kiến thức

안녕하세요! 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을 사용하면 타입을 생략할 수 있는 것과 같습니다.

감사합니다! 🙇

lannstark님의 프로필 이미지
lannstark
Người chia sẻ kiến thức

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

costco8255님의 프로필 이미지
costco8255
Người đặt câu hỏi

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

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

그리고

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

그렇다면

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

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

lannstark님의 프로필 이미지
lannstark
Người chia sẻ kiến thức

그러면 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? 처럼 타입 뒤에 물음표가 붙는다는 뜻입니다.

 

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

Hình ảnh hồ sơ của costco82559948
costco82559948

câu hỏi đã được viết

Đặt câu hỏi