본문 바로가기

C++

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

Chapter 3. 객체지향 프로그래밍(Object Oriented Programming)
1. 객체지향 프로그래밍
 - 모든 데이터를 객체(Object)로 취급하여 프로그래밍 하는 방법으로, 처리 요구를 받은 객체가 자기 자신의 안에 있는 내용을 가지고 처리하는 방식이다.
 - C언어와 같은 절차지향 프로그래밍은 함수 중심적인 프로그래밍이다.
 - 객체(Instance)
  · 데이터(실체)와 그 데이터에 관련되는 동작(절차, 방법, 기능)을 모두 포함한 개념
  · 예로 함수나 변수를 들 수 있다.
 - 클래스(Class)

  · 객체를 표현하기 위해 사용되는 상자(틀)
  · Class를 통해 프로그램 소스코드를 분할해 만들 수 있다.
  · Class 선언 시 꼭 끝에 세미콜론(;)을 써줘야 한다.
  · Class로 인해 데이터의 캡슐화 기능이 생겨났다.
 - 캡슐화(Encapsulation)
  · 관련있는 데이터와 함수를 하나의 객체로 묶는 것을 말하며 동시에 정보은닉 기능을 제공한다.
  · 정보은닉(Information hiding) : 선언된 Class 외부에서 직접적인 접근을 제한하며 은닉하는 기능으로 간접적인 접근은 허용하는 기능이다.
  · 접근제어(Access Control)

예약어

범위

public

 선언된 Class 내외 어디서든 접근 가능

private

 선언된 Class 내에서만 사용가능

protected

 자신의 Class 내와 상속된 Class까지만 접근 가능

    ◦  private로 선언된 부분은 Class 내가 아닌 곳에서는 접근이 불가능하지만 class 내에서 public안에 선언된 함수를 이용하면 접근이 가능하다.
    ◦  protected는 Chapter 7. 참고

 

2. 객체지향 프로그래밍 C++의 새로운 기능
 - 생성자(Constructor)
  · 객체(Class 변수)가 생성되는 시점에 멤버변수를 초기화 해주는 함수
  · 생성자를 통한 초기화는 객체가 생성될 때 자동으로 수행된다.
  · 생성자 함수라고도 한다.
  · 생성자의 생성

   ◦  생성자의 선언 

   ◦  콜론(:)을 이용한 초기화 

 

 

    ◦  생성자는 객체(class) 생성 시 딱 한번 정의 하며 class 변수를 생성자를 이용해 초기화 할 수 있다.
    ◦  생성자는 반환형(Return Type)이 없으며 실제로 값을 반환하지 않는다.
    ◦  생성자 또한 함수이기 때문에 오버로딩(Overloading)이 가능하다.
    ◦  생성자도 함수와 같이 Default 값을 설정이 가능하며 Class변수를 생성자를 이용해 초기화 할때 인자값을 주어 주지 않으면 Default 값으로 채워진다.
    ◦  생성자는 콜론(:)을 통해 Default 값을 정해줄 수 있다.
    ◦  생성자를 정의하면 소멸자도 정의 해줘야한다.
  · 생성자를 이용한 Class 변수 초기화

  ◦ 변수를 선언할 때 Class이름을 데이터형으로 놓고 생성자를 변수이름뒤에 괄호(())와 괄호안에 인자값만 알맞게 넣어주면 초기화가 가능하다.
  - 소멸자

  ◦ 객체가 생성자에 의해 동적 할당이 되었을 때 자동으로 사용되는 함수로 main 함수 내에서 사용하지 않아도 생성자에 의해 Class 변수가 초기화되면 프로그램 종료 시 자동으로 사용되어 동적 할당을 해제해준다.
  ◦ 소멸자 함수의 이름은 생성자 함수 이름에 Not이라는 의미의 물결표시(~)를 붙여 쓰면 된다.
  ◦ 오버로딩(Overloading)은 불가능하며 매개변수(인자)와 반환값은 존재하지 않는다.
 - 포인터 상수화
  · 포인터는 const의 위치에 따라 상수화 되는 기준이 달라진다.

const 위치

설명

const int num = 10;

 num 상수화

const int *prt = &val;

 prt이 가리키는 val의 값 변경이 안 된다.

int const *prt = &val;

 prt이 val만 가리키게 된다.

const int * const ptr = &val;

 ptr이 val만 가리키며 val의 값 변경이 안된다.

 - Class 멤버 상수화

  · Class에서 멤버변수 선언 시 상수화 시킬 수 있으며 상수화 된 멤버는 선언과 동시에 초기화 되어야 하기 때문에 생성자에서 콜론(:) 초기화를 통해 초기화해야 한다.

 - Class 멤버 함수 상수화

  · C언어에서는 변수 앞에 const를 붙이면 상수가 되는데 C++에서는 함수도 변수처럼 상수화가 될 수 있다.
  · 멤버함수를 상수화 시키려면 선언부, 정의부 모두 함수명 뒤에 const 키워드를 붙인다.
  · 상수화된 멤버함수 내에서 함수를 사용할 때는 상수화된 함수만 사용할 수 있다.
 - 정적 멤버

 · 정적 멤버의 선언 및 초기화

· 정적 멤버의 호출 

  · Class 내에서 static을 붙여 선언한 멤버 변수를 말한다.
  · Class 내에서 선언된 변수지만 Class의 멤버변수는 아니다
  · 정적 변수는 Main 함수가 호출되기 전 메모리 공간상에 Load되 초기화되기 때문에 객체 생성과는 상관없이 사용된다.
  · 정적 멤버 함수는 정적 멤버변수만 접근할 수 있으며 정적 멤버변수의 초기화는 멤버함수 내에서 할 수 없다.
 - this 포인터

  · this 포인터는 자기 자신을 가리키는 용도로 사용되는 포인터이다.
  · 주로 지역변수로 같은 이름을 가진 변수로 선언됐을 때 이전에 선언된 변수인 자기 자신을 가리킬 때 사용한다.
 - 복사 생성자

  · 복사 생성자의 선언 

  · 생성자와 유사한 함수로 객체가 생성될 때 호출되는 함수이다.
  · 객체간의 복사가 발생될 때 호출되는 함수이며 자신과 같은 타입의 객체를 인수로 받아 복사하는 함수이다.
  · 복사 생성자가 생성자의 인수를 전달 받을 때 반드시 Reference나 포인터를 이용해 전달 받아야 하지만 일반적으로는 Reference를 사용한다.
  · 객체간의 멤버 대 멤버 복사가 발생될 때 마다 호출된다.
  · Default 복사 생성자는 Class 내에 정의하지 않은 경우 컴파일러에 의해 내부적으로 생성되는 복사 생성자이며 멤버 대 멤버의 복사를 수행한다.
  · 포인터에 동적 메모리 주소가 저장되어 있을 때 Default 복사 생성자에 의해 같은 주소 값을 여러 객체가 가리킬 경우 해당 주소의 변수가 동적메모리가 해제된 상태에서 또 다시 해제하려 하기 때문에 문제가 발생한다. 그래서 이 경우는 멤버 변수에 포인터가 있는 경우 이기 때문에 포인터가 가리키는 메모리까지 복사하는 복사 생성자를 구현해야 한다.

  · 얕은 복사 : Default 복사 생성자의 멤버 대 멤버 복사
  · 깊은 복사 : 복사 생성자의 멤버 대 멤버 복사
 - 객체 배열

  · 객체(Class) 변수가 여러 개 필요한 경우 배열로 선언해 사용한다.
  · 객체 배열을 선언할 때 객체 배열의 크기만큼 객체가 생성되어 생성자를 호출하게 된다.
  · 객체 배열을 초기화 할 때는 중괄호({}) 안에 생성자 이름과 함께 인자 값들을 넣어주면 된다.
  · 객체 배열의 생성자 인수가 한 개인 경우에는 객체(Class)의 이름 없이 배열을 초기화하는 것처럼 중괄호({})에 값만 넣어주는 게 가능하다.
 - 객체 포인터

  · 객체의 주소를 저장하는 포인터를 말하며 객체 포인터 변수 같은 경우 멤버 함수를 호출할 때 -> 연산자를 사용한다.
 - 객체 포인터 배열

  · 객체 포인터가 여러 개 필요한 경우 객체 포인터 배열을 사용한다.
  · 초기화할 때는 new 연산자를 사용해 초기화한다. 

 

'C++' 카테고리의 다른 글

Chapter 6. C++의 또 다른 기능  (0) 2015.08.05
Chapter 5. 연산자 오버로딩(Operator Overloading)  (0) 2015.08.05
Chapter 4. 상속(Inheritance)  (0) 2015.08.05
Chapter 2. C++의 메모리 동적 할당  (0) 2015.08.05
Chapter 1. C++의 개요  (0) 2015.08.05