de-vook / The-Essence-of-Object-Orientation

책 <객체지향의 사실과 오해> 그룹 스터디
18 stars 3 forks source link

[namu & July] 책에서 설명하는 상태 타입의 분류 vs Swift #15

Open July911 opened 2 years ago

July911 commented 2 years ago

책에서의 설명

Entity와 참조 객체(Reference object)를 책에서는 식별자를 지닌 객체 값 객체(value object) 는 식별자를 가지지 않는 객체로 설명한다

Swift

그렇다면 우리가 기존에 배운 참조타입인 classclosure 그리고 값 타입인 EnumStructure 를 책에서의 분류대로

로 분류를 해도 괜찮을까요?

Kim-EunsooSilver commented 2 years ago

🤔 여러분들은 식별자를 어떤 개념이라고 생각하시나요? 스터디 이전이라 자신없지만, 제가 이해한 식별자의 개념은 객체를 서로 구별할 수 있는 특정한 객체의 프로퍼티 혹은 메서드라고 이해했습니다....

만약 Swift로 Person Struct 내부에 프로퍼티로 입의 길이, 눈의 수, 코의 수를 구현했다고 예를 들어보아요!! 이 경우라면 줄라이와 나무의 글로 유추하자면 Person Struct는 식별자를 가지지 않는 객체로 수렴이 될거 같은데... .. 혹시 제가 식별자를 잘못 이해한건가요?

줄라이와 나무가 생각하는 식별자가 궁금합니다!!

jsim27 commented 2 years ago

@Kim-EunsooSilver

struct Person {
    var 입의길이: Double
    var 눈의수: Int
    var 코의수: Int
}

여기서 입의 길이, 눈의 수, 코의 수 프로퍼티들을 "객체의 식별자"로 생각한다면

let personA = Person(입의길이: 13.4, 눈의수: 99, 코의수: 0)
let personB = Person(입의길이: 0.4, 눈의수: 1, 코의수: 100)

if personA.입의길이 == personB.입의길이,
   personA.눈의수 == personB.눈의수,
   personA.코의수 == personB.코의수 {
    print("personA와 personB는 동일함")
} else {
    print("personA와 personB는 동일하지 않음")
}

// personA와 personB는 동일하지 않음

이렇게 각 프로퍼티의 값이 각각 다른 경우에는 니콜라스가 생각하신대로 두 객체는 서로 다르고, 고유하다고 생각할 수 있겠지만

let personC = Person(입의길이: 13.4, 눈의수: 99, 코의수: 0)
let personD = Person(입의길이: 13.4, 눈의수: 99, 코의수: 0)

if personC.입의길이 == personD.입의길이,
   personC.눈의수 == personD.눈의수,
   personC.코의수 == personD.코의수 {
    print("personA와 personB는 동일함")
} else {
    print("personA와 personB는 동일하지 않음)
}

// personA와 personB는 동일함

이 경우처럼 어쩌다가 두 Person 객체의 프로퍼티들이 같은 값들을 갖고 있다면, personCpersonD서로 다른 객체임에도 동등하다고 판단될 것입니다. 그렇기에 입의 길이, 눈의 수, 코의 수는 객체의 식별자가 될 수 없는 것이라고 생각했어요.

그래서 예로 드신 Person struct는 식별자가 없는 값 객체라고 생각합니다. 동일성(identical) 비교가 불가능한 것이지요. p.57 하단에 기술된 것 처럼 "상태가 같은지를 통해 판단""동등성(equality)" 비교의 대상인 것 같아요.


그래서 저는 이 "객체의 식별자"라는게

  1. class instance가 갖는 힙 영역의 주소값이거나 (주소값은 고유하니까요)
  2. ObjectIdentifier 처럼 클래스 인스턴스에게 제공되는 고유 식별자 값이라고 생각했습니다.

무엇하나 정확한건 없지만 제 생각을 적어보았어요. 여러분들의 의견을 듣고싶습니다!

yanghojoon commented 2 years ago

책 p/58에서 식별자란 어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티다.라고 명시적으로 표현하고 있어 헷갈리는 것 같아요 😥 값 타입인 EnumStructure도 프로퍼티를 가질 수 있는 만큼 만약 EnumStructure를 값으로 본다면 '식별자는 프로퍼티가 아니지 않을까?' 라고 생각합니다.

EnumStructure는 메모리의 스택 영역에 저장되는 만큼 (enum도 스택 영역에 저장되는 것이 맞나요..?) 힙 영역의 주소값이 식별자가 될 수도 있을 것 같습니다!

gogosilver commented 2 years ago

나무와 이해가 동일하기 때문에 저는 제가 참고한 책의 내용을 조금 첨부해보겠습니다.

식별자란 어떤 객체를 다른 객체와 구분하는 데 사용하는 객체의 프로퍼티다. (중략) 객체는 상태가 변경될 수 있기 때문에 식별자를 이용한 동일성 검사를 통해 두 인스턴스를 비교할 수 있다.

저는 이를 통해 값(상태)를 제외한 프로퍼티(상태를 구성하는 특징) 만이 동일성 검사에 사용된다고 이해해보았습니다.

추가적으로 나무가 언급한 동등성에 대해서는 상태를 이용해 두 값이 같은지 판단할 수 있는 성질이 동등성 이라는 설명이 있으니 이 또한 참고해보면 좋을 것 같습니다!

hayeonhee commented 2 years ago

우선, 저도 식별자가 코드에서 대체 무엇인지 의문을 가지고 있었는데요. 나무가 추정한 식별자의 정체 1) 주소값 인가? 라고 생각을 하다가 2) ObjectIdentifier 를 검색했어요. 그래서 추정컨대, 주소값이 아니라 객체지향 프로그래밍에서 OID : Object Identifier 라는 개념이 따로 있는 것같습니다.

yeahg-dev commented 2 years ago

값은 숫자, 문자열, 날짜, 시간, 금액 등과 같이 변하지 않는 양을 모델링한다. 흔히 값의 상태는 변하지 않기 때문에 불변상태를 가진다고 말한다. (55p) 객체는 시간에 따라 변경되는 상태를 포함하며, 행동을 통해 상태를 변경한다.(56p)

책의 위와 같은 내용을 바탕으로 저는 상태가 불변적이냐, 가변적이냐에 따라 값과 객체를 구분할 수 있다고 생각해봤습니다.

추가적으로 유추해볼 수 있는 점이 값 객체의 프로퍼티 타입은 값만 가능하며, 링크로 설명되는 객체는 없어야한다. 참조 객체의 프로퍼티 타입엔 링크로 설명되는 객체가 하나 이상 반드시 존재해야한다. 로 봤습니다.

따라서 값 객체를 Swift의 값 타입인 구조체나 열거형으로 본다면, 그 안에 클래스타입의 인스턴스를 프로퍼티로 정의 할 수 있습니다. 그렇다면 값 객체를 스위프트의 값 타입에 일대일 대응을 시키는게 어려울 것이라 판단했습니다. 참조 객체 또한 스위프트의 클래스로 생각해본다면 프로퍼티로 값타입'만'가질 수 있어서 대응이 안되는 것이라 생각했습니다.

여러분들의 생각은 어떠신가요?