본문 바로가기

Programming/OOP

OOP의 요소들과 원리에 대해서.


object

객체(object)란 보고 만질 수 있는 것, 지성적으로 이해할 수 있는 것, 생각이나 행동이 추구하는 바를 말한다. 또는 문제영역에서 잘 정의된 역할을 갖고 있는 각각에 대해서 구별할 수 있는 품목(item), 단위(unit), 개체(entity)라 정의하기도 하며 단순히, 정의된 경계를 갖고 구별되는 어떤 것이라 말할 수도 있다.

다시 말해서 객체는 학생, 교실, 책 같은 생각할 수 있는 모든 사물이나 공부, 수학 같은 개념상으로 존재하는 것 등 모든 것이 될 수 있다. 좀 더 구체적으로, 문제영역에 속한 사물 중에 관리의 필요성이 있거나 중요한 개념이라면 더 좋은 객체(instance, instance = attribute+behavior+identity)가 될 수 있다.

시스템의 관점에서 본다면 어떤 상태(state = attribute+behavior)를 나타내는 데이터의 구조와 동작을 수행하는 연산(operation)으로 이루어진 프로그램의 하나의(identity) 요소이다. 여기서의 연산을 객체지향에선 메소드(method)라고 한다. 이렇게 객체의 상태는 데이터에 의해 결정되고 동작은 메소드에 의해 결정된다.

 

class

모든 객체는 반드시 클래스를 통해서만 정의될 수 있다. 클래스는 객체의 타입을 정의하는 템플릿(template)으로서, 여러 객체의 공통적인 속성(attribute)과 메소드(method)를 가지고 있는 클래스가 먼저 정의되면, 이 클래스를 통해서 다시 객체가 정의되는 것이다.(object->instance)
여기서 중요 포인트는 클래스를 통해 다시 객체가 정의된다는 것이다. 즉 다시 말해서 클래스를 개념적 의미로 이해를 해야한다는 것이다. 실체를 구분하기 위한 실체는 잘못된 논리지 않은가? Object가 실체로 존재하며 identifier를 통하여 고유하다면  Class는 어떤 문제영역에 따라서 Object의 attibute, behavior를 의미하는 operation으로 구성되어 object를 하나로 모으는 개념적 의미를 갖고있다.

말이 어려워 본인도 이해가 잘 안간다. 따라 비유의 힘을 빌자면..
이를테면 스터디라는 조직에는 여러 스터디원들이 있고, 이들 중에는 홍길동도 있고 홍두깨도 있다고 하자.

이들을 시스템으로 표현하려면 많은 공통적인 요소, 즉 속성들이 있는데, 성명, 주민등록번호, 연락처, 전공, 학교 등이 그것이다. 목표학업이나 스터디규율은 메소드가 될 것이다. 이러한 속성과 메소드를 가지는 스터디원은 클래스가 되고 이를 통해 홍길동, 홍두깨 등의 객체가 만들어진다.

이렇게 한 클래스에 속하는 각각의 객체를 그 클래스의 인스턴스(instance)라고 하고, 객체들의 유형이 되는 클래스를 객체의 타입(object type)이라고 한다.

 

abstraction(추상화)
현실세계의 사실을 그대로 객체로 표현하기 보다는 문제의 중요한 측면을 주목하여 상세내역을 없애나가는 과정을 추상화(abstraction)라 한다.
객체지향에서는 클래스를 통해서 추상화를 지원하고 있으며, 이것은 다른 전통적 프로그래밍보다 강력한 추상화의 방법이다.
시계라는 object를 추상화를 통하여 표현하려고 하자. 시계엔 여러 용도들이 있고 여러 구성방법이 있다. 하지만 시계 자체 본연의 기능에 목적을 가지고 추상화하자면 매우 간단하게 시, 분, 초만 있으면 되는 것이다. 이를 java로 표현하게 되면
public class Clock{
 int hour;
 int minute,
 int second;
 public void display(){
  //시간출력
 }
}
추상화를 통해서 얻을 수 있는 것은 객체를 표현함에 있어서 중요한 또는 필요한 부분만을 표현한다는 것이다. 이렇게 추상화를 통하여 문제영역에 있는 object들의 복잡성을 프로그램으로 구현하는데 간단하게 해줄 수 있고 분석의 초점을 명확하게 함이 가능하다.

 

Generalization(일반화) / Inheritance(상속)
객체지향에 있어서 중요한 키워드중 하나는 Inheritance이다. 이는 객체간에 관계를 형성시키는데 중요한 역할을 하고 있다. Inheritance는 중요한 키워드이지만 그 의미는 매우 쉽다. superclass를 부모라 하면 subclass는 자식이란 개념이 형성이 된다. 부모는 서로 다른 특징을 가지고 있는 여러 자식들을 가질 수 있다. 이런 서로 다른 특징을 가지고 있는 여러 자식들에게도 공통적인 특징은 하나이상으로 갖게 마련인데 이 공통적인 특징은 부모로부터 상속(Inheritance)받은 것이다. Inheritance는 일반적으로 ~is a 관계가 형성된다. 적절하게 비유하자면 고래, 독수리는 서로 다른지만 공통적인 특징으로 나이, 생물체등등 여럿 있으며 이를 한데 묶어서 동물이라고 특정지을 수 있다. 따라서 하위 클래스인 고래는 동물이다 라는 관계가 형성시킬 수 있다. 반대로 동물은 고래다라는 관계는 형성되지 않는다.(subclass is a superclass)
그럼 왜 Inheritance가 매우 중요한 것일까? 그건 바로 재사용성이 뛰어나다는 점이다. superclass에서 정의된 subclass의 공통된 변수(java : Field)나 Method를 subclass에서 상속받을 수 있다면(Overriding) 굳이 다시 정의할 필요가 없으니 말이다. 이를 다시 말하면 확장성이 뛰어나다고도 한다.
Generalization은 이러한 Inheritance관계에 있는 class들 중 (공통적인 부분을 추출하면서) 상위클래스로 향함을 말한다. 즉 여러 특징들중 공통되는 부분들을 묶어서 일반화시킨다는 말이다. 앞에서 말했듯이 고래나 독수리의 공통되는 부분들을 묶어서 표현하는데 그 표현을 정의내리길 동물이라고 할 수 있듯이 말이다. Object로 사용하기 힘든 정도로 Generalization된 Class를 Abstract Class라고 하고 Object로 사용할 수 있는 Class를 Concrete Class라고 하며 최초의 Concrete Class의 Sub Class는 모두 Concrete Class가 된다.

 


Specialization(구체적)
Inheritance, Generalization을 보았다면 Specialization은 어느정도 답이 나왔다. Ingeritance관계에 있어서 Subclass를 말하는 것이다. 앞서 기술한 Generalization, Inheritance에서의 관계를 뜻하는 그대로이다. Superclass로부터 Subclass로 내려가면서 나뉘어지는 하위클래스들은 특정한 도메인에 따라 분류가 된다.

 

Realization    // 2011.05.07 기록
추상화된 것의 구현입니다.
생각해봅시다. 추상화는 구체화 된 무엇이 아닙니다. 실체가 없다는 것이죠.
따라서 추상적인 것들을 구현을 해주어야합니다. 그렇지않다면 object로서의 기능을 발휘할 수 없습니다.
동물원을 다녀온 동생이 "나 동물이 행위하는 거 보고 왔어" 라고 말하는 것과 "나 원숭이가 바나나 먹는 거 보고 왔어" 라고
말하는 것과의 차이가 느껴지나요?
interface를 클래스로 구체화시켜주고 이를 실행하여 객체로서의 기능이 소화될 때. 이것이 realization 입니다.

 

Association  // 2011. 06. 08 기록
하나의 클래스가 다른 클래스와 참조, 확장, 또는 상속등에 의하여 연관되어있는 것을 의미합니다.
is a, has a 관계 등을 의미할 수 있습니다. 


dependency
객체간의 의존성을 말하는 것이다. 웹어플리케이션은 규모에 따라 다르겠지만 적게는 수십, 많게는 수천 수만개의 객체로 구성되어 있다. 보통 클라이언트의 요청을 받아주는 컨트롤러객체, 비즈니스로직을 수행하는 서비스객체, 데이터 접근을 수행하는 DAO 객체 등으로 구성되어있다. 이러한 객체들은 독립적으로 기능을 수행하기보다는, 서로 의존하여 어플리케이션의 기능을 구현하게 된다. 


Polymorphism
이 것을 정의하기에는 언어적으로 넘어가지 않으면 난 설명하기 힘들 것 같다.(아직 OOP에 대해 명확한 이해가 부족하기에...ㅠㅠ)
Polymorphism(다형성)이란 하나의 인터페이스로 참조되는 인자들에 대하여 다른 결과가 나오는 것으로 이해했다.

      _Overriding : 상속관계에 있는 클래스간에 자식class(method)가 부모class(method)를
                         재사용하기 위하여, 유지 보수에 용이하다. 간단한 예로 api를 들자면 toString(), equals()



Encapuslation / 절차은닉 / 정보은닉
객체지향 프로그래밍에서, 캡슐화는 객체와 기능, 즉 메쏘드와 데이터 등을 위해 필요한 모든 자원을
프로그램 객체 내에 포함시키는 것이다.
그 객체는 자신의 인터페이스들을 외부에 널리 알림으로써, 다른 객체들은 그 객체가 그 일을 어떻게 수행할 지에 대해
전혀 알지 못하더라도, 단지 인터페이스만을 통해 그 객체를 사용할 수 있다.
이는 마치 "네가 그것을 어떻게 하는지는 말하지 말고, 그저 나를 위해 그것을 해줘"라는 식으로,
사용자에게는 어떤 일을 수행하는지의 기능에 대한 인터페이스만을 제공하며, 내부에서 일어나는 일은 숨긴다.
각각의 객체는 하나의 독립적인 원자라고 생각할 수 있으며,
객체 인터페이스는 전역 메쏘드들과 인스턴트 데이터로 이루어져있다.
이하 2011. 06. 12 첨언 //
캡슐화의 목적에는 객체가 가지고 있는 data에 대해서(멤버변수) 분리를 해줌으로써 외부에서 코딩의 실수로
데이터를 조작할 가능성에 대해 막고자하는 데에도 있습니다. 대신, 외부에서 데이터를 조작할 수 없기때문에
캡슐화가 잘 된 객체들은 반드시 외부에서 필요로 할 수 있는 데이터연산함수를 제공해주어야 합니다.
즉, 데이터를 책임있게 다루는 메소드를 제공할 수 있어야 하는 것입니다.


참조 : http://cjmyun.tripod.com/Knowledgebase/ConceptsOfObjectOriented.htm,
         http://penta82.egloos.com/4098493