타입캐스팅 궁금한점 질문드립니다.
239
작성한 질문수 1
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요 코틀린을 처음 접해봤습니다. 질문이 이상하더라도 양해를 구하며 상세히 알려주시면 정말 감사하겠습니다.
fun printAgeIfPerson(obf:Any?){
val person = obj as? Person
......
}
여기서 질문 드립니다.
앞에서 변수 선언을 할 때 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님! 🙂 질문 주셔서 감사합니다.
하나씩 답변 드려 보겠습니다.
앞에서 변수 선언을 할 때 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을 사용하면 타입을 생략할 수 있는 것과 같습니다.
감사합니다! 🙇
0
그러면 val person: Person? 에서는 : Person 타입과 safecall인 ? 가 모두 생략 되어서
val person 만 남았다고 보면되는 건가요?
그리고
강사님께서 변수 뒤에는 safecall인 ?이 붙지 않는다고 하셨는데요.
그렇다면
이 전 강의에서 safecall 강의를 하실 때
str?.starswith() 같은 경우는 변수인 str 뒤에 붙은 것이 아닌 건가요? 호출되는 것만 보면 변수 뒤에 ?이 붙은 형태 같아서 질문드립니다.
1
그러면 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
52
1
싱글톤과 스프링
0
71
2
get() = 3
0
49
2
강사님
0
74
1
강의 복습하면서 생긴 질문
1
93
1
Kotlin과 Java의 현업에서의 활용
0
121
2
data class와 자바의 Lombok을 이용한 DTO 클래스 차이 질문
0
72
1
코틀린에서 상속 시, 주의점에 대한 질문
1
95
3
내용 이해 질문
0
56
1
자바와 코틀린의 함수형 프로그래밍,
1
91
1
플랫폼 타입 설명 문의
2
73
2
널 아님 단언 관련 질문
0
83
1
강의 중 질문
0
79
2
범위 비교 질문
1
91
2
코틀린 val 질문
0
166
2
완강 후 Kotlin 이런저런 질문 드려봅니다!
3
408
2
확장함수 스타일 질문
0
138
2
확장 프로퍼티 질문
1
156
1
update 함수를 만든다는게 어떤 의미인지 예시가 궁금합니다!
1
283
1
java class의 NotNull 어노테이션 인식
1
260
1
[16강] 확장함수 관련 질문입니다!
1
130
2
리턴타입 사용시 any를 사용해도 괜찮은가요?
1
138
1
안녕하세요 scope function 에 receiver 가 없는 경우
1
168
1
코틀린 싱글톤 질문
1
218
1





