본문 바로가기
프로그래밍 놀이터/Kotlin, Coroutine

[Effective Kotlin] Item 16 : Properties should represent state, not behavior

by 돼지왕 왕돼지 2022. 3. 13.
반응형

이 글은 Effective Java 를 완독하고, Kotlin 을 상용으로 사용하는 개발자 입장에서
Effective Kotlin 글 중 새로운 내용, remind 할 필요 있는 부분, 핵심 내용 등만 추려 정리한 내용입니다.

 

#
kotlin 의 property 는 java 보다 많은 기능을 가지고 있다.

 

#
custom setter, getter 를 가질 수 있으며, 이곳에서는 field(backing field) 라는 identifier 로 현재값을 참조한다.

 

#
val 로 정의함으로써 read-only 를 만들 수도 있다.

 

#
property 는 override 도 가능하고, lazy 등으로 delegate 도 할 수 있다.

 

#
extension property 정의도 가능하다.

 

#
property 는 알고리즘적 동작을 나타내서는 안 된다.

val Tree.sum: Int
	get() = when (this){
		is Leaf -> value
		is Node -> left.sum + right.sum
	}

위와 같이 알고리즘 동작이 들어가면 상황에 따라서 계산이 엄청 오래 걸릴 수 있다.
이런 것들은 함수로 치환되어야 한다.

 

#
일반적인 룰로 property 는 logic 이 들어가지 않은 간단한 값의 get/set 에 사용되어야 한다.
property 로 정의해도 될지를 간단히 테스트해보는 방법은 '이것을 함수로 치환한다면 함수 이름을 get/set 으로 시작할까?' 를 자문해보면 된다. yes 라면 property 로 두어도 괜찮다.

 

#
다음과 같은 경우 확실히 property 대신 함수로 하는 것이 좋다.

  1. 계산 작업이 오래 걸리거나 복잡도가 O(1) 이상인 경우 <- 유저가 property 접근이 비싸다고 생각하지 않을 것이기 때문
  2. 비지니스 로직을 포함한 경우 <- 유저가 get/set 정도의 간단한 일만 할 것이라 기대하기 때문
  3. 해당 property 에 2번 이상 연속 접근시 다른 결과를 내는 경우
  4. 실행 순서가 중요한 경우 <- user 는 get, set 이 어떤 순서로 실행되어도 상관 없다고 여길 것이다.
  5. Int.toDouble() 과 같은 변환인 경우
  6. Getter 가 property state 를 바꾸는 경우

 

#
특별한 이유가 없는 한, private property & getter & setter 조합 대신, public property 로 두는 것이 좋다.

 

#
간단한 규칙을 말하자면 property 는 state 를 다루고, function 은 동작을 다룬다.

 

 

 

반응형

댓글