Lecture Plan
◆ OOP 개요
◆ 클래스와 객체
◆ 생성자와 소멸자
◆ 생성자 오버로딩
◆ 복사 생성자
◆ this, const, static, friend
◆ (이동 생성자)
지난 시간 Remind
OOP 개요 -> 절차적 프로그래밍과의 비교, 데이터 + 기능이다.(함수)
특징으로는 캡슐화 정보 은닉 등이 있다.
클래스와 객체 -> 데이터와 기능을 묶어 놓은 것이 클래스이며,
클래스를 메모리에 올라가는 것은 객체이다.
또한 멤버 함수와 멤버 변수가 있다.
생성자와 소멸자 -> 클래스를 생성할 때 / 소멸될 때 자동으로 호출되는 멤버 함수
반환형이 없고, 함수의 이름과 클래스의 이름이 같으면 생성자이고,
소멸자는 앞에 ~연산자가 붙는다.
생성자에서 강조할 부분은 멤버 초기화 리스트 문법이 있다.
:~{}, ~{} 기억해야한다.
생성자 오버로딩 -> 생성자는 오버로딩 가능하고 소멸자는 오버로딩이 되지 않는다.
인자를 다르게 받는 생성자를 만들어서 활용한다.
기본 값들 기본 파라메터, 생성자 위임도 배웠다.
Copy Constructor
◆ 복사 생성자 개요
◆ 기본 복사 생성자
◆ 얕은 복사 vs 깊은 복사
복사 생성자가 뭔지? 기본 복사 생성자가 뭔지
얕은 복사 깊은 복사의 차이가 뭔지 알아본다.
중요한 Part이다.★★★★★
◆ 복사 생성자
● 객체가 복사될 때는, 기존 객체를 기반으로 새로운 객체가 생성된다.
● 객체가 복사되는 경우
1. 객체를 pass by value 방식으로 함수의 매개변수로 전달할 때
2. 함수에서 value의 형태로 결과를 반환할 때
3. 기존 객체를 기반으로 새로운 객체를 생성할 때
● 객체가 어떤 방식으로 복사될지 정의해 주어야 한다.
☞ 사용자가 구현하지 않는 경우 컴파일러에서 자동으로 복사 생성자를 정의한다.
◆ 왜 중요한가?
● 복사 과정에서 문제가 발생할 수 있다.(포인터가 존재하는 경우)
● 복사 비용에 대한 인식(클래스는 많은 데이터를 포함할 수 있다.)
생성자의 한 종류이다.
생성자라고 하면 자동으로 호출되는 함수라는 의미이다.
객체가 복사될때 자동으로 호출되는 함수이다.
변수의 값이 복사될때 remind가 필요하다.
객체들을 변수라고 바꿔서 생각하자.
pass-by-value 방식이란 함수에다가 인자를 넘길 때
포인터, 참조자도 아니고
func(int a)라고 전달할 때 pass-by-value 방식으로 넘긴다고 하였다.
main함수에 func() 함수 호출하게되면
a라는 변수에 값이 복사가 된다.
기존 방식에서 값 복사가 이렇게 진행되는 것 처럼 객체도 비슷하다.
객체로 인자를 받아도 동일하게 pass-by-value 방식으로 넘어간다.
또한 함수에서 value 형태로 결과를 반환할 때에도 복사가 일어난다.
func()에 값이 있을때 b라는 변수에 return값을 받은 경우에는
a = 10이라는 값이라면 main 함수도 10으로 반환값을 얻는다.
반환값을 받아도 값 복사가 된다.
1번 2번은 변수를 사용할때에도 동일하게 복사가 사용되었는데
객체를 사용하였을때도 동일하게 복사가 된다.
int 같은 경우는 복사가 될 때 컴파일러가 알고 있다.
객체 같은 경우는 복사를 어떻게 해야 할지 컴파일러가 자동으로 알기 어렵다.
클래스의 객체를 복사할때 어떻게 복사를 해야 할지 구현해야 한다.
안전장치는 컴파일러에서 자동으로 복사 생성자를 만들어준다.
생성자의 특징과 동일하다.
자동으로 복사 생성자를 하면 부족한 경우가 있어서 직접 만드는게 좋다.
왜 중요할까? 멤버 변수로 포인터가 존재하는 경우 복사 과정에서 문제가 발생할 수 있다.
복사 비용에 대한 인식이 필요하다. 클래스 안에는 많은 데이터(멤버 변수)를 생성할 수 있다.
일일이 멤버 변수를 다 복사하게 되면 복사 비용이 커질 수 있다.
Const 참조자를 사용하는 이유중에 복사 비용이 있었기에 remind 진행할 것.
https://wjplorer.tistory.com/9
C++ 함수 Pass-by-Value
#include using namespace std;int add_numbers(int, int); // prototypeint main(){ int result = 0; result = add_numbers(100, 200); // function call with argument cout C++ 함수는 프로토파입을 main 함수 앞에 선언해야 한다.함수의 매개
wjplorer.tistory.com
https://wjplorer.tistory.com/12
c++ 배열의 전달과 pass-by-reference
◆ 배열을 함수로 전달 ● 형식적 매개변수 정의에 "[ ]" 를 사용하여 배열을 전달 가능함 ● 주의 ※ 배열의 요소들은 복사되지 않는다. ● 배열의 이름은 배열의 첫 요소의 메모리를
wjplorer.tistory.com
remind 하기 좋은 기존 포스팅을 남겨두었다.
◆ 객체가 복사되는 경우
1. Pass by value로 객체 전달 예시
void display_player(Player p)
{
// p is a copy of hero
// use p
} // destructor for p is called
Player hero {0, 0, 1};
display_player(hero);
직접적으로 코드를 이용하여 개념을 보자
display_player()는 멤버 함수인가? -> 멤버 함수이다
display_player() 함수 호출하게 되면 지역 변수 p가 있을거고
Player 클래스 객체에는 health, xp가 있고, 이 항목들을
지역 변수 p에 값 복사를 한다.
활용을 마치고, 함수가 끝나게 된다면 display_player()은 지워진다.
2. value 의 형태로 결과값 반환
Player creat_super_enemy()
{
Player an_enemy{ 1,1,1 };
return an_enemy; // Copy of an_enemy is returned
} // destructor for an_enemy is called.
void main(){
Player enemy;
enemy = creat_super_enemy();
}
멤버 함수 안에 멤버 변수를 반환해서 값 복사가 일어난 경우이다.
3. 기존 객체를 기반으로 새로운 객체를 생성
Player hero{ 1,1,1 };
Player another_hero = hero; // another hero is copy of hero
// or Player another_hero {hero};
hero 객체를 만들고
똑같은 객체를 만들고 싶다면
Player hero{1,1,1};
Player another = hero;
// or Player another{hero}
이렇게 초기화 할 수 있다.
알아두어야 할 사안은
Player another;
another = hero;
이렇게 되어 있는 경우는
위에 문법과는 완전히 다르다.
밑에 문법은 hero 를 another 에 대입 연산자를 사용한것이다.
위에 있는 문법은 hero 를 만들면서 복사 생성자가 나온다.
이때 객체를 생성하면서 대입하는 경우에는 복사 생성자가 호출 된다는걸 기억하자.
https://youtu.be/MLAnRWYvGlE?si=xIy_47TAdDy27mGj
'C++ > C++ : Study' 카테고리의 다른 글
OOP 파트2 - (3) 기본 복사 생성자 (0) | 2024.11.03 |
---|---|
OOP 파트2 - (2) 복사 생성자 (0) | 2024.11.03 |
OOP - (6) 생성자 오버로딩 (0) | 2024.10.28 |
OOP - (5) 생성자와 소멸자 (1) | 2024.10.21 |
OOP - (4) 멤버 함수 (0) | 2024.10.14 |