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 키워드를 사용한다.
'C언어 공부' 카테고리의 다른 글
C++ 기초 - 4 클래스 상속 / 접근지정자 (0) | 2025.03.16 |
---|---|
C++ 기초 - 3 소멸자 / 연습문제 (0) | 2025.03.15 |
C++ 기초 - 1 객체지향 첫걸음 (0) | 2025.03.15 |
C언어 공부의 자료 출처 (0) | 2025.03.14 |
C++ 기초 - C언어와 C++은 뭐가 다른 걸까 - 내 생각 (0) | 2025.03.14 |