Study/object
[엘레강트 오브젝트] 3-4장 충성스러우면서 불변이거나, 아니면 상수이거나
에디개발자
2021. 9. 18. 00:49
반응형
이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다.
책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다.
목차
- 상태와 데이터
- 가변 객체와 불변 객체
- 정리
1. 상태와 데이터
이전 2.6 섹션에서 불변성에 다루었습니다. 이번 섹션을 정리하기 전에 다시 한 번 불변성에 대해 명확하게 정리하려고 합니다. 먼저 상태(state)와 데이터(data)에 대해서 명확하게 짚고 넘어가겠습니다.
class WebPage(
private val uri: URI
) {
fun content(): String {
// 외부 연동하여 웹페이지의 Content을 읽어 반환
return ""
}
}
- 상태: uri
- 데이터: content() 메서드를 호출하여 반환되는 값
다른 예시를 들어보겠습니다.
class ImmutableList<T> (
private val items: MutableList<T>
) {
fun add(number: T) {
items.add(number)
}
fun iterate() : Iterable<T> =
Collections.unmodifiableList(items)
}
- 상태: items
- 데이터: items 리스트가 갖고 있는 값
2. 가변 객체와 불변 객체
이전에 작성한 코드를 기반으로 가변 객체와 불변 객체에 대해 명확히 정리해보겠습니다.
class WebPage(
private val uri: URI
) {
fun content(): String {
// 외부 연동하여 웹페이지의 Content을 읽어 반환
return ""
}
}
위 WebPage 클래스의 content() 메서드는 반환값(데이터)이 바뀐다고 가정합니다. 하지만 이 객체는 불변 객체입니다. 이유는 객체의 행동이나 반환값이 변환되어도 중요하지 않는다는 점입니다. 중요한 점은 객체의 속성값이 변하는 지가 중요합니다.
class ImmutableList<T> (
private val items: MutableList<T>
) {
fun add(number: T) {
items.add(number)
}
fun iterate() : Iterable<T> =
Collections.unmodifiableList(items)
}
ImmutableList 객체 또한 items(상태)는 변환하지 않습니다. 다만 items에 추가되는 number(데이터) 값만 변환될 뿐입니다. 이 객체 또한 불변 객체입니다.
객체의 행동이나 반환값이 변환하지 않는다면 상수(constant)일 것 입니다.
enum class State(
val desc: String
) {
READY("준비"),
START("시작"),
FINISH("종료");
companion object {
fun ready(): State = READY
}
}
// use
val ready = State.ready() // 항상 같은 값이 반환된다.
3. 정리
< 가변 객체 >
객체의 상태값을 변경하는 경우 가변 객체입니다.
class WebPage(
var uri: URI
) {
fun content(): String {
// 외부 연동하여 웹페이지의 Content을 읽어 반환
return ""
}
}
// use
val webPage = WebPage(URI("https://www.naver.com"))
webPage.uri = URI("https://www.google.com")
< 불변 객체 >
객체의 상태값은 변하지 않고 데이터만 변하는 경우 불변 객체입니다.
class ImmutableList<T> (
private val items: MutableList<T>
) {
fun add(number: T) {
items.add(number)
}
fun iterate() : Iterable<T> =
Collections.unmodifiableList(items)
}
// use
val list = ImmutableList<Int>(mutableListOf())
list.add(1) // 데이터 값 변경
list.add(2) // 데이터 값 변경
반응형