Kotlin Inffered Type을 지양해야하는 이유

반달·2023년 2월 11일
0

우테코 코드리뷰

목록 보기
2/3

문제코드

private fun checkMove(randomNumber: Int) = randomNumber >= CAN_MOVE_MINIMUM

리뷰어님 : 멤버변수와 메서드의 리턴타입은 모두 명시해주는 것은 어떨까요?명시해주는 것과 그렇지 않은 것은 어떤 차이점이 생길까요?

먼저 고민해보시고,아래 Effective Kotlin 서적의 챕터를 참고해서 스스로 생각해본 것과 비교해보아요 😀

  • Item 4 : Inferred Type으로 리턴하지 말라
  • Item 14 : 변수 타입이 명확하지 않은 경우 확실하게 지정하라

💡 내가 생각한 멤버변수와 메서드의 리턴타입 명시의 장단점

장점 : 다른 사람이 코드를 볼 때 메서드의 의도를 직관적으로 파악하기 좋다.
단점 : 코드가 길어진다.

Effective Kotlin 참고한 후 멤버변수, 메서드의 리턴타입 명시의 이유

변수를 할당 할 때 inffered 타입으로 값을 할당한다면, 무조건 피연산자에 맞게 설정되며 이는 슈퍼 클래스 또는 인터페이스로 설정되지 않습니다. 이는 의도보다 더 제한된 타입이 지정 될 수 있습니다.
예시 코드 )

open class Animal
class Zebra: Animal()

fun main(){
	var animal = Zebra()
	animal = Animal() // 에러!! Type mismatch: inferred type is Animal but Zebra was expected
}
// animal의 타입은 Zebra

위의 코드를 보면 Zebra가 Animal의 서브 클래스이다 보니 animal 변수에 inffered 타입으로 할당하게 되면 슈퍼클래스인 Animal()를 넣으려면 에러가 납니다. 해결을 하는 방법은 다음과 같습니다.

open class Animal
class Zebra: Animal()

fun main(){
	var animal: Animal = Zebra()
	animal = Animal() // 정상적으로 컴파일이 됩니다.
}
// animal의 타입은 Animal

이처럼 inffered 타입은 프로젝트가 진전 될 때, 제한이 너무 많아지거나 예측하지 못한 결과를 초래 할 수 있습니다.
또한 타입을 적지 않으면 코드를 보는 다른이가 직접 코드를 뒤져가며 알아봐야 합니다. 이는 타입을 제대로 명시만 해준다면 불필요한 행위입니다. 그렇다고 해서 무작정 타입을 명시하란 뜻이아닌 상황에 따라 명시에 해야 한다는 걸 유의해야 합니다.


느낀점

무작정 코드를 짧고 간결하게 줄이는 것만 생각해왔던 나에게 신선한 충격이었다.
읽기 좋은 코드를 쓰려고 간결하고 줄이는 행동이 사실을 가독성을 낮추고 예측하지 못하는 결과를 초래할 수 있다는 사실을 깨달았다. 심지어 깃허브같은 곳에서 내 코드를 본다면 IDE의 바로 이동 기능을 못하니 보는 사람 입장에서 직접 유추하면서 봐야하는 불편함이 있었다. 생각해보면 변수명을 지정할 때도 줄이지 않는 이유가 변수의 의도를 한번에 알기 쉽게 하기 위해서 였다. 허허 이걸 왜몰랐지 😅

profile
깊이 있는 안드로이드 개발자가 되기 위해

0개의 댓글