02. 이상한 나라의 객체

2024. 10. 20. 16:02·개발서적/객체지향 사실과 오해

02. 이상한 나라의 객체

리뷰기간: 2024년 10월 14일 → 2024년 10월 20일
태그: 1회독, 작성완료

✨ 내용 요약

  • 객객체지향 패러다임의 목적
    • 현실세계를 모방하는것이 아니라 현실 세계를 기반으로 새로운 세계를 창조
  • 상태 와 행동은 상호 의존적이다
    • 상태를 알아야 행동을 할 수 있음
    • 행동의 결과는 상태에 따라 달라짐
  • 서로 다른 객체가 협력을 하기 위해서는 연결(링크) 되어 있어야 함
  • 객체의 상태
    • 프로퍼티(property) : 변경되지 않는 고정되어 있는것 ⇒ 정적(Static)
      • 단순한 값인 속성과 다른 객체를 가리키는 링크의 조합으로 표현
      • 키, 음료의 양, 위치
    • 프로퍼티 값 (property value) : 변경될수 있는 “값” ⇒ 동적(Dynamic)
      • 175cm, 50ml, 대한민국
  • 캡슐화의 개념
    • 자신의 상태를 스스로 관리하는 자율적인 객체
    • 객체는 상태를 캡슐안에 감춰둔 채 외부로 노출하지 않음
    • 객체의 행동을 유발하는 것은 외부로부터 전달된 메시지 이지만, 상태를 변경할지 여부는 객체 스스로 결정
  • 객체와 값의 차이
    • 객체 : 고유 식별자를 이용해 동등함 판별
      • 객체의 상태가 달라도 식별자가 같으면 동등
    • 값 : 상태를 이용해 동등함 판별
      • 식별자가 다르더라도 상태가 같으면 동등
  • 블랙박스의 개념
    • 조회를 의미하는 “쿼리”
    • 행동을 지시하는 “명령”
    • 명령을 할때 쿼리를 바로 보여주지 않아야함, 각각 독립적으로 존재
  • 상태를 먼저 결정하고 행동을 나중에 결정하면 안된다
    • 상태를 먼저 결정할 경우 캡슐화 저해
    • 객체를 협력자가 아닌 고립된 섬으로 만듦
    • 객체의 재사용성 저하

📝 감상 및 리뷰

  • 이상한 나라의 앨리스의 이야기로 객체의 특성 ( 상태, 행동, 책임, 상태와 행동의 의존성, 링크 등등을 설명하여 이해가 잘됨 )
  • 상태와 행동은 상호 의존적임을 알게됨
  • 사이드이펙트(Side Effect) 라는 단어를 알게모르게 쓰고있었지만 정확이 어떤뜻인지는 몰랐는데 이번 장을 읽으며 어떤 현상인지 알게됨

🛠️ 실무/프로젝트 적용

  • 캡슐화 + 블랙박스 공부

      class Calcurator {
          private var first: Double = 0
          private var second: Double = 0
    
          private var number: Double = 0
    
          func add(_ first: Double, _ second: Double) {
              self.first = first
              self.second = second
    
              self.number = first + second
          }
    
          func queryNumber() -> Double {
              return self.number
          }
      }
    
      let calcurator = Calcurator()
    
      print(calcurator.queryNumber()) // 0.0
      calcurator.add(1, 2)
      print(calcurator.queryNumber()) // 3.0

    ⇒ first, second, number 는 외부에 노출될 수 없음

    ⇒ add 함수를 이용해 (요청) 행동 요청 → 행동 요청의 결과를 바로 볼 수 없음

    ⇒ queryNumber 함수를 통해서만 number의 상태 를 조회 할 수 있음

  • 객체와 값의 비교

      class Calcurator {
          private var number: Double = 0
    
          func queryNumber() -> Double {
              return self.number
          }
      }
    
      let calcurator = Calcurator()
      let calcurator2 = Calcurator()
    
      print(calcurator === calcurator2) 
      // false => "식별자"가 다름
    
      print(calcurator.queryNumber() == calcurator2.queryNumber())
      // true => "식별자"가 다르지만 "상태"가 같음
    

실무에서 적용된 예시

CustomPopup을 띄우기 위해 하기 코드를 작성 한 경험이 있음

// customPopup띄우는 한 객체의 일부 코드
class PopupView {
// ... BlackBox

func showPopupSingleButton(on view: UIView, message: String, confirmAction: @escaping () -> Void = { return }) {
        if singleButtonPopup == nil {
            singleButtonPopup = SingleButtonPopupView(frame: .zero)
        }

        singleButtonPopup?.messageLabelSetting(message: message)
        singleButtonPopup?.show(on: view)
        singleButtonPopup?.confirmAction = confirmAction
    }

  // ... BlackBox
}



// 사용하는 쪽
class MainViewController {
// ... BlackBox

PopupView.showPopupSingleButton(on: self?.view ?? UIView(), message: "다시 시도해 주세요.")

// ...BlackBox

}
  • MainViewController 는 함수(메세지)를 통해 popupView객체에게 “다시 시도해 주세요.” 라는 행동을 요청함
  • showPopupSingleButton() 함수는 메세지를 수신한 후 상태를 결정(팝업을 띄움) 함
  • 위의 과정에서 MainViewController는 “다시 시도해 주세요.” 문구의 팝업을 띄워줘 라고 요청을 한 후, 그에 대한 결과(상태)에 대해 관여를 하지 않음 PopupView는 요청메세지를 수신한 후 내부에서 자율적으로 자신의 상태를 변경하고 요청에 대한 상태를 결정함

🔍 추가 자료

  • 함수에서 리턴값으로 변경된 “상태”를 바로 읽어드리는 것은 올바른 객체지향적 설계가 아닌것인가?
  • RDD(책임-주도 설계_Responsibility-Driven Design)
'개발서적/객체지향 사실과 오해' 카테고리의 다른 글
  • 04. 역할, 책임, 협력
  • 03. 타입과 추상화
  • 01. 협력하는 객체들의 공동체
Jeohong
Jeohong
기억 보단 기록을
  • Jeohong
    Chikong Devlog
    Jeohong
  • 전체
    오늘
    어제
    • 분류 전체보기 (186)
      • ---- 개발 컨텐츠 ---- (0)
      • iOS (30)
        • Swift 문법 (1)
        • iOS 개념 (12)
        • HIG (5)
        • SwiftUI (7)
        • UIKit (4)
      • Side Project (0)
      • 개발서적 (4)
        • 객체지향 사실과 오해 (4)
      • 알고리즘 (74)
        • 자료구조 개념 (2)
        • Swift (25)
        • JavaScript (47)
      • ---- 회고 계획 컨텐츠 ---- (0)
      • 계획 및 일기 (10)
      • 회고록 (1)
      • 컨퍼런스 탐방 (1)
      • 미드로 영린이 탈출하기 (1)
      • ---- Previous content ---- (0)
      • Frontend (2)
        • HTML & CSS (2)
      • KITRI 수업 (17)
        • 리눅스 (14)
        • 네트워크 (2)
      • 42seoul (17)
        • Bonr2code (9)
        • 넋두리 (7)
        • 멘토특강 (1)
      • 해킹 실습 (20)
        • 해커스쿨 - F.T.Z (19)
        • WebGoat (1)
      • Tensorflow로 시작하는 NLP (1)
        • 예제 (1)
      • 자연어처리 입문 (1)
        • 이론 (1)
      • 텐서플로로 배우는 딥러닝 (7)
        • 이론 (2)
        • 예제 (5)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    자료구조
    1서클
    본과정
    개발자
    코딩
    SwiftUI
    스위프트
    Algorithm
    42서울
    boj
    네트워크
    42seoul
    swift
    IOS
    javascript
    hig
    알고리즘
    라피신
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Jeohong
02. 이상한 나라의 객체
상단으로

티스토리툴바