[디자인패턴] 객체지향 프로그래밍과 객체지향 설계

2021. 9. 29. 18:30
728x90

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

컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법

 

객체 지향 프로그래밍의 가장 큰 특성 4가지

 

1. 추상화

복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.

즉, 어떤 영역에서 필요로 하는 속성이나 기능을 추출하는 작업으로 데이터의 추상화, 처리과정에 대한 추상화 등이 있다.

 

2. 캡슐화

외부에서 접근하여 사용할 수 있는 코드만 공개하고 다른 코드들은 접근할 수 없도록 제공하지 않는 부분을 데이터로 감싸서 정보은닉하는 것을 말한다. 클라이언트(사용하는 코드)는 해당 메소드의 세부적인 사항까지 알 필요가 없으므로,

단순한 접근만을 제공하여 오류가 생길 요소를 감소시킨다.

 

3. 상속성

일반적인 개념의 객체를 보다 구체적인 개념의 객체의 관계를 표현하는 것이다.

상속 관계의 클래스는 상위 클래스의 Type을 내포하고 있으며 그 속성과 기능을 하위 클래스에서 사용하거나 재정의 할 수 있다.

 

4. 다형성

같은 메세지, 같은 구현에 대해 각 객체가 다른 표현과 결과를 발생시키는 것을 의미한다.

클래스의 상속하거나 인터페이스 구현할 때 각각 다르게 구현하는 하위 클래스들이 상위 타입으로 업캐스팅 된다.

 

이때 오버라이딩한 메서드가 존재하는 경우 같은 클래스를 상속했더라도 각각 다른 인스턴스의 메서드가 호출되는것이다. 이 때문에 같은 메소드를 사용하더라도 인스턴스별로 다양한 구현으로 표현될 수 있다.

 

참고로 C++의 경우 virtual fuction만이 재정의된 함수가 호출되지만 자바의 경우는 모든 메서드 가상함수 기반으로 구현되므로 하위 클래스에 재정의된 메서드가 있는 경우에는 재정의된 메서드가 호출 된다.

 


설계적 측면에서 고려해야할 점

프로그램을 설계할 때 다양한 방법이 존재하다보니 설계적 측면에서 효율적인 설계를 위하여 몇가지 고려해야 할 점들이 생긴다. 그 중 대표적인 것들을 다뤄보자.

 

- Design Heuristics

추상클래스 vs. 구체적인 클래스  (Abstract class vs. Concrete Class)

추상클래스는 무조건 함수를 완성 시킨 후에 객체를 생성하여 사용할 수 있다.

 

상속 vs 합성 (Class Inheritance vs. Object Composition)

기본적으로는 가져다 쓰는건 합성(Composition)

상속은 클래스 간의 결합도가 높으므로 잘 생각하고 사용해야 한다.

 

인터페이스 상속 vs. 구현 상속 (Interface Inheritance vs. Implementation Inheritance )

구현 상속이란 자식 클래스가 기본 클래스에서 동작 구현을 상속하는 관계이다.

인터페이스 상속은 자식 클래스가 기본 클래스의  동작 설명만 상속하고 구현자체를 제공하는 경우다. 

보통은 두 구성 요소간 결합을 피하기 위해 구현 상속보다 인터페이스 상속을 선호한다.

 

응집도와 결합도

잘 만들어진 소프트웨어는 응집도는 높고 결합도는 낮아야 한다.

 

응집도(cohesion) : 높을 수록 좋다.

하나의 모듈, 객체 내부의 요소들이 서로 연관되어 있는 정도를 의미한다.

응집도가 높으면 객체가 하나의 기능만을 수행한다고 할 수 있다. 

 

결합도(coupling) : 낮을 수록 좋다.

객체 상호간의 연관 관계로 어떤 모듈이 다른 모듈에 의존하는 정도를 나타내는 것이다. 

결합도가 높으면 하나의 객체를 수정할 때 다른 객체도 수정해야 하는 문제가 있다.

 

 

 

 

반응형

BELATED ARTICLES

more