관리 메뉴

나만을 위한 블로그

[Kotlin] is 연산자와 as 연산자의 차이 본문

개인 공부/Kotlin

[Kotlin] is 연산자와 as 연산자의 차이

참깨빵위에참깨빵 2021. 5. 23. 21:00
728x90
반응형

코틀린을 공부하다 보면 이따금 is와 as 연산자를 볼 수 있다.

뭔지 몰라서 검색해보니 is와 as 연산자는 같이 설명되는 경우가 제법 있었다.

그래서 공부한 내용을 기록할 겸 포스팅으로 작성하게 되었다.

 

먼저 is와 as 각각의 사전적 정의는 아래와 같다.

is : be의 현재 시제의 3인칭 단수
be : 있다, 존재하다, 만들다
as : ~처럼(같이) / (자격, 기능 등이) ~로(서) / ~만큼 ~한

is는 자바에서 상속을 공부할 때 is-a 관계(~는 ~이다)를 공부하면서 본 적이 있다. Person이 Animal을 상속한다면 Person은 Animal이다 식으로 하위 클래스는 상위 클래스의 한 종류가 되야 한다는 내용으로, 강한 뉘앙스를 가진 단어라고 생각한다.

as는 정의의 뉘앙스로 봤을 때 is보다는 덜 강한 뉘앙스라고 생각한다. 그래서 굳이 강도를 따지자면 is > as라고 생각한다.

 

코틀린 공식 홈페이지에선 저것들을 어떻게 설명하는지 확인해봤다.

https://kotlinlang.org/docs/keyword-reference.html#hard-keywords

 

Keywords and operators | Kotlin

 

kotlinlang.org

is : 값에 특정 유형(자료형)이 있는지 확인, 같은 목적을 위한 when 문에서 사용된다
as : 타입 캐스트에 사용되거나 import에 대한 별칭을 지정할 때 사용된다

뒤에 붙은 부가적인 내용들은 그렇다치고 공식 홈페이지에서 확인한 건 이 둘이 자료형의 캐스팅 시 사용되는 연산자라는 것이다.

좀 더 자세히 확인해 보니 as에 대해선 아래와 같이 써 놨다.

일반적으로 캐스트가 불가능한 경우 캐스트 연산자는 예외를 발생시킨다. 따라서 안전하지 않다고 한다. 코틀린의 안전하지 않은 캐스트는 중위 연산자 as에 의해 수행된다. 예외를 방지하려면 as?와 같이 사용한다. 실패 시 null을 리턴한다.

is에 대해선 아래와 같이 써 놨다.

객체가 주어진 유형을 준수하는지 런타임 검사를 수행하려면 is 연산자 또는 !is를 사용해라. 대부분의 경우 컴파일러는 변경 불가능한 값에 대한 is-check 및 명시적 캐스트를 추적하고 필요할 때 자동으로 (안전한) 캐스트를 삽입하므로 코틀린에서 명시적 캐스트 연산자를 사용할 필요가 없다.

 

위의 내용만으로는 이해하기가 어렵다. 그래서 스택오버플로우를 찾아봤더니 아래와 같은 답변이 있었다.

https://stackoverflow.com/questions/47067302/what-is-difference-between-as-and-is-operator-in-kotlin/47067495

 

What is difference between "as" and "is" operator in Kotlin?

In Java, I can write code like: void cast(A a) { if(a instanceof Person) { Person p = (Person) a; } } In Kotlin, what should I do? Use as operator or is operator?

stackoverflow.com

"is X"는 "instanceof X"와 같은 의미고 "foo as X"는 "((X) foo)와 같은 의미다

instanceof는 객체의 타입을 확인할 때 쓰는데 형변환 가능 여부를 T/F로 알려주는 연산자다.

위 설명을 보고 is와 as의 차이가 어떤 것인지 대충은 알 것 같다.

반응형
Comments