객체 지향은 소프트웨어 공학도로써 필히 알아야하는 기본 개념중 하나이다. 소프트웨어를 하나의 큰 틀에서 바라보는 것이 아닌 여러 객체의 모음으로 하나의 소프트웨어를 생산하는 관점으로 봐야한다.
객체 지향은 '공통 경험과 실제 객체가 서로 관련되는 방식을 많이 활용하는 소프트웨어를 개발하고 패키징 하는 방법' 으로 정의할 수 있다. 즉 각 객체는 속성과 기능을 가지고 이 객체들이 서로 연관(relation)되어 하나의 완전한 소프트웨어로 발돋음 되는 것이다.
객체 지향의 구성은 아래와 같다.
- Abstraction
- Encapsulation
- Moduarity
- Hierarchy
Abstraction은 어떤 사물에 대해 내부의 세세한 것을 숨기고 외부에는 중요한 특징만 공개하는 방식을 의미한다. 소프트웨어는 이러한 '추상화'가 잘되는가 안되는가에 따라 외부에서 접근이 되는지(개발자 영역을 일반 사용자가 볼 수 있는지)를 검토해야 한다.
Encapsulation은 연관되어 있는 속성과 기능을 하나의 클래스로 묶는 것을 의미한다. 이때 데이터를 중심으로 이 데이터를 사용하여 처리하는 기능들을 하나의 클래스로 묶을 수 있다.
Hierarchy는 어떠한 클래스가 다른 클래스를 부모로 상속 받고 자식 관계를 만들어 나아가며 최종적으로 객체 간의 계층적인 구조가 만들어지는 것을 의미한다. 모든 클래스에 통용되는 기능을 부모 클래스로 넣고 자식 클래스는 이를 상속받아서 사용할 수 있도록 구현한다.
객체 지향의 주요 개념은 아래와 같이 나뉠 수 있다.
- Object
- Encapsulation
- Information Hiding
- Class
- Inheritance
- Polymorphism
Object란 real-world 도메인을 여러 객체로 표현하는 것을 의미한다. 하나의 객체은 데이터와 기능을 가지고 있으며 데이터는 상태(state)를, 기능은 오브젝트의 행동(operation)을 가진다. 객체의 상태는 개체의 특성을 나타내며 variable로 표현할 수 있다. 이는 값을 가질 수 있다. 상태의 특성은 변하지 않으나 그 값은 변한다. 객체의 행위는 상태의 값을 변경시킬 수 있는 행위이다. 이는 class의 여러 method로 표현된다.
여기서 짚고 넘어가야할 것이 객체와 클래스의 관계이다. 현실 도메인에서 객체를 추출하고 이를 추상화 하여 클래스로 만든다. 역으로 클래스를 구체화 하여 객체를 생성할 수도 있다.
Encapsulation은 서로 연관되어있는 데이터와 행위를 하나로 묶는 것을 의미한다.
Information Hiding은 객체를 하나의 black box로 취급하여 일부 정보는 은폐하고 일부는 공개하는 것을 의미한다. 아래 그림은 객체와 사용자간의 정보 공유의 차이점을 보여준다.
information hiding을 할 경우 해당 객체는 독립성, 유지보수성, 확장성 그리고 추상화의 개념이 나타나게 된다.
Class는 object의 카테고리를 의미하는 더 큰 object이다. 하나의 클래스는 하나의 오브젝트 타입을 소프트웨어로 적용한 것을 의미한다. 따라서 class는 여러 object간의 집합이라 할 수 있다. 하나의 클래스는 여러 자료 구조와 기능들을 포함하며 이는 각 오브젝트에 적용될 수 있다. Class를 이루는 내용중 자주 접할 수 있는 단어 Instance가 있다. Instance는 클래스에 속한 하나의 오브젝트를 의미하고 클래스 내 모든 오브젝트는 같은 세트의 속성과 메소드를 가진다. 또 클래스에 대해 공부하고 있다면 생성자에 대한 개념도 알게 된다. 생성자란 클래스 이름과 동일한 이름을 가진 메소드로 인스턴스를 생성한다. 생성을 했다면 소멸도 해야한다. 따라서 소멸자는 생성된 객체 인스턴스를 메모리로 부터 제거하며 현재 사용중인 거의 대부분의 객체 지향 언어는 객체가 제거될 경우 자동적으로 하위 인스턴스를 메모리에서 free 시키도록 구현되어있다.
Inheritance는 상위 클래스의 속성 또는 행위를 하위 클래스가 상속하여 재 사용하는 것을 의미한다. 아래 그림을 통해 이해하자.
Ploymorphism은 함수를 overloading하는 것을 의미하는데, 같은 메세지에 응답하는 두개 이상의 오브젝트의 능력이라고 정의할 수 있다.
'Software Engineering > Week 2' 카테고리의 다른 글
Uml & Usecase diagrams (0) | 2022.11.10 |
---|