OOP - (4) 멤버 함수
Implementing Member methods
◆ 멤버 함수의 구현
● 기존 함수의 구현과 유사
● 멤버 변수에 접근이 가능하기 때문에 인자로 전달할 데이터가 적어진다.
● 클래스 선언 내에 구현 가능하다
☞ inline 구현
● 클래스 선언 외부에서도 구현 가능하다
☞ class_name::method_name
● 명세(specification)와 구현의 분리
☞ 클래스 선언은. h 파일에 작성
☞ 클래스의 구현은 .cpp 파일에 작성
class Account {
public:
bool Withdraw(double amount) // 출금
{
if (balance - amount < 0)
return false;
balance -= amount;
return true;
}
bool Deposit(double amount)// 입금
{
balance += amount;
}
private:
string name; // 예금주 이름
double balance = 0; // 계좌 잔액
};
int main()
{
Account kim_Account;
kim_Account.Deposit(100);
Account* lee_Account = new Account();
lee_Account->Deposit(200);
delete lee_Account;
}
Account Class 안에서 kim 과 lee가 각각 따로 할당되어 있기에
balance를 입력해도 각자의 balance 값이 저장이 된다.
balance 값은 private로 선언 되었기 때문에 클래스 내에 함수(. Deposit)에서 구현된다.
클래스 외부에서도 구현이 가능하다.
일반적으로 헤더와 클래스를 구분하여 진행한다.
◆ 클래스 선언 내에 구현
class Account
{
public:
void SetBalance(double bal)
{
balance = bal;
}
double GetBalance()
{
return balance;
}
private:
double balance;
};
◆ 클래스 선언 외부에 구현
class Account
{
public:
void SetBalance(double bal);
double GetBalance();
private:
double balance;
};
void Account::SetBalance(double bal)
{
balance = bal;
}
double Account::GetBalance()
{
return balance;
}
이젠 SetBalance(double) 과 double GetBalance()가 멤버 함수
balance 가 멤버 변수인지 알아야한다.
멤버 함수에 프로토 타입만 선언한다.
바디 없이 세미콜론으로만 끝났다.
실제 함수 구현은 클래스 밖에 있다.
실제 함수 동작을 클래스 밖에 적어놓았다.
GetBalance(double) 함수 앞에 Account:: 을 붙여주어
Account의 멤버 함수라는 것을 알려준다.
std:: 와 동일한 "::"은 namespace 안에 있는 사항을 명시하기 위해 사용하거나,
클래스 안에 있는 함수를 설명할 때에도 사용한다.
class Account {
public:
bool Deposit(double amount);
bool Withdraw(double amount);
private:
string name; // 예금주 이름
double balance = 0; // 계좌 잔액
};
bool Account::Deposit(double amount)
{
balance += amount;
}
bool Account::Withdraw(double amount)
{
if (balance - amount < 0)
return false;
balance -= amount;
return true;
}
Account 클래스 밖에다가 함수를 선언해도 문제가 없다.
고급 Part이다.★★★
◆ 명세와 구현의 분리
● 헤더 파일(.h)
☞ Include guard를 통해 전처리기에서 중복적인 헤더 파일의 선언을 방지
대부분 클래스와 똑같은 이름으로 헤더파일을 만드는 경우가 많다.
● 구현 파일(. cpp)
● 메인 파일(main.cpp)
Struct vs Class
◆ 구조체와 클래스
● C++에서는 구조체와 클래스 모두 사용 가능
● 문법적으로는, 기본 접근 권한의 차이 외에는 차이점이 존재하지 않음
☞ 클래스 : 명시되어 있지 않으면 private 이 기본 값
☞ 구조체 : 명시되어 있지 않으면 public 이 기본 값
class Person
{
string name;
string GetName();
};
int main()
{
Person p;
p.name = "Kim"; // ERROR!
cout << p.GetName(); // ERROR!
}
struct Person
{
string name;
string GetName();
};
int main()
{
Person p;
p.name = "Kim"; // OK
cout << p.GetName(); // OK
}
c에서는 구조체에서 함수를 구현하는 게 안되지만,
c++에서는 구조체에 멤버 변수와 멤버 함수가 선언이 가능하다.
◆ 구조체와 클래스 사용 가이드라인
● 구조체
☞ Public 접근이 필요한 데이터로 사용
☞ 멤버 함수를 구조체 안에 설정하지 않는 것을 권고
● 클래스
☞ Private 멤버 변수와 멤버 함수
☞ 멤버 함수를 통해서 멤버 변수에 접근하도록 get/set 구현
(Summary) Class and Object
◆ 클래스란? (사용자 정의 자료형, 객체의 틀, 데이터 + 함수)
◆ 객체란? (클래스를 기반으로 만들어진 객체)
◆ 클래스의 선언과 객체의 생성
◆ 접근 제한자 (private, public , protected)
◆ 멤버 변수와 멤버 함수 (멤버 함수는 멤버 변수에 바로 접근 가능)
◆ 명세와 구현의 분리 (.h 파일에 명세, .cpp 파일에 구현 소스)
◆ 구조체 vs 클래스 (동일한 문법, 기본 접근 권한이 다르다)
https://youtu.be/gvQBpKA2ObA?si=2tacE9XPv42v2zrf