본문 바로가기

Programming/OOP

OOP(Object Oriented Programming) _객체지향프로그래밍

Version_1

소프트웨어를 분석, 설계하고 구현하는 방법중의 하나로써 기존의 프로그램들이 데이터를 처리하는 절차에 중심을 두었다면
OOP는 데이터를 중심으로 하고, 그 처리절차는 부수적으로 취급하는 개념이다.
비유하자면 동사(procedure)보다는 명사(data)에 중심을 두겠다는 프로그래밍기법이다.

명사란 무얼 말하는 건가?
객체지향프로그래밍에 있어서 가장 작은 단위는 Object(객체)이다.
명사란 이 Object를 말한다.

객체지향식 개발 과정에 있어서 제일 먼저 해야할 일은 문제영역(개발에 있어서 목적에 따르는 범위)안의 객체를 찾는 일이다. 객체지향 개발 방법은 객체(Object), 객체의 속성(attribute)과 동작(behavior), 유사한 객체의 집합으로 나누어진 클래스(class), 객체 사이의 관계(relationship) 등을 기본 개념으로 하고 있다. 이는 현실인 실세계를 처리중심이 아닌 사물(객체)중심으로 보는 관점에서 바탕을 둔 것이다.

프로그램상에서 각 객체는 필요로 하는 데이터와 그 데이터 위에 수행되는 함수(절차, 동작, 혹은 method)들을 가진 작은 소프트웨어 모듈이다. 그러므로 각 객체는 데이터(java : Field)와 함수(java : Method)의 두 가지로 구성되는데 데이터는 그 객체의 상태(State = attribute+behavior)를 저장하는데 사용이 되며, 함수는 그 객체가 수행할 수 있는 기능을 정의한다.

객체지향 프로그램에는 객체만이 존재하며 객체간에 메시지 교환을 통하여 정보 교류를 하게 되는데, 메시지 교환을 위한 일정한 규격이 필요하게 된다. 즉, 각 객체는 다른 객체가 어떤 메시지를 보낼 수 있는가를 정의해야 하는데, 이를 외부 인터페이스(Public Interface) 혹은 메시지 프로토콜이라 한다. 이때, 각 객체는 Class에 의해 정의되는 어떤 관계(relationship)가 형성된다.

한 객체의 외부 인터페이스에는 객체가 가지고 있는 데이터와 함수들의 일부나 전부가 포함될 수 있다. 실제 프로그램 개발의 경우, 데이터 부분은 거의 감추고 함수들 전부나 일부만 포함시키는 경우가 많은데, 이것은 데이터 부분의 변수들이 외부 객체나 프로그램에 의해서 검색되거나 임의로 값이 수정되는 것을 피하기 위해서이다.(정보은닉)

모든 사물에 어떤 종류가 있듯이 객체에도 종류가 있다. 이러한 객체의 종류를 소프트웨어적으로 구현한 것을 클래스(class)라 부른다. 즉, 클래스는 유사한 여러 객체들에게 공통적으로 필요로 하는 데이터와 이 데이터 위에서 수행되는 함수들을 정의하는 소프트웨어 단위이다.

실제로 객체지향 프로그램에서 모든 객체는 어떤 클래스로부터 생성된 인스턴스(instance)들이다. 즉, 객체나 인스턴스는 같은 개념으로 보이인데 인스턴스라는 용어는 어떤 클래스로부터 생성됐다는 의미를 강조한 것으로, 클래스와 대조적인 개념이며 Object에서 클래스를 통해 정의된 개념이라고 생각할 수 있다. 어떤 클래스에서 하나의 인스턴스가 생성될 때, 그 인스턴스가 속해 있는 클래스에 정의되어 있는 모든 변수들의 장소가 만들어 진다. 그러므로 클래스는 각 인스턴스들이 가져야 할 데이터의 종류, 즉 변수들의 종류와 타입들을 정의하고 있다.

문제 영역에서 존재하는 어떤 클래스들은 다시 여러 가지의 세부 종류로 분류할 수 있다. 하나의 클래스를 여러 서브 클래스들로 세분하거나, 유사한 클래스들을 군으로 묶어서(서브 클래스) 하나의 수퍼 클래스로 정의하는 과정을 소프트웨어적으로 구현한 장치를 속성 상속(inheritance)이라 부르며, 속성 상속의 관계를 나타내는 츄리(tree) 형태의 도식을 상속 구조(inheritance hierarchy)라고 한다.

객체와 클래스 및 상속 구조는 문제영역의 정보를 사람들의 사고 방식과 매우 유사한 방법으로 찾고 표현하게 해 주는데 이를 자연적 모델링(Natural Modeling)이라 부르며 객체지향 프로그래밍의 큰 장점 중의 하나다.

소프트웨어에서 속성 상속은 새로운 클래스를 정의할 때, 처음부터 모든 것을 다 정의하지 않고 기존의 클래스들의 속성을 상속 받고 추가로 필요한 속성만 추가하는 방법(Overloading)이다. 여기서 속성이란 그 클래스가 가지고 있는 데이터(java : Field)와 함수(java : Method)를 의미한다. 이렇게 생성된 서브 클래스는 수퍼 클래스에 정의된 모든 변수(java : Field)들을 가지며, 수퍼 클래스의 함수들을 상속 받아 수행한다. 이때, 대개의 경우 서브 클래스는 수퍼 클래스의 변수들 외에 몇 개의 변수를 추가로 가지며, 함수 또한 수퍼 클래스의 함수 이외에 몇 개의 함수를 추가로 가진다.

위에 표기한 대략적인 개념들을 쉽게 표현하자면
실세계의 어떤 물체(또는 개념)에 대해 객체(Object)라고 정의하여 그 객체에 대해 정의를 내린 후(attribute) 여러 수많은 상황에 따라 변하게 되는(동물을 객체로 정의하자면 어떤 행위나 시간의 흐름을 상황이라 정의할 수 있겠다.) 부분들을(Behavior) 어떠한 목적(Class)에 따라서 분류를 해놓은 것이 instance이다. 이렇게 나온 instance는 목적이 정의해놓은 상황에 따라서 계속 변하게 되는데 이 변하는 것을 함수(java:Method)로 생각하면 될 것이다.
보다 나아가 이러한 instance들의 공통적인 부분들을 묶어서 생각하고자 한다면 superclass가 생길 것이고 superclass는 subclass를 가지게 될 것이다. 그럼 superclass는 하위의 모든 subclass가 요구하는 상황이나 상태를 가지고 있을 것이고 subclass는 또 나름 자기 입맛에 맞는 상황과 상태를 갖출 것이다.


쉽게 표현하려 했으나 표현이 낯설어서 어려울지 모르겠으나 기존의 실세계를 비유하려고 노력하다보면 쉽게 이해가 될 것같다.

밑에는 내가 자주 생각하는 비유이다.

그냥 실세계에 존재하는 나(object)는 대한민국이라는 국적(attribute)과 0살이라는 나이(attribute)를 가지고 부모님(superclass)으로 인하여 세상에 태어났다. 그렇게 나는 부모님이 가지고 계신 국적(superclass_attribute) 을 가지고 0살(subclass_attribute)로서 홍두깨라는 이름(subclass_attribute)으로 식별성(이는 매우 중요한 의미인데 다루지를 못했다;;)까지 가지게 되었다.(object->instance) 나는 나이를 먹어가면서(subclass_Method를 통해 subclass_attribute++) 부모님과 함께 미국으로 이민을 가게 되었다.(superclass_method를 통해 superclass_attribute="미국")

위 비유는 쉽게 생각하기 위해 공부하면서 터득한 것인데 공부를 하면서 나는 위 비유에 상당한 오류가 여럿 존재함을 알아가게 되었다. 이 글을 보는 어떤 누구든 바로 간파했으면 좋겠고 스스로의 잘 다듬어진 객체지향적 사고를 갖추길 바란다.

난 아직 학생신분이고 이런 글을 남기는 건 누구든 객체지향에 대해 의문점이 있거나 정의하기 어려울 때 보다 도움이 되길 바래서 남겼으며 나는 언제나 배워야하기에 수정되어야할 부분이 있거나 추가가 되어야 할 부분, 또는 수정이 불가피한 오류가 있다면 삭제되어야 할 부분이 있다면 언제든지 comment를 달아주었으면 감사하겠습니다 ^^


참조 : Searching을 통한 http://kmh.yeungnam-c.ac.kr/encycl/terms/termsO/objector.htm

위 문서에 대해 아무런 코멘트없이 참조하였음을 심히 죄송케 생각합니다 ㅠ_ㅠ