객체지향(OOP, Object Oriented Programming)

 

C++에서 객체는 class라는 문법으로 만들 수 있다. (class는 일종의 설계도라고 생각하면 된다.)

 

지금까지 Text RPG 코드 등과 같이 직접 만들었던 코드들은 절차 지향적 코드이다. 

이제부터는 본격적으로 게임 개발 등에서 많이 사용하는 객체지향을 이용할 것인데

객체지향은 말 그대로 각각의 객체들을 이용해서 원하는 로직을 만드는 것이다. 

즉 변수나 함수 등이 하나의 객체 안에 포함되어 있고 사용자는 그 객체를 불러와서

원하는 동작이나 로직 등을 쉽게 만들 수 있다.

 

class 내부에서 멤버 함수와 멤버 변수를 지정할 수 있으며 

class 안에서는 해당 멤버 변수를 어디에서든지 가져와서 사용할 수 있다.

보통 멤버 변수는 특정 객체 내의 멤버 변수라는 것을 나타내기 위해 

변수명 앞에 _(언더바) or m_ 등과 같이 써준다.

 

class를 이용해서 객체를 생성하면 무조건 생성자와 소멸자가 만들어진다. 

생성자는 여러개 존재할 수 있고 소멸자는 무조건 하나만 존재할 수 있다.

사용자가 직접 명시적으로 생성자를 선언할 수 있고 따로 명시적으로 생성자를 선언하지 않으면

컴파일러가 암시적으로 생성자를 선언한다.

하지만 이런 암시적인 생성자 선언은 원치 않는 상황이 발생할 수도 있으므로 

상황에 따라 명시적으로 선언하는 것이 좋다.

 

생성자의 종류는 크게 세 가지로 분류할 수 있다.

 

기본 생성자

타입 변환 생성자

기타 생성자

 

이 중에서 기본 생성자는 객체가 생성될 때 암시적이든 명시적이든 무조건 한 번은 호출되는

생성자이다. 사용자가 명시적으로 생성자를 선언하지 않으면 컴파일러가 암시적으로 생성하지만

사용자가 기본 생성자 포함 아무 생성자나 명시적으로 선언하면 컴파일러는 더 이상 기본 생성자를 

암시적으로 생성하지 않는다. 그렇기 때문에 다른 생성자를 직접 선언했다면 기본 생성자 또한 

명시적으로 선언해주어야 한다.

 

 

객체지향의 중요한 특성 세 가지는 다음과 같다.

상속성, 은닉성, 다형성

 

일단 상속성부터 정리해보자.

상속은 말 그대로 자식 객체가 부모 객체의 정보들을 그대로 물려받는 것을 의미한다.

즉 부모 객체의 멤버 함수나 멤버 변수들을 그대로 사용할 수 있다.

class a

{

public:

~~~~

}

 

class b : public a // 부모 a, 자식 b

{

 

}

 

위와 같이 상속을 선언할 수 있다. 부모 객체는 a이고 자식 객체는 b이다.

부모가 물려준 정보들을 그대로 사용할 수도 있고 아니면 자식 객체에서 해당 정보들을

재정의해서 사용할 수도 있다.

 

상속에서의 생성자와 소멸자의 개념도 조금 달라진다.

다른 함수나 변수 같은 경우 부모의 정보들을 그대로 받아와서 사용하지만 생성자의 경우는 

자식 객체에서 자식 생성자가 실행되기 직전(선처리 영역)에 부모의 생성자를 호출하고 그 이후에 

자식의 생성자를 실행한다. 소멸자 같은 경우 자식 소멸자가 먼저 실행되고 그 후에 부모의 소멸자를 호출한다.

 

두 번째로 은닉성에 대해 알아보자.

객체에서의 은닉성은 외부에 노출 시키면 안 되는 중요한 함수 등을 감추기 위해서 

사용한다. 예를 들어 객체 안에서만 해당 함수를 호출할 수 있다거나 자신 혹은 자식 객체에게만

함수 접근을 허용하는 경우가 있다. 이러한 은닉성은 아래와 같이 크게 세 가지로 구현할 수 있다.

 

public, protected, private

 

위 세가지는 영어 뜻과 기능이 흡사하다.

public은 어디에서든지 객체 내부의 함수를 호출할 수 있다. 누구나 접근이 가능하다. 

protected는 public과 private의 중간 역할을 하는 것으로 객체 자신 및 자식 객체에 한하여 

함수에 접근이 가능하다.

private는 객체 내부에서만 함수 호출이 가능하고 자식 및 외부에서는 접근이 불가능하다.

 

은닉성은 객체 내부에서만 사용하는 것이 아니라 상속을 할 때에도 사용된다.

부모 객체를 받아올 때 어떤 타입으로 받아오냐에 따라 자손들에게 부모 객체 정보 사용을 

허용할지 숨길지 결정할 수 있다. 

 

세번째로 다형성이 있다. 

다형성은 겉은 똑같지만 기능이 다르게 동작하는 것을 말한다.

다형성에는 오버로딩과 오버라이딩이 있다.

오버로딩은 함수의 이름을 재사용하는 것을 말하며

오버라이딩은 부모 클래스의 함수를 자식 클래스에서 재정의하는 것을 말한다.

 

또한 다형성에는 정적 바인딩, 동적 바인딩이라는 개념이 있고 

일반 함수가 정적, 가상 함수가 동적 바인딩을 사용한다.

객체 타입 변수를 여럿 생성하고 해당 변수들을 통합적으로 관리 및 사용할 때 사용되는데

가상 함수는 객체 타입에 따라 해당 객체의 주소를 따로 저장해놓고 호출할 때 해당 객체 타입에 맞는

객체로 이동해 내부에 있는 함수를 호출할 수 있다. 즉 부모 객체 내부의 함수가 호출되는 일반 함수와 달리

가상 함수는 객체 타입에 맞는 자식 객체 내부로 이동해서 자식 객체 내부에 오버라이딩된 함수를 호출할 수 있다는

소리이다. 

이와 관련해서는 차근 차근 실습을 해보면서 좀 더 공부해보자.

 

 

 

 

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

연산자 오버로딩  (0) 2022.06.18
초기화 리스트  (0) 2022.06.17
알고리즘 연습문제  (0) 2022.06.11
자주 쓰이는 함수  (0) 2022.06.08
Text RPG ver.2 (포인터, 참조 등 활용)  (0) 2022.06.08

+ Recent posts