본문 바로가기
Script/C++

[C++] Chapter 04. 객체지향 여행

by song.ift 2023. 5. 12.

객체지향의 시작

💡 절차(procedural)지향 프로그래밍
      procedure = 함수
      어떤 절차를 지켜야된다의 절차라기 보다는 함수기반이 메인이되는 프로그래밍 방식

C++도 객체지향 프로그래밍이냐? 애매하다

C++에서 C에서 파생되어서 여러 문법들이 추가되면서 생겼다보니까 엄밀히 말해 혼혈화 같은 느낌이다.

// 데이터 + 가공(로직, 동작)

// 객체지향 = 객체

// 객체란? 플레이어, 몬스터 GameRoom

 

생성자와 소멸자

// 클래스에 소속된 함수들을 멤버 함수라고 함

// 이 중에서 굉장히 특별한 함수 2종이 있는데, 바로 [시작]과 [끝]을 알리는 함수들

// - 시작(탄생) -> 생성자 (여러 개 존재 가능)

// - 끝(소멸) -> 소멸자 (오직 1개만)

소멸자는 main 함수가 끝난 다음에 호출이 되었다.

 

생성자 중에 기본 생성자, 복사 생성자가 있지만,

이 중에서 인자를 1개만 받는 [기타 생성자]를

[타입 변환 생성자] 라고 부르기도 함

Knight(int hp)
{
    Hp = 1;
}

void main()
{
    Knignt k5;
    K5 = 1;
    // 암시적 형변환처럼 형변환이 자동으로 일어나서 **[타입변환 생성자]**를 호출한다.
}

그래서 컴파일러가 알아서 형변환을 하니까 이럴 떄 명시적으로 사용할 수 있게 explicit 키워드를 붙여주면 된다.

그러면 K5 = (Knight)1; 로 명시적 형변환을 해서 호출할 수 있다.

 

상속성

class Player
{
    Public:
        int hp;
        int hp2;
        int hp3;
}

class knight : public Player
{
    int attack;
}

메모리는 Player는 12바이트. Knignt는 자신 멤버 4바이트를 플러스한 16바이트.

일반함수는 상속을 받아서 기능 그대로 사용할 수 있지만, 생성자 소멸자는 고유로 가지고 있다.

그래서 객체를 생성하고 소멸할 때, 부모생성자->자식생성자->자식소멸자->부모소멸자 로 호출되는 것이다.

 

생성자보다 먼저 호출되는 선(먼저) 처리 영역이 있다.

바로 이니셜라이저

Kningt()
    : Player(100)
{
    Hp = 5;
}

원래라면 Player의 기본생성자가 호출되는데, 이니셜라이저를 통해 Player(100) 이라는 직접 만든 인수가 있는 생성자를 호출함.

 

은닉성

💡 객체지향 (OOP Object Oriented Programming)

  • 상속성
  • 은닉성
  • 다형성

은닉성 = 캡슐화

은닉성이라하기도하고 캡슐화라기도 하다.

몰라도 되는 것은 깔끔하게 숨기겠다.

숨기는 이유?

  1. 정말 위험하고 건드리면 안되는 경우
  2. 다른경로로 접근하길 원하는 경우

캡슐화

연관된 데이터와 함수를 논리적으로 묶어놓은 것

 

다형성 #1

바인딩(Binding) – 묶는다

  • 정적 바인딩(Static Binding) : 컴파일 시점에 결정
  • 동적 바인딩(Dynamic Binding) : 실행 시점에 결정

바인딩이라 함은 컴파일러가 코드를 기계언어로 해석하게 되는데 어떤 함수를 호출하면, 어떤 함수를 호출해야되는지 매핑해야되는데 그게 바인딩

  • 일반 함수는 정적 바인딩.
  • 동적 바인딩 -> 가상 함수.

 

다형성 #2

그런데 실제 객체가 어떤 타입인지 어떻게 알고 알아서 가상함수를 호출해준걸까?

가상 함수 테이블 (vftable)

  • 가상 함수 테이블도 일종의 주소 테이블.
  • 가상 함수가 갖고있는 값이 주소고, 그 주소에는 자신이 호출해야하는 가상 함수들의 주소를 들고있는 테이블.
  • 가상 함수 테이블 주소를 타고가면 호출해야 될 함수들의 주소가 있다.
  • .vftable 비트 환경에 따라 4바이트, 8바이트
  • 그에 따른 클래스 메모리도 늘어남.

가상 함수 테이블을 채우는 주체는 누구인가

클래스 생성자

댓글