[C++/Syntax] Class ( Struct와 다른점 )

C++에서의 구조체 (Struct)

C++에선 구초제 안에 함수를 사용할 수 있어서, class와 struct(구조체) 사이에 차이점을 알기 어렵다.
하지만 C++에서의 구초제와 class 의 차이점은 초기화(initialize) 방식이 다르고 public과 private 등을 사용여부에 따라 구분할 수 있다.


C++ 에선 struct(구조체)안에 함수를 선언 할 수 있다.
이를 이용해 Person 구조체를 선언해 사용해보자.

struct Person {
	char name[10];
	int pox, poy;

	void ShowPostion() {
		std::cout << pox << " " << poy << std::endl; 
		return;
	}
	void work() {
		pox++;
		poy++;
	}
};

int main(){
	Person man = { "man", 10, 10 };
	man.pox++;
	man.ShowPostion();
	man.work();
	man.ShowPostion();
	return 0;
}

Person man = { "man", 10, 10 };에서 Person 구조체를 name은 man, pox와 poy는 각각 10으로 설정해 놓고
man.ShowPostion();를 통해 상태를 보여주고
man.work();를 통해 상태를 변화 시킬 수 있고
man.pox++;를 통해 직접 변화 시킬 수도 있다.

 

Class

C++에서 class 문법은 딱히 별거 없고 struct를 class로 바꿔주기만 하면된다.
하지만 여러가지 에러가 발생하며 작동하지 않는데 이게 바로 class와 struct의 차이점이다.

Class는

Person man = { "man", 10, 10 };이렇게 직접 초기화 시킬 수 없고
man.ShowPostion();로 함수를 직접 호출 할 수 없으며,
man.pox++;를 통해 직접 변수를 변경 할 수 없다.

이는 Class에 public, private 등과 같은 접근제어 지시자를 사용하여 설정할 수 있는데,
public은 struct처럼 아무곳에서나 사용할 수 잇고,
private는 해당 class외에선 사용할 수 없고,
protected는 상속 한 class에서 사용할 수 있다.

이는 변수, 함수 모든 내용들에 대해서 동일하게 적용된다.
그럼 Code 1를 class로 바꾸어 사용해보자.

class Person {
public:
	char name[10];
	int pox, poy;

	void ShowPostion() {
		std::cout << pox << " " << poy << std::endl; 
		return;
	}
	void work() {
		pox++;
		poy++;
	}
};

int main(){
	Person man = { "man", 10, 10 };
	man.pox++;
	man.ShowPostion();
	man.work();
	man.ShowPostion();
	return 0;
}

class 아래 public으로 선언해 모든 값들을 외부에서 접근 가능하도록 하면 동작하지만,
class는 클래스 내부의 변수를 직접 접근하는 방식을 권장하지 않는다.
이를 좀 다듬어 보면,

class Person {
private:
	char name[10];
	int pox, poy;
public:
	void InitPerson(const char * name, int pox, int poy) {
		strcpy(this->name, name);
		this->pox = pox;
		this->poy = poy;
	}

	void ShowPostion() {
		std::cout << pox << " " << poy << std::endl; 
		return;
	}
	void work() {
		pox++;
		poy++;
	}
};

int main(){
	Person man;
	man.InitPerson("man", 10, 10);
	man.ShowPostion();
	man.work();
	man.ShowPostion();
	return 0;
}

내부 변수는 직접적으로 접근을 못하게 했고,
초기화 또한 InitPerson 함수를 통해 초기화 하였다.

이 처럼 클래스 내부의 변수, 함수등을 사용하는데 제한을 두어 데이터의 안정성과 보안을 증가 시킬 수 있다.

++ Class는 Person man; 이렇게 뿐만아니라 Person man = new Person(); 으로도 선언이 가능하다.
이는 Class 2에서의 생성자를 사용할 때 변수를 넣어 초기화를 가능하다.

카테고리C++

글의 문제가 있다면 댓글을 달아 주세요.

This site uses Akismet to reduce spam. Learn how your comment data is processed.