티스토리 뷰
728x90
객체지향 개념의 오해
객체 지향의 기존 의미와 오해
객체 지향이란 실세계를 직접적이고 직관적으로 모델링할 수 있는 패러다임
- 실세계 모방이라는 개념은 실용적인 관점에서 적합하지 않음.
- 객체에 직접 대응되는 실세계의 사물을 발견할 확률이 적으며 실제로 있더라도 유사성이 적음
- ex) 방화벽 (실세 - 화재 막는 벽, 소프트웨어 - 네트워크 침입 방어)
객체지향 프로그래밍의 진정한 목적
단순히 실세계를 소프트웨어 안으로 옮기는것이 아닌 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것
객체지향이 실세계 모방이라는 개념이 계속 사용되는 이유
객체 지향의 다양한 측면을 이해하고 학습하는데 효과적
- 생명체 스스로 생각하고 결정: 캡슐화, 자율성
- 사람들이 약속과 계약을 기반으로 협력: 메시지
- 공동의 목표를 달성하기 위한 각자의 노력: 협력
커피 주문을 통한 객체지향의 이해
요청(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가지 덕목
- 객체는 충분히 ‘협력적’이어야 함.
- 객체는 다른 객체의 요청에 응답만 할 뿐 수동적이지 않아야함.
- 어떤 방식으로 처리하고 응답할지는 스스로 판단하고 결정함.
- 객체가 충분히 ‘자율적’이어야 함.
- 자신의 행동(처리)를 스스로 결정하고 책임지는 존재를 의미
상태와 행동을 지니 자율적인 객체
- 객체 = 상태 + 행동
- 협력에 참여하기 위해 어떤 행동을 해야한다면 행동하는데 필요한 상태도 함께 가지고 있어야함
- 바리스타가 커피 제조시(행동) 커피 제조방법(상태)을 알고있어야함.
- 자율적인 객체는 객체의 내부와 외부를 명확하게 구분해야함.
- 사적인 부분은 스스로 관리하고 외부에서 접근하지 못하도록 차단해야함.
- 특정 객체는 다른 객체가 무엇을 수행하는지 알지만 어떻게 수행하는지는 알수없음
협력과 메시지
- 인간은 타인에게 도움을 요청하기 위해 다양한 방법을 사용(말, 글, 도구 등..)
- 객체지향에서는 메시지라는 한가지 의사소통 수단만 존재
- 협력은 메시지를 전송하는 객체와 수신하는 객체들의 관계로 구성됨
메시지와 메서드
- 객체가 수신된 메시지를 처리하는 방법을 메서드(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() 호출
}
}
객체 지향의 본질
- 객체지향이란 시스템을 상호작용하는 자율적인 객체들의 공동체로 바라보고 객체를 이용해 시스템을 분할하는 방법
- 자율적인 객체란 상태와 행위를 함께 지니며 스스로 자기 자신을 책임지는 객체를 의미
- 객체는 시스템의 행위를 구현하기 위해 다른 객체와 협력한다. 각 객체는 협력 내에서 정해진 역할을 수행하며 역할은 관련된 책임의 집합
- 객체는 다른 객체와 협력하기 위해 메시지를 전송하고, 메시지를 수신한 객체는 메시지를 처리하는데 적합한 메서드를 자율적으로 선택함
객체를 지향하라
- 코드를 담는 클래스의 관점에서 메시지를 주고받는 객체의 관점으로 사고의 중심을 전환해야함.
- 어떤 객체들이 어떤 메시지를 주고받으며 협력하는가가 중요함.
- 클래스는 객체들의 협력 관계를 코드로 옮기는 도구에 불과함.
객체의 역할, 책임, 협력에 집중하라!!
728x90
'독서 > 객체지향의 사실과 오해' 카테고리의 다른 글
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 |
댓글