본문 바로가기
CODING/C++ STUDY

C++ 독학 5일차 - 객체 지향 프로그래밍, 함수의 오버로딩

by pharmerci 2021. 7. 23.
728x90

객체란 변수들과 참고자료로 이루어진 소프트웨어 덩어리이다.

이 때 객체가 현실 세계에서 존재하는 것들을 나타내기 위해 추상화라는 과정이 필요하다.

컴퓨터 상에서 현실 세계를 정확히 나타낼 수 없어서 적절하게 컴퓨터가 처리하도록 바꾸는 것이다.

객체는 자기 정보를 나타내는 변수(instance variable), 이를 가지고 작업을 하는 함수(instance method)로 둘러싸여있다.

 

변수들은 외부로부터 보호되고 있다. 외부에서 어떤 객체의 instance variable 값을 바꾸지 못하고 객체의 instance method로만 값을 바꿀 수 있다는 뜻이다.

이렇게 외부에서는 instance variable 값을 못바꾸고 항상 instance method로 조절하는 것을 캡슐화라고 한다.

캡슐화는 객체 내부가 어떻게 작동하는지 몰라도 사용할 수 있다는 장점이 있다.

 

클래스는 객체의 설계도이다. 클래스를 이용해서 만들어진 객체는 instance이다.

 


#include <iostream>

class animal {
private: 
int food;
int weight;

public:
void set_animal(int _food, int _weight) {
food = _food;
weight = _weight;
}
void increase_food(int inc) {
food += inc;
weight += (inc / 3);
}
void view_stat() {
std::cout << "이 동물의 음식 : " << food << std::endl;
std::cout << "이 동물의 무게 : " << weight << std::endl;
}
};

int main() {
animal ani;

ani.set_animal(100, 50);
ani.increase_food(30);

ani.view_stat();
return 0;
}


이 코드를 작성하여 개념을 이해해보자.

 

일단 실행은 이런식으로 된다.

 

 

메인함수에서는 animal이라는 클래스의 객체 ani를 선언했다. 이외 내용은 주석을 참고하면 된다.

 

 

 

 

이 메인함수 윗쪽에 animal이라는 클래스에 대해서 자세히 살펴보자.

주석에서 잘 설명되어있으니까 읽어보면 된다.

 

 

 

 

 


이 코드는 연도 월 일을 받아서 연도 월 일을 원하는만큼 더하게 하는 코드인데, 클래스를 이용했다.

 

#include <iostream>

class Date {
private: 
int year_;
int month_; //1~12
int day_; //1~31

public:
void SetDate(int year, int month, int date) {
year_ = year;
month_ = month;
day_ = date;
}

void AddDay(int inc) {
day_ += inc;
if (day_ + inc >= 31) {
if (month_ == 1 && month_ == 3 && month_ == 5 && month_ == 7 && month_ == 8 && month_ == 10 && month_ == 12)
day_ = day_ - 31;
else
day_ = day_ - 30;
month_ += 1;
}
}

void AddMonth(int inc) {
month_ += inc;
if (month_ + inc >= 13) {
month_ = month_ - 12;
year_ += 1;
}
}

void AddYear(int inc) {
year_ += inc;
}

void ShowDate() {
std::cout << year_ << " " << month_ << " " << day_ << std::endl;
}
};

int main() {
Date date;
date.SetDate(2021, 7, 22);
date.AddDay(10);
date.ShowDate();

return 0;
}

 

이렇게 활용해서 코드를 짜보았다. Date라는 클래스이고 날짜를 설정하고, 일 월 년을 더할 수 있는 함수를 클래스 내부에서 선언해줬다.

(이거 한번에 성공해서 천재라고 생각했다..ㅋㅋㅋ)

 

 

지금 보니까 add_day를 add_month, add_year을 이용할껄 그랬다 싶긴 하다.. 일단 내용을 아는게 중요하다고 생각할래

 

 


오버로딩

C와 C++의 차이점 중 하나는 오버로드가 있다.

C에서는 하나의 이름을 가지는 함수는 1개밖에 없기 때문에 과부하라는 말이 성립할 수 없었다.

하지만 C++은 같은 이름을 가진 함수가 여러개 있어도 된다. 그러기 때문에 함수 이름에 과부하가 걸려도 괜찮다는 뜻이다.

 

c++에서 같은 이름의 함수를 호출했을 때 함수들을 구분하는 방법은 사용하는 인자 확인이다.

c에서는 같은 이름의 함수를 만들면 컴파일러에서 오류가 발생하겠지만 c++에서는 인자가 다르면 다른함수라고 판단하기 때문에 오류가 생기지 않는다.

 

#include <iostream>

void print(int x) { std::cout << "int : " << x << std::endl; }
void print(char x) { std::cout << "char : " << x << std::endl; }
void print(double x) { std::cout << "double : " << x << std::endl; }

int main() {
int a = 1;
char b = 'c';
double c = 3.2f;

print(a);
print(b);
print(c);

return 0;
}

 

이런식으로 함수들의 인자들은 다르지만 이름은 똑같은데 이 소스코드는 오류가 없다.

 

c++컴파일러에서 함수를 오버로딩하는 과정

1. 자신과 타입이 정확히 일치하는 함수를 찾는다.

2. 정확히 일치하는 타입이 없는 경우 아래와 같은 형변환으로 일치하는 함수를 찾는다.

  • Char, unsigned char, short  int 로 변환된다.
  • Unsigned short  int 의 크기에 따라 int 혹은 unsigned int 로 변환된다.
  • Float  double 로 변환된다.
  • Enum  int 로 변환된다.

3. 2를 거쳐도 일치하는 함수가 없다면 더 포괄적인 형변환으로 일치하는 함수를 찾는다.

  • 임의의 숫자(numeric) 타입은 다른 숫자 타입으로 변환된다. (예를 들어 float -> int)
  • Enum 도 임의의 숫자 타입으로 변환된다 (예를 들어 Enum -> double)
  • 0 은 포인터 타입이나 숫자 타입으로 변환된 0 은 포인터 타입이나 숫자 타입으로 변환된다
  • 포인터는 void 포인터로 변환된다.

이를 거쳐도 일치하는 함수를 못찾으면 오류를 발생시킨다.

복잡한 함수를 오버로딩할 때 중복돼서 나오면 오류가 많이 나오니, 규칙을 정확히 숙지해야 한다.

 

 

 

class안에서 함수를 완전히 정의하지 않고 함수의 이름만 언급한 뒤에 class밖에서 함수를 정의하는 방법도 있다.

Date class 내부 : void setdate(int date);

이렇게만 써놓고

class 외부 : void Date::setdate(int date){ 함수 내용 }

이렇게 쓰는것도 가능하다는 것이다.

 

 

 

생성자

생성자는 객체 생성 시 자동으로 호출되는 함수이다. 이 때 자동으로 호출되면서 객체를 초기화하는 역할을 한다.

 

#include <iostream>

class Date {
int year_;
int month_;
int day_;

public:
함수들

Date(int year, int month, int day) {
year_ = year;
month_ = month;
day_ = day;
}
};

int main() {
Date day(2021, 7, 22);
}

 

여기서 빨간형광펜에 집중해야 한다. 정의를 빨간형광펜과 같이 해주고

나중에 메인함수에서 day라는 객체를 선언함과 동시에 초기화도 해줄 수 있는 것이다.

 

초록색은 Date day = Date(2021, 7, 22); 이렇게도 나타낼 수 있다.

하지만 대부분 위에 초록색을 선호하는 편이다.

 

생성자 역시 함수이기 때문에 함수의 오버로딩이 적용될 수 있다.

 

 

 

 

 

 

(여기에 문제가 달려있는데 꼭 풀어볼것..)

 

https://modoocode.com/173

 

 

 

 

 

728x90