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 )
객체( 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://brownbears.tistory.com/407