본문 바로가기

코딩 농장/C 언어

C++ 프로그래밍

C++은 기존의 C언어로부터 객체 지향 프로그래밍을 지원하기 위해 만들어진 언어이다. C++은 효율적이면서도 크기가 작고 실행속도가 빠르며 호환성이 뛰어난 C언어의 특성에 추가로 객체 지향 프로그래밍 특성을 더하였다.

1. C++의 특징

a. 절차 언어(Procedural Language) 방식 : 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시 된다.

b. 객체 지향 언어(Object-Oriented Language: OOP) 방식 : 클래스( Class ) 라는 특성을 추가함으로써 객체 지향적인 언어 방식 표현 가능하다. 

c. 템플릿(Template)을 이용한 일반화 프로그래밍(Generic Programming) 방식 : 목적은 데이터 타입과 무관한 코드를 작성하는 것이다. ( 하나의 템플릿으로 여러 데이터 타입을 처리 가능 ) 이를 위해 템플릿( Template ) 을 사용하여 일반형을 통해 함수나 클래스를 정의한다. 또한 유용한 템플릿의 모음임 표준 템플릿 라이브러리( STL: Standard Template Library ) 을 사용할 수 있다.

2. C 와 구분되는 점

a. 함수 다중정의 : 동일명의 함수에 인수의 개수나 자료형이 다른 함수를 사용할 수 있다.

#include <iostream>
using namespace std;
int add(int, int);
double add(double, double);
int main(void) {
 cout<<"Result 1 : "<<add(5,10)<<endl;
 cout<<"Result 2 : "<<add(5.2,10.3)<<endl;
 return 0;
}
int add(int a, int b){
 return a+b; 
}
double add(double a, double b){
 return a+b; 
}

add 라는 함수는 int 형이 들어왔으면 int 형 반환을, double 형이 들어왔으면  double 형 반환을 해준다.

b. 동적 메모리 할당 및 해제 

먼저 메모리 구조에 대한 설명 : http://tcpschool.com/c/c_memory_structure

스택( stack ) : 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다. 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.

힙( heap ) : 사용자가 직접 관리할 수 있는 '그리고 해야만 하는' 메모리 영역이다.

C++ 에서는 new 로 메로리를 할당하고 delete 를 사용하여 해제한다.

#include <iostream>
#include <string>
using namespace std;
struct student{
 int id;
 char name[10];
};
int main() {
 student *s = new student;
 int *t = new int[10];
 s->id = 1;
 strcpy(s->name, "홍길동");
 cout<<"id : "<<s->id<<", name : "<<s->name<<endl;
 
 for(int i=0;i<10;i++)
 t[i] = i;
 for(int j=0;j<10;j++)
 cout<<t[j]<<endl;
 delete s;
 delete[] t;
 return 0;
}

c. 참조 호출 ( Call by Reference ) : 이름이 다른 변수가 같은 메모리 번지를 가리키도록 하는 것이다. 포인터와는 다른점이 있는데 참조 호출은 별도 메모리를 할당하지 않는다. 즉 변수의 별명을 정하는 것이다.

주의할 점

1. 처음의 누구의 별명이 될 지 정해줘야 한다.

2. 한 변수의 별명이 되면 다른 변수의 별명이 될 수 없다.

또한 우리는 함수를 사용할 때 매개변수로 참조자를 사용할 수 있다.

#include <iostream>

int change_val(int &p) {	입력 받은 매개변수로 &p 라는 참조자 생성
  p = 3;

  return 0;
}
int main() {
  int number = 5;

  std::cout << number << std::endl;
  change_val(number);
  std::cout << number << std::endl;
}

3. 상수에 대한 참조자

#include <iostream>

int main() {
  int &ref = 4;

  std::cout << ref << std::endl;
}

위에서 상수 값 자체는 리터럴이기 때문에 참조할 수 가 없다. 만약 참조가 된다고 한다면 ref = 5 로 4 = 5 라는 기이한 결과가 나오기 때문이다.

#include <iostream>

int main() {
  const int &ref = 4;

  std::cout << ref << std::endl;
}

 만약 위처럼 const int &ref = 4; 로 선언해 준다면 사용 가능하다.

d. 구조체( Structure ) 와 클래스( Class )

                    C언어 구조체 사용                                                                                                 C++ 구조체 사용 

객체( Object ) : 서로 관련되어 있는 데이터( 멤버 변수 )와 이를 조작하기 위한 함수( 멤버 함수 )로 구성되어 있다. 클래스로 생성한 인스턴스 변수( instance variable ) 와 인스턴스 메소드( instance method ) 라고도 부른다. 또한 객체가 가지고 있는 속성 또는 특성을 상태( State ), 객체가 가지고 있는 기능 또는 할 수 있는 반응 양식을 행동( Behavior ) 이라고 한다.

객체의 구성

클래스( Class ) : 클래스는 객체를 만드는 설계도 즉 빈 껍질이다. 

클래스의 구성

 

#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;
}

위에 클래스, 객체 사용 코드가 있다.

1. Animal 클래스를 통해서 생성될 객체는 food, weight 라는 변수가 있고, set_animal, increase_food, view_stat 이라는 함수들이 있는데, Animal 클래스 상에서 이들을 지칭할 때 각각 멤버 변수(member variable) 과 멤버 함수(member function) 라고 부른다.

2. Animal 클래스를 통해 인스턴스 = 객체를 만들면 객체 상에서 인스턴스 변수와 인스턴스 함수라고 부른다. 

클래스 사용 

#include <iostream>

class Date {
  int year_;
  int month_;  // 1 부터 12 까지.
  int day_;    // 1 부터 31 까지.

 public:
  void ShowDate();

  Date() {
    std::cout << "기본 생성자 호출!" << std::endl;
    year_ = 2012;
    month_ = 7;
    day_ = 12;
  }

  Date(int year, int month, int day) {
    std::cout << "인자 3 개인 생성자 호출!" << std::endl;
    year_ = year;
    month_ = month;
    day_ = day;
  }
};

void Date::ShowDate() {
  std::cout << "오늘은 " << year_ << " 년 " << month_ << " 월 " << day_
            << " 일 입니다 " << std::endl;
}
int main() {
  Date day = Date();
  Date day2;
  Date day3(2012, 10, 31);

  day.ShowDate();
  day2.ShowDate();
  day3.ShowDate();

  return 0;
}

위 코드에서처럼 객체를 생성할 때 함수의 오버로딩을 이용해 여러 방법으로 생성할 수 있다. default 값을 줄 수도 안 줄 수도 있다. 

출처 및 참고 글

https://modoocode.com/

https://brownbears.tistory.com/407