본문 바로가기

개발자노트/우아한 테코톡 감상

[10분 테코톡] 웨지의 OOP

OOP : 객체지향 프로그래밍


객체지향 프로그래밍이란?
1. 프로그래밍 개발방법론 = 프로그래밍은 이렇게 개발해야한다.
2. 사람이 현실을 바라보는 방법을 개발에 접목
- 직관적으로 이해하기 쉽다.
- 유지 보수를 용이하게 만든다.


키워드로 알아보는 객체지향
1. 객체란?
- 객체는 현실의 무언가에 대응하는 개념이다.
- class 는 객체를 표현하는 하나의 수단이다. ( class !=객체 )
- 객체지향도 현실을 기반으로 작성되기 때문에 이해하기 쉽다고 생각한다.

- 다른 객체와 협력(Collaboration) 하는 역할(role)을 맡고 있는 대상
- 역할(role)을 맡으면 임무를 수행할 책임(responsbility) 이 생긴다.
- 책임을 다하기 위한 데이터와 프로세스를 가지고 있다.

-> 협력 : 시스템 목표를 달성하기 위해 여러 객체가 참여하여 행동하는 것
           ex) 치킨을 튀겨서 손님에게 배달해야 한다.

-> 책임 : 협력 속에서 본인이 수행해야 할 임무의 내용을 알고, 수행하는 것
            아는것도 책임이고, 수행하는 것도 책임
            ex) 치킨을 튀길 객체는 치킨을 맛있게 조리할 책임을 갖는다.

-> 역할 : 동일한 목적을 가진 책임의 묶음
             ex) 치킨을 조리할 책임을 가지는 역할은 요리사이다.


==> - "협력" 이란 문제 상황을 해결하기 위해 여러 객체가 참여하여 행동하는 것이다
        - "역할"을 맡으면 임무를 수행할 "책임"이 생긴다.

        - 치킨을 손님하게 배달하기 라는 "협력"을 완수하기 위해,
           "치킨 가게 객체" 는 치킨을 튀기는 "책임(역할)"을 수행하고
          "배달원 객체"는 손님에게 치킨을 전달하는 "책임(역할)"을 수행한다.



메세지
- 객체는 "메세지"를 통해 다른 객체에 "책임"을 다하라고 요구한다.
- 메세지를 보내는 객체는 "무엇을" 할지만 요구하고, "어떻게" 하는지는 신경쓰지 않아도 된다.
- 객체는 "책임"을 수행하라고 요구받지만, 어떻게 처리할 지는 "자율"에 맡긴다.
// 자바에선 메소드를 호출함으로써 메세지를 보낸다.
class ChickenShop{
public void cookChicken(){ // 메소드 이름과 리턴 타입은 메세지를 표현한다.
         ...  // 치킨을 요리하라는 메세지를 받아 요리를 시작한다.
             // 나는 나만의 요리를 해
   }
public void deliverChicken(){
          ...  // 치킨을 다른 객체에게 전달한다
   }
}



자율성 (의인화)
✔객체지향과 현실세계의 차이점
- 현실 세계의 치킨 가게는 건물에 불과하다
- 객체지향 세계의 치킨 가게는 스스로 치킨을 튀기고, 치킨을 건네어 준다.
✔ 즉, 객체지향에선 객체가 자율적으로, 능동적으로 행동할 수 있다고 "의인화" 되어야한다.
✔ 자율적으로 메세지를 처리하기 위해서 자신의 책임을 수행하는 데 필요한 데이터와 프로세스를 가지고 있다.
class ChickenShop{
public void cookChicken(){ // 메소드 이름과 리턴 타입은 메세지를 표현한다.
         ...  // 스스로 치킨을 튀긴다.
   }
public void deliverChicken(){
          ...  // 치킨을 다른 객체에게 전달한다
   }
}



다형성
✔ 다형성을 활용하는 목적은 서로 다른 유형의 객체가 동일한 메세지에 대해 다르게 반응하게 하기 위해서이다.
✔ 동일한 메세지를 처리한다 == 같은 역할을 수행한다.
✔ 다르게 반응한다 == 메세지 처리 방법은 자율적이다.
class ElectricChickenShop extends ChickenShop{
public void cookChicken(){ // 메소드 이름과 리턴 타입은 메세지를 표현한다.
         ...  // 똑같이 치킨을 요리하지만 어떤 치킨을 튀길지는 자율이다.
   }
public chicken getChicken(){
          ...  // 전기구이 통닭을 리턴한다.
   }
}


세줄 정리
1. 객체는 현실의 개념을 추상화한 것이다.
2. 객체들은 서로 협력하고, 역할을 맡아 책임을 수행하며 문제상황을 해결한다.
3. 하지만 현실의 사물과 달리 객체는 능동적이고 자율적인 존재이다.


 

객체지향적으로 설계해보기


빠지기 쉬운 함정
- 현실 세계를 반영하기 위한 설계를 시작하면 자칫 데이터 중심 설계를 하기 쉽다.
-> 치킨집은 요리사,전화기를 가지고 있어야해. 배달원은 배달 도착지, 치킨 ,받아야 할 돈을 가지고 있어야하고...

데이터 중심 설계의 문제점
1. getter, setter가 과도하게 추가되어 결합도가 높아진다. ( 서로 알고 있는 객체가 많아진다.)
- 하나의 변경이 일어났을 때 다수의 변경이 일어나 유지보수성이 떨어진다.

2. 데이터를 처리하는 작업과 데이터가 분리되어 응집도가 낮아진다.( 여러가지 이유로 변경되어야 한다.)


✔ 책임 주도 개발
1. 시스템이 사용자에게 제공해야 하는 기능인 시스템 책임을 파악한다.
-> 치킨 주문을 받아 손님에게 배달해야한다.


2. 시스템 책임을 더 작은 책임으로 분할한다.
-> 메세지를 생성한다.
    - 치킨 주문을 받는다.
    - 치킨을 요리한다.
    - 치킨을 손님에게 배달한다


3. 분할된 책임을 수행할 수 있는 적절한 객체 또는 역할을 찾아 책임을 할당한다.
치킨 주문을 받아라 -> [ 치킨 가게 ]


4. 객체가 책임을 수행하는 도중 다른 객체의 도움이 필요한 경우 이를 책임질 적절한 객체 또는 역할을 찾는다.
[치킨가게] -> 치킨을 요리하라 ->[ 요리사 ] -> 치킨을 배달하라 -> [ 배달원 ]

5. 해당 객체 또는 역할에게 책임을 할당함으로써 두 객체가 협력하게 한다.
치킨 주문을 받아라 -> [ 치킨 가게 ] -> [ 요리사 ]

 

 

 

자료 : https://www.youtube.com/watch?v=3etKkkna-f0