모두의 코드 4-1장을 공부하며 정리한 노트.

컴퓨터 언어의 발달

  1. 어셈블리어
  2. Cobol, Fortran, Basic 등 2세대 언어
  3. 절차 지향 언어 (Procedural Programming like C language)
  4. 객체지향 언어 (C++, Java, Python, C#..)
    • 프로그램의 크기가 예전보다 훨씬 커짐.
    • 새로운 패러다임이 필요해 개발됨

객체란?

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

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

Animal animal;
// 초기화 과정 생략
 
animal.food += 100;         // --> 불가능
animal.increase_food(100);  // --> 가능

animal.increase_food(100); 의 경우 animal 객체의 ‘인스턴스 함수’를 통해서 값을 수정. 이렇게 인스턴스 메소드를 통해 간접적으로 조절하는 것을 캡슐화(Encapsulation)이라고 부른다.

클래스

객체의 ‘설계도’

#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   : " << food << std::endl;
    std::cout << "이 동물의 weight : " << weight << std::endl;
  }
};  // 세미콜론 잊지 말자!
 
int main() {
  Animal animal;
  animal.set_animal(100, 50);
  animal.increase_food(30);
 
  animal.view_stat();
  return 0;
}

private vs public

  • private keyword: 객체 내부에서만 접근 가능
  • public keyword: 객체 밖에서 접근 가능
// Quiz 4-1. Calculate Calendar
#include <iostream>
 
using namespace std;
 
class Date {
  int year_;
  int month_;
  int day_;
 
 public:
  void CalcDate(int day_temp, int max_day) {
    if (day_temp <= max_day) {
      day_ = day_temp;
    } else {
      AddMonth(1);
      day_ = day_temp - max_day;
    }
  }
  void SetDate(int year, int month, int date) {
    year_ = year;
    month_ = month;
    day_ = date;
  }
  void AddDay(int inc) {
    // day_ += inc;
    int day_temp = day_ + inc;
 
    switch (month_) {
      case 1:
      case 3:
      case 5:
      case 7:
      case 8:
      case 10:
      case 12:
        CalcDate(day_temp, 31);
        break;
      case 2:
        CalcDate(day_temp, 28);
        break;
      case 4:
      case 6:
      case 9:
      case 11:
        CalcDate(day_temp, 30);
        break;
    }
  }
  void AddMonth(int inc) {
    // month_ += inc;
    int month_temp = month_ + inc;
    if (month_temp > 12) {
      ++year_;
      month_ = month_temp - 12;
    } else {
      month_ = month_temp;
    }
  }
  void AddYear(int inc) { year_ += inc; }
 
  void ShowDate() {
    cout << year_ << "." << month_ << "." << day_ << " " << endl;
  }
};
 
int main() {
  Date date;
  int now_year, now_month, now_day;
 
  cout << "Current year: ";
  cin >> now_year;
  cout << "Current month: ";
  cin >> now_month;
  cout << "Current day: ";
  cin >> now_day;
 
  // date.SetDate(2025, 7, 3);
  date.SetDate(now_year, now_month, now_day);
  date.ShowDate();
 
  // date.AddDay(3);
  // date.ShowDate();
 
  cout << "Current date is: ";
  date.ShowDate();
  // cout << "After 2years, 3months, 5days.. " << endl;
 
  int inc_year, inc_month, inc_day;
  cout << "\nAfter nth year: ";
  cin >> inc_year;
  cout << "After nth month: ";
  cin >> inc_month;
  cout << "After nth day: ";
  cin >> inc_day;
 
  date.AddDay(inc_day);
  date.AddMonth(inc_month);
  date.AddYear(inc_year);
 
  date.ShowDate();
}
 

한계: 윤년과 한 달 이상 넘어가는 날짜 더하기는 처리하지 않음