C언어 공부

C++ 기초 - 2 클래스 멤버 / 생성자

당혜성 2025. 3. 15. 20:40

Class

Class 키워드를 이용해 클래스를 생성할 수 있다.

 

Class는 struct를 대체하기 때문에 앞으로 모든 struct는 class로 만들게 된다.

 

이 Class 내부에는 꼭 public: 이라는 키워드가 있어야 한다.

 

class myclass{
public:
...
};

선언 하는건 똗같다.

 

예시코드

#include "Header.h"

class student {
	int stdno;
	char name[20];
	int gender; // 0 = 남자 1 = 여자
	
	void printstudent() {
		printf("학생 번호%d\n", stdno);
		printf("학생 이름:%s\n", name);
		printf("성별 %s\n", gender == 0 ? "남자" : "여자");
	}
};

int main() {
	
	
	return 0;
}

간단하게 학생에 대한 정보를 적고 출력하는 코드를 만들었다.

gender == 0 ? "남자" : "여자" <- 인라인 조건절이다.

 

인라인 조건절을 이용해 생성되는 값을 지정할 수 있다.

 

<조건절> ? 값1 : 값2

 

위와같은 인라인 조건절은 true 라면 값1이 생성이 되고, 조건절이 false 라면 값 2가 생성되게 된다

 

완성된 코드

#include "Header.h"

class student {
	int stdno;
	char name[20];
	int gender; // 0 = 남자 1 = 여자
	
	void printstudent() {
		printf("학생 번호%d\n", stdno);
		printf("학생 이름:%s\n", name);
		printf("성별 %s\n", gender == 0 ? "남자" : "여자");
	}
};

int main() {
	student s;
	s.stdno = 1234;
	strcpy(s.name, "이혜성");
	s.gender = 0;
	
	return 0;
}

아마 이 코드를 따라치거나, 복사해서 붙여넣었다면 stdno, name, gender 에 빨간줄이 뜨게 된다.

(strcpy가 안된다면 cstring을 안한것이다.)

 

앞서 설명했듯, class 에서는 public: 을 달아줘야 한다.

 

public: 을 사용해야 이것을 밖에서도 사용이 가능하다.

예시 코드

#include "Header.h"

class student {
public:
	int stdno;
	char name[20];
	int gender; // 0 = 남자 1 = 여자
	
	void printstudent() {
		printf("학생 번호%d\n", stdno);
		printf("학생 이름:%s\n", name);
		printf("성별 %s\n", gender == 0 ? "남자" : "여자");
	}
};

int main() {
	student s;
	s.stdno = 1234;
	strcpy(s.name, "이혜성");
	s.gender = 0;
	
	return 0;
}

다시 멀쩡히 되는 모습을 볼 수 있다.

 

그리고 printstudent를 실행하려면 똗같이 s.printstudent();를 해주면 된다.

코드를 보자

#include "Header.h"

class student {
public:
	int stdno;
	char name[20];
	int gender; // 0 = 남자 1 = 여자
	
	void printstudent() {
		printf("학생 번호%d\n", stdno);
		printf("학생 이름:%s\n", name);
		printf("성별 %s\n", gender == 0 ? "남자" : "여자");
	}
};

int main() {
	student s;
	s.stdno = 1234;
	strcpy(s.name, "이혜성");
	s.gender = 0;

	s.printstudent();

	return 0;
}

만약 학생 하나를 더 하고싶다면 또 만들면 된다.

 

예시 코드

int main() {
	student s;
	s.stdno = 1234;
	strcpy(s.name, "이혜성");
	s.gender = 0;

	s.printstudent();

	student s2;
	s2.stdno = 5678;
	strcpy(s2.name, "당혜성");
	s.gender = 1;

	s2.printstudent();

	return 0;
}

(위 클레스는 바뀐게 없어 메인 구문만 가져왔다.)

 

사용했던 코드들은 정적인 방법으로 한것이고, 우리는 동적으로 많이 사용할 것이기 때문에 동적으로 할것이다. 만들어 보도록 하자

 

#include "Header.h"

class student {
public:
	int stdno;
	char name[20];
	int gender; // 0 = 남자 1 = 여자
	
	void printstudent() {
		printf("학생 번호%d\n", stdno);
		printf("학생 이름:%s\n", name);
		printf("성별 %s\n", gender == 0 ? "남자" : "여자");
	}
};

int main() {
	student s;
	s.stdno = 1234;
	strcpy(s.name, "이혜성");
	s.gender = 0;

	s.printstudent();

	student* ps = new student();
	ps->stdno = 1234;
	strcpy(ps->name, "당혜성");
	ps->gender = 1;

	ps->printstudent();
	return 0;
}

struct와 달라진건 딱히 없다

 

클래스와 인스턴스간 차이

new 키워드를 이용해 클래스를 만들게 되면 클래스의 실제 값이 Heap 영역에 저장되는것이 가장 큰 차이이다. 

 

Heap 영역에 저장되는 클래스의 인스턴스 값은 함수의 실행주기(라이프 사이클)에 관계없이 유지된다.

 

변수의 값이 어디에 저장이 되느냐의 차이다.

 

student s; <- 이렇게 만들면 함수 내부에서 생성이 되기 때문에, 함수가 끝나면 사라진다.

 

student* ps; <- 이렇게 만들면 함수에 저장되는게 아니라 Heap에 저장이 된다. 계속 남는다는 뜻이다

 

그래서 코드 끝에 delete를 해줘야 한다.

코드 예시

int main() {
	student s;
	s.stdno = 1234;
	strcpy(s.name, "이혜성");
	s.gender = 0;

	s.printstudent();

	student* ps = new student();
	ps->stdno = 1234;
	strcpy(ps->name, "당혜성");
	ps->gender = 1;

	ps->printstudent();

	delete ps;
	return 0;
}

생성자(Constructor)

클래스는 생성자(Constructor)를 통해 초기 행동을 지정해줄 수 있다. 이를 생성자라고 한다.

 

생성자는 클래스명(파라미터들...)로 선언할 수 있다.

 

생성자는 리턴타입을 갖지 않는다.

코드예시

#include "Header.h"

class student {
public:
	int stdno;
	char name[20];
	int gender; // 0 = 남자 1 = 여자
	
	student();

	void printstudent() {
		printf("학생 번호%d\n", stdno);
		printf("학생 이름:%s\n", name);
		printf("성별 %s\n", gender == 0 ? "남자" : "여자");
	}
};

이렇게 생겼다.

 

실제 예시 코드를 보자

class student {
public:
	int stdno;
	char name[20];
	int gender; // 0 = 남자 1 = 여자
	
	student(int pstdno, const char* n, int g) {
		stdno = pstdno;
		strcpy(name, n);
		gender = g;
	}

	void printstudent() {
		printf("학생 번호%d\n", stdno);
		printf("학생 이름:%s\n", name);
		printf("성별 %s\n", gender == 0 ? "남자" : "여자");
	}
};

이렇게 사용하게 되면, main 구문에 student s 쪽에서 빨간줄이 그어지는데, 이렇게 만들면 된다.

 

코드

int main() {
	student s = student(1234, "이혜성", 0);
	s.printstudent();

	student* ps = new student();
	ps->stdno = 1234;
	strcpy(ps->name, "당혜성");
	ps->gender = 1;

	ps->printstudent();

	delete ps;
	return 0;
}

student s = student(1234, "이혜성", 0); 이렇게 한 줄로 바뀌게 된다. 동적인 경우도 마찬가지이다.

 

코드 예시

int main() {
	student s = student(1234, "이혜성", 0);
	s.printstudent();

	student* ps = new student(3456, "당혜성", 1);

	ps->printstudent();

	delete ps;
	return 0;
}

만약 생성자에 pstdno이 기존에 있던 함수로 바뀌면 어떨까

 

예시 코드

class student {
public:
	int stdno;
	char name[20];
	int gender; // 0 = 남자 1 = 여자
	
	student(int stdno, const char* n, int g) {
		stdno = stdno;
		strcpy(name, n);
		gender = g;
	}

	void printstudent() {
		printf("학생 번호%d\n", stdno);
		printf("학생 이름:%s\n", name);
		printf("성별 %s\n", gender == 0 ? "남자" : "여자");
	}
};

이런식으로 생성자에도 똗같은 이름을 하게되면 실행할때 쓰래기 값이 나온다.

 

이를 해결하기 위해 this 키워드를 사용한다.