[내일배움캠프/C++] 객체 지향 프로그래밍

김세희·2025년 5월 29일

✍️Today I Learned

  1. 객체 지향 프로그래밍
    • 상속
    • 다형성
  2. 객체 설계
    • 가상 함수
    • 추상 클래스

상속

C++의 class는 C의 struct를 확장하여 객체 지향적 특성을 추가한 개념이다.

공통적으로 가지는 특성을 갖는 기본 클래스를 구현하고 이를 상속받는 파생 클래스를 만들어 개별적인 특성을 구현한다.
기본 클래스-> 부모 클래스
파생 클래스-> 자식 클래스

접근제어

protected: 부모 클래스에서 멤버 변수를 private으로 제어하면 자식 클래스에서 접근이 안됨. protected는 상속 받은 클래스에서는 접근이 되지만 외부에서는 접근할 수 없다.

생성자

자식 클래스의 생성자는 부모 클래스의 생성자를 호출할 수 있다. 부모 클래스의 생성자가 자식 클래스 생성자보다 먼저 호출 된다.

class Base{		// 부모 클래스
	Base(int x, int y){}
};

class Derived : public Base{	//Base의 자식 클래스
	Derived() : Base(3, 4){}
};
// Derived() 호출-> Base(3, 4) 호출 및 코드 실행-> Derived() 코드 실행
class Derived : public Base

public 부모 클래스의 의미
public이 뜻하는 건 부모 클래스에 있는 public에 속해 있던 건 상속할 때 public으로
protected는 protected로 private은 상속되지 않는다.
protected를 쓰면 부모 클래스에 있던 public은 자식 클래스에서는 protected로 되고
private를 쓰면 부모 클래스에 있던 public은 자식 클래스로 상속되지 않는다.

다형성

: 기본이 되는 클래스를 만들어 함수의 공통된 인터페이스를 정의하고 실제 구현은 파생 클래스에서 담당하게 하는 기법

가상 함수

이때 동적 바인딩을 통해 실제 호츨된 객체의 타입에 따라 해당 파생 클래스의 함수가 실행되도록 하려면 기본 클래스의 함수 앞에 virtual 키워드를 붙여야한다.

기본 클래스에서 함수에 virtual 을 붙여 선언하면 가상 함수 테이블이 생기고 테이블에 각각 파생 클래스에서 재정의한 함수 주소가 포함되어 동적 디스패치가 가능해진다.

.연산자: class 멤버에 접근
->연산자: 객체 포인터로 가리키는 객체의 멤버

순수 가상 함수

기본 클래스에서 구현하지 않고 반드시 파생 클래스에서 구현하도록 강제하는 가상 함수이다. 인터페이스는 필요하지만 기본 클래스에서 구현할 필요가 없는 경우 사용한다. 파생 클래스에서 구현하지 않으면 에러가 발생한다.

에러 발생 이유

추상 클래스의 순수 가상 함수를 파생 클래스에서 재정의하지 않으면 순수 가상 함수를 그대로 내려받아 파생 클래스도 추상 클래스가 되고 인스턴스화 할 수 없어 에러가 발생할 수 있다.

순수 가상 함수의 정의

가상 함수를 정의하고 = 0 붙여주면 된다.
virtual int memFunc() = 0;

추상 클래스

순수 가상 함수를 하나 이상 포함하는 클래스
직접 인스턴스를 생성할 수 없고 포인터나 레퍼런스를 통해서 특정 객체를 가리킬 수 있다.

0개의 댓글