본문 바로가기
lang/C,C++

[Class] 1. Class - 객체지향 프로그래밍 OOP 4가지 특징

by Wordbe 2019. 10. 9.
728x90

1. Class

1-1. 클래스?

C++ 에서 클래스는 구조체가 확장된 것으로 이해할 수 있습니다.

즉, 사용자가 정의할 수 있는 일종의 객체 타입이기도 합니다.

구조체와 클래스의 차이는 기본 접근 제어 차이일 뿐, 나머지는 비슷합니다.

클래스의 멤버 변수를 property,

멤버함수를 method라고 합니다.

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

모든 데이터를 객체(object)로 취급하며, 객체가 프로그래밍의 중심이 됩니다.

위에 말했던 property는 객체의 상태(state)를, method는 객체의 행동(behavior)를 구체화 합니다.

이와 같은 객체를 만들어내기 위한 틀이 "클래스(Class)"입니다.

OOP 특징

  1. 추상화(abstraction)

​ 추상화는 객체들의 공통 특징(property, method)을 뽑아 하나의 클래스(새로운 타입의 사용자 데이터형)로 표현하는 것이다. 절차지향 프로그래밍에서도 구조체로 있어왔다.


  1. 캡슐화(encapsulation)

​ 캡슐화는 데이터의 구조와 데이터를 다루는 방법을 결합시켜 묶는 것을 말한다.

즉, 특정 객체가 독립적으로 역할을 하기위해 필요한 데이터(멤버 변수, property)와 기능(멤버 함수, method)를 묶는 것이다.

또한, 데이터를 은닉(private)하고, 그 데이터에 접근하는 기능을 노출시키지 않는 다는 의미로도 캡슐화라는 용어를 사용한다. 다른 객체가 알 필요 없는, 혹은 알아서는 안되는 데이터를 캡슐로 보호하는 것이다.

즉, 정보 은닉(data hiding)과 연관되어 있다.


  1. 상속성(inheritance)

​ 상속은 상위 개념의 특징(property, method)을 하위 개념이 물려받는 것을 말한다.

같은 특징있는 클래스를 그대로 물려받아, 다시 작성할 필요없이 재사용으로 효율성을 늘린다. 이를 통해 다형성을 확보할 수 있다.


  1. 다형성(polymorphism)

​ 다형성이란 다양한 형태로 표현이 가능한 구조를 말한다. 비슷하지만 조금 다른 방법의 기능이 있는 함수를 동일한 이름으로 사용할 수 있는 구조를 만드는 것이다.

상속받은 멤버 함수를 재정의하는 함수 overriding,

부모클래스 포인터 객체가 자식 클래스 객체를 가리킬 때, 동적바인딩(dynamic binding)을 가능케 하는 가상 함수(virtual function),

반드시 재정의 되어야 한다고 명시하는 순수가상함수(pure virtual function)과 그것을 포함한 추상 클래스(abstract class) 등을 통해

다형성을 지닌 객제지향프로그램을 설계할 수 있다.

객체의 예

객체(object) - 고양이(cat)

멤버 변수(member variable)

cat.name = "나비";
cat.family = "코리안 숏 헤어";
cat.age_ = 1;
cat.weight_ = 0.1;

멤버 함수(member function)

cat.mew();
cat.eat();
cat.sleep();
cat.play();

인스턴스(Instance)

클래스를 작성했으면, 이 틀을 이용하여 도장찍듯이 인스턴스를 만들 수 있습니다.

선언된 클래스 타입의 객체를 인스턴스라고 하며, 메모리에 대입된 객체를 의미합니다.

인스턴스는 독립된 메모리 공간에 저장된 각자의 멤버변수를 가지지만,

멤버 함수는 모든 인스턴스가 공유합니다.

1-2. 클래스 선언

class Book{
private:
    int current_page_;
    void set_percent();
public:
    int total_page_;
    void move(int page);
};

private, publice은 접근 제어 지시자로,

객체지향 프로그래밍의 특징 중 하나인 정보은닉(data hiding)을 위한 키워드입니다.

private 영역은 해당 객체 내의 멤버 변수나 멤버 함수만이 접근할 수 있습니다.

멤버 변수는 클래스 안에서만 선언가능하지만,

멤버 함수는, 클래스 안, 밖에서 모두 만들 수 있습니다.

단, 밖에서 선언할 때는 클래스 안에서 함수헤더는 선언해야 합니다.

void Book::move(int page) { current_page = page; }

인스턴스는 다음과 같이 만들 수 있고, public 멤버 변수, 멤버함수를 접근할 수 있습니다.

Book macbook;
macbook.total_page_;

private에 접근하기 위해서는, public영역에서 private 변수, 또는 함수에 접근하는 method를 만들어 주어야 합니다.

1-3. 정보 은닉

사용자가 굳이 알 필요가 없는 정보를 사용자로부터 숨겨야 한다는 개념입니다.

이에 따라 최소한의 정보만으로 프로그램을 손쉽고, 보기편하게 사용할 수 있게 합니다.

이를 위해 3가지 접근 제어 지시자를 사용합니다.

  1. private
  2. public
  3. protected

기본 접근 제어 권한은 private이고,

구조체 및 공용체는 public입니다.

public

pulbic 접근 제어 지시자를 사용하여 선언된 클래스 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 직접 접근할 수 있습니다.

따라서, public 멤버 함수는 private 멤버와 프로그램사이의 인터페이스 역할을 합니다.

img

private

public과 반대로, 외부에 공개되지 않으며, public을 통해서를 제외하고는 접근할 수 없습니다.

img

protected

파생클래스(derived class)에 대해서는 public 멤버처럼 취급되고,

외부에서는 private 멤버처럼 취급됩니다.

img

[출처 - TOPSCHOOL.com http://tcpschool.com/cpp]

728x90

'lang > C,C++' 카테고리의 다른 글

[Class] 3. Class - 연산자오버로딩  (953) 2019.10.09
[Class] 2. Class - 구성요소, 깊은복사 vs 얕은복사  (1818) 2019.10.09
[STL] erase  (0) 2019.09.19
C++ String (#include <string>)  (0) 2019.09.03
[STL] priority_queue  (0) 2019.07.21

댓글