본문 바로가기
프로그래밍/디자인패턴

객체지향(Object-Oriented Programming, OOP)에 대해서

by bantomak 2023. 11. 14.

객체지향의 기초

추상화(Abstraction)

  • 불필요한 부분을 생략하고 객체의 속성 중 가장 중요한 것만 중점을 두어 개략하는 것(== 모델화)

캡슐화(Encapsulation)

  • 다른 객체에게 자신의 정보를 숨기고 자신의 연산만을 통해 접근을 허용하는 것
    • 각 객체의 수정이 다른 객체에게 주는 영향을 최소화하는 기술
  • 데이터(속성)와 데이터를 처리하는 함수를 하나로 묶는 것
  • 정보은닉, 재사용이 용이

다형성(Polymorphism)

  • 메시지에 의해 객체(클래스)가 연산을 수행할게 될 때 하나의 메시지에 대해 각 객체(클래스)가 가지고 있는 고유한 방법(특성)으로 응답할 수 있는 능력

 

객체지향 원칙

  1. 바뀌는 부분은 캡슐화한다.
  2. 상속보다는 구성을 활용한다.
  3. 구현이 아닌 인터페이스에 맞춰 프로그래밍을 한다.

 

객체지향 창시자, 앨런 케이가 생각했던 객체 지향의 본질

“OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.” - Alan Kay

 

2003년에 앨런 케이가 한 말이다.

 

풀어서 설명해보면, 앨런 케이가 생각하는 OOP의 본질은

  1. 메시징
  2. 캡슐화
  3. 동적 바인딩

 

메시징, 캡슐화, 동적 바인딩이 합쳐질 때

앨런 케이는 소프트웨어를 정리하고 싶었다.

앨런 케이식 소프트웨어 정리법의 핵심은 3가지로 정리할 수 있다.

 

  • 관련이 있는 데이터와 프로시져를 찾아서 묶고 다른 객체가 내부를 건드리지 못하게 한다. (캡슐화)
  • 다른 객체의 데이터나 프로시져가 필요할 때는 메시지로 요청한다. 메시지를 받는 객체는 스스로 처리 방법을 선택한다. (메시징)
  • 메시지를 받는 객체는 그때 그때 달라질 수 있다. (동적 바인딩)

이 3가지가 합쳐지면 이런 효과가 나타난다.

 

1) 변경가능한 공유 데이터가 최소로 줄어든다.

  • 관련 있는 프로시져와 데이터를 묶은 다음, 다른 객체는 접근할 수 없게 하기 때문이다.
  • 다른 객체의 상태를 알아내거나 바꾸려면 해당 객체가 정해놓은 형식으로 메시지를 보내는 방식 밖에 없다.
  • 이걸 '캡슐화'라고 한다.

2) How (구현) 부분을 쉽게 바꿀 수 있다.

  • '메시지'를 받는 부분만 일관되게 유지한다면, 실제로 그걸 처리하는 코드는 바뀌어도 실행에 문제가 없다.
  • '메시지를 보내는 것'은 메서드(함수)를 호출하는 것과 다르다.
  • 다른 객체가 돈을 달라는 메시지를 보내면, 지갑에서 돈을 꺼내주든, 옆에 있는 친구한테 돈을 빌리든, 스마트폰으로 이체를 해주든 받는 객체가 알아서 결정한다.(자율성)

3) 메세지를 실제로 처리하는 객체를 쉽게 바꿀 수 있다.

  • 기능의 변경이 쉬워진다.
  • 메시지를 보내는 코드는 컴파일 타임에 이미 결정되지만, 실제로 어떤 객체가 그 메세지를 받아서 처리할지는 런타임에 결정된다. 이걸 '동적 바인딩'이라고 한다.
  • 비유하자면, 동적 바인딩은 다용도 드라이버 같은 느낌이다. 손잡이와 드라이버의 연결 부분을 통일해 준다. 그다음 여러 개의 드라이버를 만들어둔다. 새로운 드라이버를 구하지 않아도 그때 작업 중에 바꿔 끼워가면서 '다용도'로 사용이 가능하다.

 

앨런 케이가 생각한 본질이 '아닌' 것

앨런 케이는 후에 '객체 지향 프로그래밍'이라는 이름을 잘 못 지은 거 같다면서 유감을 표현했다.

 

“I’m sorry that I long ago coined the term “objects” for this topic because it gets many people to focus on the lesser idea. The big idea is messaging.” -Alan Kay

 

'객체 지향'이라는 말을 쓰다 보니, 너무 객체나 클래스에 초점이 가게 된다.

OOP의 본질을 흐리는 것 같다. 객체 지향의 진짜 핵심은 '메시징'이다.라고 직접 말했다.

 

중요한건 메시지다.

 

우리는 객체 지향을 처음 배울 때 수많은 개념의 홍수를 맞닥뜨린다.

클래스, 상속, 다형성, 합성, 정적 타입, 응징도, 의존성, 결합도, SOLID.... 등등

 

앨런 케이 이후에 객체 지향의 이론과 방법론은 오랫동안 발전되고 축적되어 왔다.

 

실제로 객체 지향을 가장 대중화시킨 것은 앨런 케이의 스몰톡이 아닌, C++과 JAVA였고 많은 개발자들이 C++, JAVA를 배우면서 객체 지향을 배우게 된다.

 

C++, JAVA의 핵심 아이디어는 클래스와 상속이기 때문에 많은 교과서와 아티클들이 객체 지향하면 클래스와 상속부터 언급하는 것이 아닐까? 하지만 그건 객체 지향의 '필수 조건'이 아니다.

(Javascript에는 클래스가 없지만, 객체지 향을 구현할 수 있는 이유)

 

  • 메시징
  • 캡슐화
  • 동적 바인딩

객체 지향을 처음 이해할 때 나에게 도움이 됐던 것은 앨런 케이가 말한 객체 지향의 본질이었다.

 

본질에 대해서 생각하고 이해하고 나자. 그동안 들었던 수수께끼 같은 말의 뜻이 머리에 들어오기 시작했다.

아, 객체를 만들었다고 다가 아니라, 객체들이 어떻게 '협력'해서 전체를 이루는지가 더 중요하구나.
오... 결국 메시지를 누구한테 위임할지 결정해 주는 게 타입 계층이구나.
객체에서 메시지를 수신하는 부분만 따로 떼어내서 정의한 게 인터페이스라고 하는 거군.
그때그때 동적 바인딩을 해야 하니까, 객체의 생성과 사용을 분리하라는 거였네.
아, 객체를 묶고 이름을 지을 때 최대한 실제 세계와 비슷하게 만들면 더 이해하기 쉽겠네.
그래서 '도메인'이라는 말이 많이 나오는 거구나.

 

요약정리

  • 1960년대에는 행동(프로시져)를 기준으로 코드를 정리했다.
  • 이런 정리 방식은 변경하기가 어렵고, 많은 버그를 유발했다.
  • 앨런 케이는 세포와 컴퓨터 네트워크에서 영감을 받아 객체 지향의 아이디어를 생각해 냈다.
  • 자기 데이터를 숨긴 독립된 객체들이, 메시지 소통을 통해서 소프트웨어를 구성하는 방식이었다.
  • 앨런 케이는 객체 지향 프로그래밍의 본질이 메시징, 캡슐화, 동적 바인딩이라고 생각했다.
  • 이 3가지 키워드를 가지고 객체 지향을 이해하면 훨씬 이해가 쉽다.

 

출처

 

창시자 앨런 케이가 말하는, 객체 지향 프로그래밍의 본질

앨런 케이는 '객체 지향 프로그래밍'이라는 네이밍을 잘못 지었다고 인정했다.

velog.io

'프로그래밍 > 디자인패턴' 카테고리의 다른 글

프로토타입(Prototype) 패턴  (1) 2024.04.30
빌더(Builder) 패턴  (1) 2024.04.24
추상 팩토리(Abstract Factory) 패턴  (1) 2024.04.24
팩토리 메서드(Factory Method) 패턴  (0) 2024.04.23
OOP의 기초  (1) 2024.04.19

댓글