본문 바로가기

프로그래밍/C++

객체지향과 클래스

객체지향 접근 방법
: 실세계의 객체를 어떻게 모델링하는가?

객체지향 철학

1.. 객체 (Object) : 객체가 가지고 있는 정보(데이터) + 객체가 수행하는 기능(데이터 처리 함수)

2. 클래스 : 객체들을 구별한다. 공통된 속성과 연산을 갖는 객체의 집합
   인스턴스 : 어떤 클래스에 속하지만 같은 클래스에 속한 다른 객체와 구별되는 특징이 있다
   메세지 : 객체들 간에 상호작용을 하는데 사용되는 수단

3. 컴포넌트
: 모여서 하나의 객체를 이루는 것

4. 프로퍼티 (Property)
: 어떤 객체를 설명하는 특징, 무엇이 이 객체를 다르게 하는가?

에 대한 답을 준다

5. 행동
: 이 객체는 무엇을 하는가? / 이 객체를 이용하면 무엇을 할 수 있는가? 에 대한 답을 준다

6. 통합 (Collection)
: 그룹을 짓는 것

객체 간 관계

1. Has-A 관계 (집합 관계)
: A가 B를 가질 때 / A가 B를 포함할 때

2. Is-A 관계 (상속 관계)
: 무엇은 무엇의 한 종류다라는 뜻으로 파생, 서브클래싱, 확장,  상속 등 여러 이름으로 불리며 OOP의 근간이 된다

상속 관계는 'A는 B의 한 종류다' / 'A는 B의 상당 부분을 닮았다' 라는 패턴을 따른다

클래스 간에 is-a 관계를 맺을 때는 공통의 기능을 상위 클래스에 묶어 넣어 다른 클래스로 확장할 수 있게 하는 것이 목적이다

객체지향의 특징

1. 추상화 (Abstraction)
 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것이다. 
자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 한다. 추상 자료형은 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통해서 자료형의 정보를 은닉할 수 있다. 
즉, 불필요한 부분을 생략하고, 객체의 속성 중 가장 중요한 것에만 중점을 두어 개략화하는 것이다.
최소의 비용으로 실제 상황에 대처가 가능하고, 시스템 구조 및 구성을 가시적으로 볼 수 있다.

2. 상속 (Inheritance)
 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다. 
상속을 받는 새로운 클래스를 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 한다. 
새로운 클래스가 상속한 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다.
상속을 통해서 기존의 클래스를 상속받은 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정할 수 있고, 클래스 간의 종속 관계를 형성함으로써 객체를 조직화시킬 수 있다.

3. 다형성 (Polymorphism)
 어떤 한 요소에 여러 개념을 넣어놓는 것이다.
다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다.

오버라이딩 (Overriding) : 같은 이름의 메소드가 여러 클래스에서 재정의되는 것
오버로딩 (Overloading) : 같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것

4. 캡슐화 (Encapsulation)
 객체의 속성과 행위를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉하고 클래스 멤버 접근 속성을 지정하는 것이다. 
재사용이 용이하고 인터페이스가 단순해지며 객체 간의 결합도가 낮아진다.

5. 정보 은닉 (Information Hiding)
 자신의 정보를 숨기고 자신의 연산 만을 통하여 접근을 허용한다.
유지보수, 소프트웨어 확장시 오류를 최소화할 수 있다.

객체지향의 장점

  1. 소프트웨어 재사용, 확장이 용이하다.
  2. 빠르게 개발이 가능하고, 유지보수가 용이하다.
  3. 복잡한 구조를 단계적, 계층적으로 표현할 수 있다.
  4. 멀티미디어 데이터 및 병렬처리를 지원한다.

좋은 객체지향 계층 디자인

1. 클래스를 의미 있는 기능적 관계에 따라 조직화한다

2. 공통부분을 베이스 클래스에 위치시킴으로써 코드를 재사용할 수 있게 한다

3. 부모가 추상 클래스일 경우를 제외하고, 베이스 클래스의 많은 부분을 오버라이딩하는 파생 클래스의 도입은 피한다

다중 상속
: 하나 이상의 베이스 클래스를 가질 수도 있다

다중 상속의 단점

1. 다중 상속 관계는 그림으로 나타내기 복잡하다

2. 다중 상속은 간명할 수도 있는 클래스 구조를 망가뜨릴 수있다

3. 다중 상속 계층은 구현하기가 까다롭다

첨가 클래스 (Mixin class)
: is-a 관계를 완전히 구현하지 않고도 일정 기능을 추가하는 방법

클래스의 가시성

1. public : 외부에서 접근할 수 있도록 공개된다

2. protected : 외부에서는 접근할 수 없지만 파생 클래스에서는 접근이 가능하다

3. private : 외부는 물론 파생 클래스에서조차도 해당 프로퍼티와 행동에 접근할 수 없고, 클래스 내부적으로만 이용할 수 있다

인터페이스 디자인은 public 항목에 어떤 것을 담을 것인가로 귀결된다

사용 목적에 대한 고려

애플리케이션 프로그래밍 인터페이스 (API)
: 어떤 제품을 확장하거나 그 기능을 다른 맥락에서 이용하기 위한 목적으로 위부에 공개된 장치
가장 큰 딜레마는 사용성과 유연성의 절충점을 찾는 것
좋은 API는 '쉬운 일은 쉽게, 복잡한 일도 가능하게'

유틸리티 클래스 / 라이브러리
: 일반적으로 사용될 기능을 만들어야할 때, 모든 기능을 외부에서 사용해야 해서 내부 구현을 너무 드러내지 않는 선에서 모두 노출하는 것

서브시스템 인터페이스
: 주요한 서브시스템 간에 인터페이스를 디자인 할 때 사용

컴포넌트 인터페이스
: 작은 규모의 인터페이스를 디자인 할 때 사용

+
책보고 남겨놓으려고 정리해놨는데 생각보다 방문하셔서 보시는 분들이 계시네요.
제가 정리한 내용이 도움이 되셨다면 공감 한번씩 눌러주세요~
수정해야할 내용이 있다면 밑에 댓글 남겨주시면 신속하게 고치도록 하겠습니다.


'프로그래밍 > C++' 카테고리의 다른 글

코드의 재사용성  (0) 2019.03.19
STL컨테이너에 저장되어야할 항목과 반복자  (0) 2019.03.18
보기 좋은 코드의 중요성과 코드의 디자인  (0) 2019.03.09
auto, decltype, 문자열  (0) 2019.03.08
Lambda (람다)  (0) 2019.03.07