객체지향에 대하여

Written by kwSeo

#들어가기에 앞서… IT분야를 공부하는 사람으로서 객체지향프로그래밍(Object-Oriented Programming, OOP)을 못들어본 사람은 없을 것입니다. 저 역시 처음 C++과 Java와 같은 객체지향 프로그래밍 언어를 공부하기 시작하면서 객체지향을 접하게 되었습니다. 책뿐만이 아니라 인터넷의 다양한 글에서도 객체지향에 대한 이야기를 들을 수 있습니다. 처음 객체지향을 접할 무렵 굳이 웹 객체지향이라는 방법을 쓰는지 알 수 없었습니다. 지금은 조금 시간이 지나 그때보다 조금은 더 객체지향에 대해 감을 잡은 거 같은데 아직 부족하다고 판단되어 정리를 할 필요를 느끼게 되었습니다.

#객체지향(Object-Oriented)이란? 위키피디아에서는 객체지향프로그래밍을 컴퓨터프로그래밍 패러다임의 하나로 컴퓨터 프로그램의 구성요소를 명령어로 보지 않고 여러개의 독립된 객체(Object)들의 모임으로 파악하고자 하는 것이라고 설명하고 있습니다. 즉, 객체지향프로그래밍이란 프로그램의 구성단위를 객체로 보는 것입니다. 각 객체들은 독립되어있으며 자신의 역할을 가지고 있습니다. 각 객체들은 메시지로 의사소통합니다. 간단히 레고를 예로 들어보면, 레고는 다양한 블록과 착문, 바퀴 등의 여러가지 요소로 이루어져 있습니다. 각 블록들은 독립적이며(같은 모양과 같은 색이 존재할 수 있지만, 그렇다고 해서 같은 것은 아니다) 어떻게 조립하느냐에 따라 헬기가 될 수 도 있고 자동차가 될 수도 있습니다.

#객체지향의 구성요소 ##클래스(Class) 같은 종류의 집단에 속하는 속성과 행위의 집합입니다. 객체지향 프로그래밍의 가장 핵심이자 기본이 되는 요소로 사용자 정의형 데이터라고도 할 수 있습니다. 어찌보면 객체를 생성하기 위한 설계도라고도 할 수 있습니다.

##객체(Object) 정의된 클래스를 바탕으로 생성되는 요소로, 클래스가 ‘개념’이라면 객체는 ‘실체’입니다. 클래스에서 정의된 속성과 행위를 바탕으로 자신만의 특징(값)을 가져 독립된 모습을 형성합니다. 참고로 메모리상에 올라간 객체를 보고 인스턴스(Instance)라고 합니다.

##속성(Attribute) 클래스에서 정의된 객체의 특징을 부여하는 값입니다. 속성의 자신만의 특징이라고 할 수 있으며, 그 객체가 가지고 있는 모습으로 볼 수 있습니다. 사람을 예로 들면, 사람은 이름과 나이, 키, 몸무게 같은 자신을 나타내는 요소를 가지고 있습니다. 이러한 요소는 자신이 가지고 있는 특징이며 이름, 나이, 키, 몸무게는 모든 사람이 가지고 있지만, 그 값은 자신만의 것입니다. 클래스에 정의된 속성을 보고 멤버필드(member field)라고도 합니다.

##메서드(Method) 다른 말로 메시지(Message)라고도 하며, 어떤 클래스가 할 수 있는 행위라고 할 수 있습니다. 다시 사람을 예로들면, 사람은 두손을 자유로이 사용할 수 있고 말을 할 수 있습니다. 이러한 행위들이 클래스에서 정의가 됩니다. 하지만 두손을 자유로이 쓸 수 있다는 행위가 수행하는 일은 특별히 정해져있는 것이 아닙니다. 객체에 따라서 조금씩 다르게, 다른 목적으로 행동할 수도 있습니다. ‘잡다(hold)’라는 메서드가 정의되었다면, 객체는 두손으로 수저를 잡을 수도 있고, 책을 잡을 수도 있습니다. 객체에 따라서 행위자체는 같지만 그 결과가 조금씩 다를 수 있습니다.

#객체지향의 주요 특징 4가지 ##추상화

“추상화는 사물의 공통적 특징, 즉 추상적 특징을 파악해 인식의 대상으로 삼는 행위이다. 추상화가 가능한 개체들은 개체가 소유한 특성의 이름으로 하나의 집합(class)를 이룬다. 그러므로 추상화한다는 것은 여러 개체들을 집합으로 파악한다는 것과 같다. 추상적 특성은 집합을 구성하는 개체들을 ‘일반화’하는 것이므로 집합의 요소돌에 보편적인 것이다.” - 정인상, 채흥석 지금, 자바 객체지향 디자인 패턴

위에서 설명한 내용을 간단하게 말하자면 어떤 개념으로부터 특정 영역에서 필요로하는 속성이나 행동을 추출하는 작업을 말합니다. 어찌보면 추상화는 대상이 되는 개념을 우리가 필요로 하는 부분만을 골라 단순화시키는 것이라 볼 수 있습니다. 학교의 수강신청시스템에서 학생은 학번으로 구분되며 이수학점과 전공 등의 요소들이 존재합니다. 하지만 학생이 어떤 음식을 좋아하는지 키는 얼마인지 머리스타일은 어떤지에 대한 정보는 필요로하지 않습니다. 다른 예로 미용실에서는 손님의 학번, 전공, 이수학점 등을 필요로하지 않습니다. 손님의 머리스타일이 가장 중요합니다. 또한 추상화가 가능한 개체들은 개체가 소유한 특성으로 하나의 집합을 이룰 수 있습니다. 이 집합을 클래스라고 합니다. 아우디와 벤츠라는 차가 존재할때 두 차를 보무 아우러 자동차라고 부를 수 있습니다. 아우디와 벤츠가 자동차로 추상화된 것입니다.

##캡슐화 소프트웨어 공학에는 응집도(cohesion)와 결합도(coupling)라는 개념이 존재합니다. 일반적으로 올바른 소프트웨어는 강한 응집도와 낮은 결합도를 가진다고 합니다. 캠슐화는 강한 응집도와 낮은 결합도를 유지할 수 있도록 해주는 객체지향 설계 원리입니다. 추상화된 개체와 관계있는 속성들과 행동들을 하나로 묶는 것이며, 정의된 개체는 자신과 관련된 속성과 행동(메서드)를 가져야 합니다. 캡슐화는 정보은닉(Information hiding)을 통해 높은 응집도와 낮은 결합도를 갖도록 합니다. 정보은닉이란 말 그대로 알 필요가 없는 정보는 외부에서 집근하지 못하도록 제한하는 것입니다. 자동차를 예로 들면 운전자는 가속 패널을 밟았을 때 내부적으로 어떤 원리에 의해서 속도가 올라가는지 몰라도 운전하는데에는 지장이 없습니다.

##상속 상속은 개체 간에 관계를 나타내는 것으로, 부모클래스의 성질을 자식클래스가 물려받는 것입니다. 즉 클래스 간에 계층이 형성되는 것이죠. 피터 코드(Peter Coad)는 상속의 오용을 막기 위해 상속의 사용을 엄격하게 제한하는 규칙들을 만들었습니다.

##다형성 동물이라는 클래스가 있고 동물 클래스의 하위 클래스로 고양이와 개가 있다고 가정하면, 고양이와 개는 모두 동물이라고 추상화할 수 있으며 두 클래스는 공통적으로 ‘짖다’라는 행위를 가집니다. 하지만 개는 ‘멍멍’하고 잊고 고양이는 ‘야옹’하고 울 것입니다. 둘다 동물이고 짖을 수 있지만 실체로 나타나는 행위자체는 다른 것입니다. 다형성은 이러한 성질을 나타내는 개념으로 같은 동물 내에서도 서로 다르게 짖을 수 있도록 합니다.

Done At: Jul 19,2015
Categories: