만들 때 필요한 값을 빠뜨리지 않아요
앞 레슨은 객체를 만든 다음 멤버마다 값을 넣었어요. 처음 값이 꼭 필요한 객체라면 만드는 순간에 받도록 정할 수 있어요. 생성자는 객체를 만들 때 한 번 실행하는 초기 설정이에요.
class Account {
public:
int balance;
Account(int initial) : balance(initial) {}
};
생성자 이름 Account는 클래스 이름과 같아요. 일반 함수의 int 같은 반환형을 붙이지 않아요. Account account(12);는 정수 12를 받아 balance가 12인 객체를 만들어요.
초기화 목록은 멤버의 처음 값을 정해요
: balance(initial)에서 앞의 balance는 만들 멤버이고 괄호의 initial은 생성자가 받은 값이에요. 이 부분을 초기화 목록이라고 불러요. 먼저 초기화 목록으로 멤버를 만들고, 그다음 {} 안의 생성자 본문을 실행해요. 여기서는 본문이 비어 있어요.
Account first(12); Account second(5);를 만들면 first.balance는 12, second.balance는 5예요. Account라는 같은 종류여도 실제 객체마다 자기 balance를 따로 가져요. first를 바꾼다고 second가 따라 바뀌지 않아요.
반환하는 함수와 값을 바꾸는 함수를 구분해요
Account의 public 아래에 다음 멤버 함수를 추가해요.
void add(int amount) { balance += amount; }
int read() { return balance; }
void는 반환값이 없다는 뜻이에요. add는 객체의 잔액을 바꾸고, read는 현재 잔액을 정수로 읽어요.
| 실행 | first 잔액 | second 잔액 |
|---|---|---|
| first(12), second(5) 생성 | 12 | 5 |
| first.add(3) | 15 | 5 |
| second.read() | 15 | 5 |
마지막 읽기 뒤 first가 바뀌었을까요? read는 현재 값을 돌려줄 뿐 바꾸는 문장이 없어요. 과제에서 어느 객체에 add를 호출하는지 구분해요.
직접 풀어봐요
Account 객체 A는 initialA원, B는 initialB원으로 생성해요. A에만 added원을 더한 다음 A의 잔액−B의 잔액을 반환해요. 제공 생성자·add·read를 사용해 객체별 상태를 읽어요.
initialA·initialB·added는 각각 0~1000이에요. 잔액 차이인 반환값은 음수일 수 있어요. 실행용 입력은 initialA initialB added, 출력은 반환값이에요. 하네스가 입출력을 처리해요.
예시 1: (10,4,3) → 9. A는 13원, B는 4원이라 차이는 9예요.
예시 2: (2,9,1) → -6. A는 3원이고 B는 9원 그대로라 차이는 −6이에요.
예시 입력
10 4 3
예상 결과
9
예시 입력
2 9 1
예상 결과
-6
핵심 개념
oop-inheritance-poly: 생성자로 시작값을 정하고 객체별 변화를 따로 읽어요.