Study/object

[엘레강트 오브젝트] 3-4장 충성스러우면서 불변이거나, 아니면 상수이거나

에디개발자 2021. 9. 18. 00:49
반응형

나를 닮았다고 한다...

이 글은 엘레강트 오브젝트 새로운 관점에서 바라본 객체지향 도서를 보며 스터디한 글입니다.

책에서 주장하는 내용을 정리하였으며 예제들은 모두 코틀린 코드로 변환하여 작성하였습니다.

 

목차

  1. 상태와 데이터
  2. 가변 객체와 불변 객체
  3. 정리

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)  // 데이터 값 변경
반응형