티스토리 뷰

객체지향 개념의 오해

객체 지향의 기존 의미와 오해

객체 지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임

  • 실세계 모방이라는 개념은 실용적인 관점에서 적합하지 않음.
  • 객체에 직접 대응되는 실세계의 사물을 발견할 확률이 적으며 실제로 있더라도 유사성이 적음
    • ex) 방화벽 (실세 - 화재 막는 벽, 소프트웨어 - 네트워크 침입 방어)

객체지향 프로그래밍의 진정한 목적

단순히 실세계를 소프트웨어 안으로 옮기는것이 아닌 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것

객체지향이 실세계 모방이라는 개념이 계속 사용되는 이유

객체 지향의 다양한 측면을 이해하고 학습하는데 효과적

  • 생명체 스스로 생각하고 결정: 캡슐화, 자율성
  • 사람들이 약속과 계약을 기반으로 협력: 메시지
  • 공동의 목표를 달성하기 위한 각자의 노력: 협력

커피 주문을 통한 객체지향의 이해

https://kr.123rf.com/photo_53573767_%EC%9D%B4%EC%95%BC%EA%B8%B0%EC%99%80-%EC%9E%90%EC%8B%A0%EC%9D%98-%EC%BB%A4%ED%94%BC-%EC%A3%BC%EB%AC%B8%EC%9D%84-%EA%B8%B0%EB%8B%A4%EB%A6%AC%EA%B3%A0-%EC%97%AC%EC%84%B1%EA%B3%BC-%ED%98%84%EB%8C%80-%EC%BB%A4%ED%94%BC-%EC%88%8D-%EB%82%98%EB%AC%B4-%EC%B9%B4%EC%9A%B4%ED%84%B0%EC%97%90%EC%84%9C-%EA%B8%B0%EB%8B%A4%EB%A6%AC%EA%B3%A0%EC%9E%88%EB%8A%94.html

요청(Reqeust)

사람들은 스스로 해결하지 못하는 문제와 마주치면 필요한 지식을 알고있는 사람에게 도움을 요청함.

  • 커피 주문이라는 협력은 손님이 캐시어에게 커피를 주문(요청)하면서 시작됨.
  • 캐시어는 주문을 받아 바리스타에게 커피를 제조할 것을 요청함.

응답(Response)

요청을 받은 사람은 주어진 책임을 다하면서 필요한 지식이나 서비스를 제공한다.

  • 바리스타는 커피를 제조한 후 제조가 완료됐음을 캐시어에게 응답
  • 캐시어는 진동벨을 울려 손님에게 커피 준비 됐음을 알림(응답)

역할과 책임

  • 역할: 어떤 협력에 참여하는 특정한 사람이 협력 안에서 차지하는 책임이나 의무를 의미
  • 책임: 역할이라는 단어는 의미적으로 책임이라는 개념 내포

ex) 선생님(역할)은 학생을 가르쳐야 함(책임)

특정한 역할은 특정한 책임을 암시함.

역할과 책임의 특징

  • 여러 사람이 동일한 역할을 수행 가능
    • 손님입장에서 주문한 커피를 마실수 만 있으면 어떤 캐시어가 주문을 받던지 중요하지 않음
    • 캐시어 입장에서 바리스타가 누구인지 상관없이 커피만 제조하면 됨
  • 역할은 대체 가능성을 의미함
    • 손님 입장에서 캐셔가 두명이상 일 경우 그중 어떠한 캐셔가 주문을 받아도 상관없음
  • 책임을 수행하는 방법은 자율적으로 선택 가능 (다형성)
    • 캐셔는 주문을 기억해도 되고 메모에 적어도됨
    • 바리스타는 각자 고유의 방식으로 커피를 제조할 수 있음 (커피만 제조하면 됨)
  • 한 사람이 동시에 여러 역할을 수행 가능
    • 한사람이 캐셔와 바리스타 역할을 동시에 수행 가능함.

역할, 책임, 협력

커피 주문과 객체 지향 이해의 관계

  • 위의 커피 주문 과정은 객체지향의 핵심적인 개념
  • 사람 → 객체, 요청 → 메시지, 요청 처리 방법 → 메서드로 바꿔서 이해 가능
  • 위와같은 이유로 실세계의 모방이라는 예시를 들곤함.

어떤 객체도 섬이 아니다

  • 객체는 주어진 역할과 책임을 다하는 동시에 시스템의 더 큰 목적을 이루기 위해 다른 객체와 적극적인 협력을 함
  • 시스템은 역할과 책임을 수행하는 객체로 분할되고 객체간의 연쇄적인 요청/응답의 흐름으로 구성된 협력으로 구현됨

객체의 역할과 특징

  • 여러 객체가 동일한 역할을 수행 할 수 있다.
interface Shape {
    void draw();
}

class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("원을 그립니다.");
    }
}

class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("사각형을 그립니다.");
    }
}
  • 역할은 대체 가능성을 의미한다.
class Drawing {
    void drawShape(Shape shape) {
				// Shape는 Circle, Square중 하나로 대체될 수 있음
        shape.draw();
    }
}
  • 각 객체는 책임을 수행하는 방법을 자율적으로 선택 가능함.
interface Sound {
    void makeSound();
}

class Dog implements Sound {
    @Override
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

class Cat implements Sound {
    @Override
    public void makeSound() {
        System.out.println("야옹!");
    }
}
  • 하나의 객체가 동시에 여러 역할을 수행할 수 있다
class FlyingBird implements Sound, Shape {
    @Override
    public void makeSound() {
        System.out.println("좋은 날씨네요!");
    }

    @Override
    public void draw() {
        System.out.println("하늘을 날아다니는 새를 그립니다.");
    }
}

객체가 갖춰야 할 2가지 덕목

  1. 객체는 충분히 ‘협력적’이어야 함.
    • 객체는 다른 객체의 요청에 응답만 할 뿐 수동적이지 않아야함.
    • 어떤 방식으로 처리하고 응답할지는 스스로 판단하고 결정함.
  2. 객체가 충분히 ‘자율적’이어야 함.
    • 자신의 행동(처리)를 스스로 결정하고 책임지는 존재를 의미

상태와 행동을 지니 자율적인 객체

  • 객체 = 상태 + 행동
  • 협력에 참여하기 위해 어떤 행동을 해야한다면 행동하는데 필요한 상태도 함께 가지고 있어야함
    • 바리스타가 커피 제조시(행동) 커피 제조방법(상태)을 알고있어야함.
  • 자율적인 객체는 객체의 내부와 외부를 명확하게 구분해야함.
    • 사적인 부분은 스스로 관리하고 외부에서 접근하지 못하도록 차단해야함.
    • 특정 객체는 다른 객체가 무엇을 수행하는지 알지만 어떻게 수행하는지는 알수없음

협력과 메시지

  • 인간은 타인에게 도움을 요청하기 위해 다양한 방법을 사용(말, 글, 도구 등..)
  • 객체지향에서는 메시지라는 한가지 의사소통 수단만 존재
  • 협력은 메시지를 전송하는 객체와 수신하는 객체들의 관계로 구성됨

메시지와 메서드

  • 객체가 수신된 메시지를 처리하는 방법을 메서드(method)라고 부름
  • 메시지는 객체 간 통신을 위해 사용되는 요청이나 명령을, 메서드는 객체가 메시지에 응답하기 위해 실행하는 코드 블록을 의미함.
  • 메시지를 수신할 객체가 실행 시간에 메서드를 선택할 수 있다는점은 객체지향 프로그래밍 언어의 핵심적 특징 중 하나
  • 외부의 요청이 무엇인지 표현하는 메시지와 요청을 처리하기 위한 구체적인 방법인 메서드를 분리하는것이 자율성을 높이는 핵심 메커니즘 (캡슐화)
// 상위 클래스 정의
class Animal {
    void makeSound() {
        System.out.println("Some generic sound");
    }
}

// 하위 클래스들 정의
class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Bark!");
    }
}

class Cat extends Animal {
    @Override
    void makeSound() {
        System.out.println("Meow!");
    }
}

public class Main {
    public static void main(String[] args) {
        // 다형성을 통한 객체 생성
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        // 실행 시간에 실제 객체의 타입에 따라 makeSound 메서드가 동적으로 선택되어 호출
        myDog.makeSound();  // "Bark!" - Dog 클래스의 makeSound() 호출
        myCat.makeSound();  // "Meow!" - Cat 클래스의 makeSound() 호출
    }
}

객체 지향의 본질

  • 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법
  • 자율적인 객체상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미
  • 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합
  • 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택

객체를 지향하라

  • 코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환해야함.
  • 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가가 중요함.
  • 클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과함.
객체의 역할, 책임, 협력에 집중하라!!

'독서 > 객체지향의 사실과 오해' 카테고리의 다른 글

chapter6. 객체지도  (1) 2023.12.22
chapter5. 책임과 메시지  (1) 2023.12.22
chapter4. 역할, 책임, 협력  (1) 2023.12.22
chapter3. 타입과 추상화  (0) 2023.12.22
chapter2. 이상한 나라의 객체  (0) 2023.12.22
댓글