객체지향 프로그래밍 도대체 무엇인가?
객체 지향 프로그래밍을 해라!
라는 이야기를 많이 듣고 대략이나마는 알고 있지만, 정확하게 객체지향 프로그래밍이 무엇을 의미하고 어떻게 구현해야 하는지에 대해 스스로 잘 모르는 것 같아 다시 한번 정리할 겸 글을 써봅니다.
OOP, Object-Oriented Programming
컴퓨터 프로그래밍의 패러다임 중 하나이고, 여러개의 독립된 단위, '객체'들의 모임으로 파악하는 것.
실제 세계도 사물로 이루어져있듯이, 객체지향도 그러한 관점에서 나왔다라는 것은 누구나 다 알고있겠지만, 다시 한번 찬찬히 정리해 보자.
객체 지향 언어의 시초는 1960년대에 나온 '시뮬라67'이며, 이의 가장 중요한 개념은 클래스를 처음으로 도입했다는 것이다. 그 이후로 10년동안 객체지향언어는 전혀 주목을 받지 못했지만, 학문적인 가치로 인정을 받고 있다. 그 외에도 스몰토크나 에이다 등의 객체지향 언어가 있지만, 이를 상세히 알아보는 것은 의미가 없을 듯 하다.
1990년대 초에 많은 발전이 있었으며, C++, 델파이, FoxPro 등의 GUI의 발전과 함께 객체지향 언어가 주를 이루기 시작한다. 개인적으로는 C++는 절차지향에 가깝지 않나 생각했는데, 클래스개념에 중복, 상속, 가상함수, 추상클래스 등의 기능들로 인해 '객체지향'에 속한다고 한다. (물론 C를 기반으로 두고 있기 때문에 객체지향성을 제대로 반영하지 못한다는 비난을 받고 있기도 하다.)
객체 지향 프로그래밍의 기본 구성요소는 세가지다.
클래스와 객체, 메서드. 이렇게 총 3가지의 기본 구성요소.
클래스는 같은 종류의 집단에 속하는 속성과 행위를 정의한 것으로 객체지향의 기본적인 데이터형이다.
객체는 클래스의 인스턴스 (실제로 메모리에 할당된 것)이다. 객체는 자신의 고유 속성을 가지며 클래스에서 정의한 행위를 수행할 수 있다.
메서드는 클래스로부터 생성된 객체를 사용하는 방법으로 객체에 명령을 내리는 메시지라 할 수 있다.
그동안 했던 코드들에는 많은 부분에서 편리함을 위해 어떠한 일을 처리하는 클래스를 만들어놓고 해당 클래스에 메서드들을 쭈욱 나열하고 외부에서 불러다 쓰기도 했는데, 가장 헷갈리고 어려운 부분이 이 부분인 듯 하다.
실제 세계의 사물을 객체라고 본다면, 채팅방의 글을 쓰는 것을 만든다고 할 때, 내 머릿속에 드는 첫번째 생각은,
"글을 쓰는 담당하는 사람(클래스)"를 만들고 "글을 써라", "지워라"라고 명령어를 입력하는 것인데... 또 곰곰하게 생각해보면,
"글(객체)"를 만들고 "글을 써라", "넌 지워져라" 라고 모델에게 명령을 하는 것이 더 옳은 듯 하다.
객체지향언어의 특징을 보면, 자료추상화, 상속, 다형개념, 동적바인딩 등이 있는데, 이는 자료 추상화를 기초로 하여 시스템의 복잡성을 제어하기 위해 맞물려 기능한다.
불필요한 정보는 숨기고 중요한 정보만을 표현하는 것이 '자료추상화' 이 추상자료형을 클래스로 볼 수 있다.
'상속'은 위와 같은 클래스들의 종속관계를 이용해 '객체를 조직화'하는 것에 목적이 있다.
이렇게 구현을 해서 얻는 장점으로는,
- Readability 향상 : 유지보수 용이
- 일관성 유지
- 다른 객체에 영향이 적고, 재사용이 가능
단점으로는,
이렇게 객체를 독립적이고 서로간의 종속성이 낮게 유지되기 위해서는 객체에 대해 정확한 이해가 필요하고 객체가 복잡해 질 수 있다는 것이다. 바로 이게 최대의 문제점이다. 분명 신경써서 구현을 했는데도 불구하고 덩치가 커질수록 관리가 용이하지 않다.
그리고 이 포스팅을 쓰고 난 뒤 꾸준히 '디자인 패턴' 에 대해 공부중에 있습니다. 관심이 있는 분들은 쭈욱 한번 읽어보시면, 좋을 것 같습니다. 패턴이라는 것이 틀이 정해져있는 것이 아니기 때문에 계속되어 반복되는 중요한 내용들을 코딩할 때 항상 머릿속에 지니고 있는 것이 중요한 것 같습니다. (이를테면, 확장에는 열려있되 수정에는 닫혀있어라. 혹은 interface를 통해 구조를 단순화 하는 것 등)
- 프로그래밍 Design Pattern 이해하기 1 : 스트래티지 패턴
- 프로그래밍 Design Pattern 이해하기 2 : 옵저버 패턴
- 프로그래밍 Design Pattern 이해하기 3 : 데코레이터 패턴
- 프로그래밍 Design Pattern 이해하기 4 : 팩토리 패턴
- 프로그래밍 Design Pattern 이해하기 5 : 싱글턴 패턴
- 프로그래밍 Design Pattern 이해하기 6 : 커맨드 패턴
- 프로그래밍 Design Pattern 이해하기 7 : 어댑터 & 파사드 패턴
- 프로그래밍 Design Pattern 이해하기 8 : 템플릿 메소드 패턴
- 프로그래밍 Design Pattern 이해하기 9 : 이터레이터 패턴 & 컴포지트 패턴 <1>