작성
·
165
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
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을 사용하면 타입을 생략할 수 있는 것과 같습니다.
감사합니다! 🙇
그러면 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?
처럼 타입 뒤에 물음표가 붙는다는 뜻입니다.
답변이 도움이 되었으면 좋겠습니다. 감사합니다! 🙇
또 궁금하신 점 있으시면 편하게 질문 남겨주세요! 🙏