자료구조/알고리즘 클래스와 구조체 1장
LV01 클래스와 구조체
클래스는 추상자료형을 사용하기 위한 표현방법이다.
원래 우리들이 공부했던 자료형 int,char,boolean과 같은 것들을 기본 자료형이라고한다.
플레이어가 탑승하는 경주하는 자동차게임이 있다고 생각을 해보자.
만약 플레이어가 2명이라고 하면 우리는 기본코딩을 아래와 같은 방법으로 해주어야 했을것이다.
이것을 하나의 문장으로 해결 할 수 없을까?라고 생각이 들지 않나? 라는 생각을 해볼 수 있다.
나는 cart1이라는 클래스를 만들어, 하나의문장으로 표현해보았다.
여기서 cart1이라는 것이 자료형 클래스이고, c1,c2라는 이름으로 초기화된 변수들이 객체이다.
이러한 클래스는 사용자 정의형이라고 부른다. C언어의 구조체typedef도 새로운 타입을 만드는것이므로 이것들 모두 사용자 정의형이라고 할 수 있다.
클래스 사용 방법
클래스는 속성(attribute)과 메서드(method)로 이루어져 있다. 위의 카트라이더 예시에서 Cart 클래스를 만드는 경우를 아래와 같이 생각해볼 수 있다.
클래스의 속성은 name, color, speed 이고, 클래스의 메서드는 start, stop, drift 이다. 위와 같이 클래스의 속성과 메서드는 변수와 함수로 표현된다. 속성은 어떤 값을 저장하는 역할을 하기 때문에 변수로 표현되고, 메서드는 기능적인 측면을 표현하는 것이므로 함수로 표현되는 것이다. 클래스 내의 변수와 함수들은 멤버 변수, 멤버 함수라고 부른다.
public 과 private
객체지향프로그래밍은 캡슐화라는 특징을 지닌다. 캡슐화는 객체의속성과 행위를 하나로 묶고, 객체가 가진 데이터를 외부로 감춰 은닉하는것이다. 정보은닉을 위해클래스 내의 멤버를 외부로부터 감추는것은캡슐화의 중요한특징이다.
즉 public은 뜻 그대로 사용할 수 있게 OPEN으로 만들어둔것이고 private는 외부에서 사용할 수 없게 은둔화 시켜놓는것을 의미한다.
참고로, class안의 모든 변수는 private으로 구분을 하며, 만약 public으로 쓰고싶다면 아래와 같은 코드로 사용하여야 한다.
1
2
3
4
5
6
7
8
9
10
class REVEWCODING{
public:
int REVEWCOING;
int REVIEWCODE;
};
int main(){
return 0;
}
위와 같은 코드로 외부에서 REVIEWCODING안의 변수 REVIEWCODING,REVIEWCODE에 접근이 가능하며, public: 이없다면, 외부에서 접근이 되지 않는다.
struct과 class
C에서는 private과 public의 개념이 없이 무조건 외부 접근을 허용한다. C++에서는 구조체 개념이 있어서,private과 public을 지정하고, 구조체를 클래스의 개념과 거의 동일하게 사용할 수 있다. private와 public은 기본접근지정자 라고하는데, class의 기본 접근 지정자는 private , struct의 기본접근 지정자는 public이다.
만약 struct에서 정보 은닉을 시키고싶다면,아래와 같이 하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
struct REVEWCODING{
private:
int REVEWCOING;
int REVIEWCODE;
public :
~
~
};
int main(){
return 0;
}
객체의 생성자와 소멸자
생성자(constructor) 란, 클래스 객체를 생성할 때, 객체의 멤버 변수를 초기화하는 함수이다. 생성자는 객체 생성시 반드시 한 번만 호출된다. 생성자는 일종의 멤버 함수이다. 그래서 함수와 비슷한 특징을 가지며, 생성자 오버로딩을 통해 다양한 생성자를 만들 수 있다. 생성자의 이름은 클래스의 이름과 같다.
소멸자(destructor) 란, 객체가 소멸될 때 호출되는 함수이다. 생성자와 마찬가지로 객체가 사라질 때 반드시 한 번만 호출된다. 객체가 소멸되는 시점은 일반 변수의 생명주기에서의 변수 소멸시점과 동일하다. 객체가 지역변수일 경우에는 해당 지역(함수 또는 블록)의 수행이 완료되고 반환될때 소멸된다. 객체가 전역변수일 경우에는 프로그램이 종료될 때 소멸된다. 소멸자의 이름은 클래스의 이름과 동일하나, 생성자와의 구별을 위해 이름 앞에 ‘~’ 문자가 붙는 것이 특징이다.
1
2
3
4
5
6
7
8
9
10
11
class CPoint {
private :
int x;
int y;
public :
CPoint(int a, int b) { x = a; y = b; cout << "constructor1:"; Print(); }
CPoint(int a) { x = a; y = 0; cout << "constructor2:"; Print(); }
~CPoint() { cout << "destructor:"; Print(); }
void Print() { cout << "(" << x << ", " << y << ")" << endl; }
};