객체지향의 시작
💡 절차(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
바인딩(Binding) – 묶는다
- 정적 바인딩(Static Binding) : 컴파일 시점에 결정
- 동적 바인딩(Dynamic Binding) : 실행 시점에 결정
바인딩이라 함은 컴파일러가 코드를 기계언어로 해석하게 되는데 어떤 함수를 호출하면, 어떤 함수를 호출해야되는지 매핑해야되는데 그게 바인딩
- 일반 함수는 정적 바인딩.
- 동적 바인딩 -> 가상 함수.
다형성 #2
그런데 실제 객체가 어떤 타입인지 어떻게 알고 알아서 가상함수를 호출해준걸까?
가상 함수 테이블 (vftable)
- 가상 함수 테이블도 일종의 주소 테이블.
- 가상 함수가 갖고있는 값이 주소고, 그 주소에는 자신이 호출해야하는 가상 함수들의 주소를 들고있는 테이블.
- 가상 함수 테이블 주소를 타고가면 호출해야 될 함수들의 주소가 있다.
- .vftable 비트 환경에 따라 4바이트, 8바이트
- 그에 따른 클래스 메모리도 늘어남.
가상 함수 테이블을 채우는 주체는 누구인가
– 클래스 생성자
'Script > C++' 카테고리의 다른 글
[C++] Chapter 06. 함수 포인터 (0) | 2023.05.12 |
---|---|
[C++] Chapter 05. 크러쉬가 나는 오작동 현상 (0) | 2023.05.12 |
[C++] Chapter 03. 포인터#2 (포인터 vs 배열) (0) | 2023.05.11 |
[C++] Chapter 02. 포인터#1 (기초, Reference) (1) | 2023.05.11 |
[C++] Chapter 01. 함수 (1) | 2023.05.11 |
댓글