Constructors & Other Tools
Constructors & Other Tools
Constructors
C++에서 생성자(Constructor)는 클래스 객체 초기화를 위해 사용되는 특별한 멤버함수. 멤버 변수 일부 또는 전체를 초기화하는 데 사용되며, 객체가 생성될 때 자동으로 호출됨. 생성자는 클래스 이름과 동일한 이름을 가지며, 반환 타입이 없음.
클래스 이름과 동일한 이름을 가져아햐고, 반드시 public 영역에 선언되어야 함. 생성자는 매개변수를 가질 수 있으며, 기본 생성자와 매개변수가 있는 생성자를 모두 정의할 수 있음.
- 기본 생성자: 매개변수가 없는 생성자로, 객체가 생성될 때 자동으로 호출되어 멤버 변수를 기본값으로 초기화함.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Point {
public:
Point(){
x = 0; // 기본값으로 x 좌표를 0으로 초기화
y = 0; // 기본값으로 y 좌표를 0으로 초기화
}
print() {
cout << "Point(" << x << ", " << y << ")" << endl; // 현재 좌표 출력
}
private:
int x; // x 좌표
int y; // y 좌표
};
int main() {
Point p; // Point 객체 생성 시 기본 생성자가 호출되어 x, y가 0으로 초기화됨
p.print(); // Point(0, 0) 출력
return 0;
}
- 매개변수가 있는 생성자: 매개변수를 받아 멤버 변수를 초기화하는 생성자. 객체를 생성할 때 초기값을 지정할 수 있음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Point {
public:
Point(int xVal, int yVal) {
x = xVal; // 매개변수로 받은 x 좌표 값으로 초기화
y = yVal; // 매개변수로 받은 y 좌표 값으로 초기화
}
private:
int x; // x 좌표
int y; // y 좌표
};
int main() {
Point p(10, 20); // Point 객체 생성 시 매개변수가 있는 생성자가 호출되어 x가 10, y가 20으로 초기화됨
p.print(); // Point(10, 20) 출력
return 0;
}
- 초기화 리스트: 생성자에서 정의시 멤버 변수 초기화를 : 뒤에 선언
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Point {
public:
Point(int xVal, int yVal) : x(xVal), y(yVal) {} // 초기화 리스트를 사용하여 멤버 변수 초기화
void print() {
cout << "Point(" << x << ", " << y << ")" << endl; // 현재 좌표 출력
}
private:
int x; // x 좌표
int y; // y 좌표
};
int main() {
Point p(10, 20); // Point 객체 생성 시 초기화 리스트를 사용하여 x가 10, y가 20으로 초기화됨
p.print(); // Point(10, 20) 출력
return 0;
}
- 복사 생성자: 객체를 다른 객체로 초기화할 때 호출되는 생성자. 객체의 복사를 위해 사용됨.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Point {
public:
Point(int xVal, int yVal) : x(xVal), y(yVal) {} // 매개변수가 있는 생성자
Point(const Point &p) : x(p.x), y(p.y) {} // 복사 생성자
void print() {
cout << "Point(" << x << ", " << y << ")" << endl; // 현재 좌표 출력
}
private:
int x; // x 좌표
int y; // y 좌표
};
int main() {
Point p1(10, 20); // 매개변수가 있는 생성자를 사용하여 p1 객체 생성
Point p2 = p1; // 복사 생성자를 사용하여 p2 객체 생성 (p1의 값으로 초기화)
p2.print(); // Point(10, 20) 출력
return 0;
}
- Overloaded 생성자: 동일한 클래스 내에서 여러 개의 생성자를 정의할 수 있으며, 매개변수의 개수나 타입에 따라 호출되는 생성자가 결정됨.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Point {
public:
Point() : x(0), y(0) {} // 기본 생성자
Point(int xVal, int yVal) : x(xVal), y(yVal) {} // 매개변수가 있는 생성자
Point(int xVal) : x(xVal), y(0) {} // x 좌표만 초기화하는 생성자
void print() {
cout << "Point(" << x << ", " << y << ")" << endl; // 현재 좌표 출력
}
private:
int x; // x 좌표
int y; // y 좌표
};
int main() {
Point p1; // 기본 생성자 호출
p1.print(); // Point(0, 0) 출력
Point p2(10, 20); // 매개변수가 있는 생성자 호출
p2.print(); // Point(10, 20) 출력
Point p3(30); // x 좌표만 초기화하는 생성자 호출
p3.print(); // Point(30, 0) 출력
return 0;
}
- 주의사항
- 생성자는 다른 멤버함수처럼 직접 호출 불가
- 다시 초기화하는 것은 대입 연산자를 사용해야 함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Point {
public:
Point(int xVal, int yVal) : x(xVal), y(yVal) {} // 매개변수가 있는 생성자
Point(const Point &p) : x(p.x), y(p.y) {} // 복사 생성자
void print() {
cout << "Point(" << x << ", " << y << ")" << endl; // 현재 좌표 출력
}
private:
int x; // x 좌표
int y; // y 좌표
};
int main() {
Point p1(10, 20); // 매개변수가 있는 생성자를 사용하여 p1 객체 생성
p1.print(); // Point(10, 20) 출력
// 생성자 호출 시도 (잘못된 예시)
// Point p2 = Point(30, 40); // 컴파일 에러 발생: 생성자는 직접 호출할 수 없음
// 기존 객체를 대입 연산자를 사용하여 다시 초기화는 가능
p1 = Point(30, 40); // 대입 연산자를 사용하여 p1 객체를 새로운 값으로 초기화
p1.print(); // Point(30, 40) 출력
return 0;
}
const
const
키워드는 다음과 같은 상황에서 사용될 수 있음
- 변수 선언시 값이 변경되지 않도록 함
1 2
const int x = 10; // x는 상수로, 이후 값 변경 불가 // x = 20; // 컴파일 에러 발생
- 함수 매개변수로 전달되는 객체가 함수 내에서 변경되지 않도록 함
1
Point::Point(const Point &p) : x(p.x), y(p.y) {} // const 참조로 매개변수 p를 받아서 복사 생성
- 해당 상황에서는
const
를 사용하여 객체가 함수 내에서 변경되지 않도록 보장함. - 여기서 Class 객체는 메모리가 크기 때문에, call-by-reference로 전달
- 해당 상황에서는
- 멤버 함수에서 객체의 상태를 변경하지 않음을 나타냄
1 2 3
double Point::area() const { // const 멤버 함수 return 3.14159 * radius * radius; // 객체의 상태를 변경하지 않음 }
static
static
키워드는 다음과 같은 상황에서 사용될 수 있음
- 클래스 멤버 변수: 클래스의 모든 객체가 공유하는 변수를 정의할 때 사용됨. 클래스의 모든 인스턴스가 동일한 값을 가지게 됨.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
class Point { public: static int count; // Point 개체 수를 저장하는 정적 멤버 변수 Point() { count++; } // 생성자에서 count 증가 private: int x; // x 좌표 int y; // y 좌표 }; int Point::count = 0; // 정적 멤버 변수 초기화 int main() { Point p1; // Point 객체 생성 Point p2; // 또 다른 Point 객체 생성 cout << "Number of Point objects: " << Point::count << endl; // Point 객체 수 출력 return 0; }
- 위와 같이 모든 객체가 공유하는 변수가 필요할 때
static
키워드를 사용하여 클래스 멤버 변수를 정의할 수 있음. - 접근이 필요할 때는
클래스이름::변수이름
형식으로 접근함.객체이름.변수이름
형식으로 접근할 수도 있지만, 권장되지 않음. 해당 값은 한 클래스 내 모든 객체가 공유하는 값이기 때문임.
- 위와 같이 모든 객체가 공유하는 변수가 필요할 때
- 정적 멤버 함수: 클래스의 인스턴스 없이 호출할 수 있는 함수를 정의할 때 사용됨. 정적 멤버 함수는 클래스의 정적 멤버 변수에만 접근할 수 있음.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
class Point { public: static int count; // Point 개체 수를 저장하는 정적 멤버 변수 Point() { count++; } // 생성자에서 count 증가 static int getCount() { return count; } // 정적 멤버 함수로 count 반환 private: int x; // x 좌표 int y; // y 좌표 }; int Point::count = 0; // 정적 멤버 변수 초기화 int main() { Point p1; // Point 객체 생성 Point p2; // 또 다른 Point 객체 생성 cout << "Number of Point objects: " << Point::getCount() << endl; // 정적 멤버 함수 호출 return 0; }
- 위와 같이 클래스의 인스턴스 없이 호출할 수 있는 함수를 정의할 때
static
키워드를 사용하여 정적 멤버 함수를 정의할 수 있음. static
멤버 함수는 클래스의static
멤버 변수에만 접근할 수 있으며, 객체의 상태를 변경할 수 없음.
- 위와 같이 클래스의 인스턴스 없이 호출할 수 있는 함수를 정의할 때
Vector(STL)
C++에서 Vector는 C++ 표준 템플릿 라이브러리(STL)의 일부로, 동적 배열을 구현한 컨테이너 클래스. Vector는 크기가 가변적이며, 요소를 추가하거나 제거할 수 있는 기능을 제공함. Vector는 배열과 유사하지만, 크기를 동적으로 조정할 수 있는 장점이 있음.
- Vector 선언 및 초기화:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#include <vector> // vector 헤더 파일 포함 using namespace std; int main() { vector<int> vec; // 정수형 Vector 선언 vector<string> strVec = {"Hello", "World"}; // 문자열형 Vector 선언 및 초기화 // 요소 추가 vec.push_back(1); // Vector에 1 추가 vec.push_back(2); // Vector에 2 추가 vec.push_back(3); // Vector에 3 추가 // 요소 접근 cout << "First element: " << vec[0] << endl; // 첫 번째 요소 출력 cout << "Second element: " << vec.at(1) << endl; // 두 번째 요소 출력 (at() 함수 사용) // Vector 크기 cout << "Vector size: " << vec.size() << endl; // Vector의 크기 출력 return 0; }
해당 포스트는 서울대학교 전기정보공학부 정교민 교수님의 프로그래밍방법론 25-1학기 강의를 정리한 내용입니다.
This post is licensed under CC BY 4.0 by the author.