inflearn logo
강의

Khóa học

Chia sẻ kiến thức

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

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

239

costco8255

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

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

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

java kotlin 객체지향

Câu trả lời 2

0

costco8255

감사합니다!!

0

lannstark

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

감사합니다! 🙇

1

lannstark

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

0

costco8255

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

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

그리고

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

그렇다면

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

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

1

lannstark

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

 

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

수업노트

0

53

1

싱글톤과 스프링

0

71

2

get() = 3

0

49

2

강사님

0

74

1

강의 복습하면서 생긴 질문

1

94

1

Kotlin과 Java의 현업에서의 활용

0

124

2

data class와 자바의 Lombok을 이용한 DTO 클래스 차이 질문

0

74

1

코틀린에서 상속 시, 주의점에 대한 질문

1

95

3

내용 이해 질문

0

56

1

자바와 코틀린의 함수형 프로그래밍,

1

91

1

플랫폼 타입 설명 문의

2

76

2

널 아님 단언 관련 질문

0

83

1

강의 중 질문

0

79

2

범위 비교 질문

1

91

2

코틀린 val 질문

0

166

2

완강 후 Kotlin 이런저런 질문 드려봅니다!

3

408

2

확장함수 스타일 질문

0

139

2

확장 프로퍼티 질문

1

156

1

update 함수를 만든다는게 어떤 의미인지 예시가 궁금합니다!

1

283

1

java class의 NotNull 어노테이션 인식

1

262

1

[16강] 확장함수 관련 질문입니다!

1

131

2

리턴타입 사용시 any를 사용해도 괜찮은가요?

1

139

1

안녕하세요 scope function 에 receiver 가 없는 경우

1

169

1

코틀린 싱글톤 질문

1

219

1