클래스 정의 -> 객체 생성
클래스는 하나의 추상적 개념체입니다. 실체인 객체를 만들기 위한 틀이죠.
사람이라는 클래스가 있고, 그에 따른 실제 객체인 나, 친구, 엄마 등을 만들 수 있는 것입니다.
그래서 클래스는 객체들이 공통적으로 가지고 있을 멤버 변수나 멤버 함수를 정의해야 합니다.
(여러 개의 변수와 함수를 가질 수 있음)
클래스 선언 :
class 클래스 이름
{
클래스 멤버; //멤버 변수와 멤버 함수
};
만약에 하나의 정수를 변수에 저장하고 해당 변수를 화면에 출력하는 프로그램을 객체 지향으로 작성한다면, 정수를 저장할 변수 하나와 출력하는 함수 하나를 만들어야 합니다.
1 2 3 4 5 | class IntSample //클래스 이름 { void showScore(); //출력 함수 int score; //정수 저장할 변수 }; | cs |
함수를 사용할 때 우리는 매개변수를 이용해서 값을 받았습니다. 하지만, 객체 지향에서는 같은 클래스에 속한 멤버 변수를 매개변수로 받지 않아도 쓸 수 있습니다.
그래서 구조적 프로그래밍을 했었을 때, void showScore(int score); 이렇게 매개변수로 받았지만, 객체지향 프로그래밍에서는 같은 클래스에 있다는 것만으로도 score에 접근할 수 있다는 것입니다.
그렇다면 showScore() 함수를 정의해줍시다.
1 2 3 4 | void IntSample::showScore() { cout << "점수 : " << score << endl; //score는 IntSample의 멤버 변수이므로 별도의 선언 없이 사용 가능함 } | cs |
이렇게 클래스이름::멤버함수이름 으로 정의해줍니다.
분명 함수에는 score라는 변수가 없지만, IntSample 클래스의 멤버 변수이기 때문에 사용 가능합니다.
멤버 접근 속성 :
private - 기본 접근 속성, 같은 클래스 멤버 내에서만 접근 허용.
protected - 클래스 상속에서 사용됨.
public - 모든 위치에서 접근 허용.
클래스 멤버 참조 연산자는 .(점)입니다. (구조체와 동일)
그럼 객체를 만들어 보겠습니다.
클래스명 객체명; 이렇게 생성할 수 있습니다. (선언 X, 생성 O)
1 2 3 4 5 6 | int main() { IntSample obj; //객체 생성 obj.score = 100; //error obj.showScore(); //error } | cs |
하지만 오류가 발생합니다. 이유는 아까 말했던 멤버 접근 속성의 디폴트 값이 private이기 때문입니다.
error C2248: 'IntSample::score': private 멤버('IntSample' 클래스에서 선언)에 액세스할 수 없습니다.
error C2248: 'IntSample::showScore': private 멤버('IntSample' 클래스에서 선언)에 액세스할 수 없습니다.
그렇다면 main 함수에서 접근하기 위해서는 멤버의 접근 속성을 public으로 명시해줍시다.
1 2 3 4 5 6 | class IntSample //클래스 이름 { public: void showScore(); //출력 함수 int score; //정수 저장할 변수 }; | cs |
error가 사라집니다.
출력도 잘 됩니다. 하지만 score라는 정보가 아무렇게나 쉽게 수정될 수 있다는 위험성이 생깁니다.
그래서 score를 private으로 만들고, set함수를 만들어서 score를 수정하기 위한 함수를 만들어 주겠습니다.
1 2 3 4 5 6 7 8 9 | class IntSample //클래스 이름 { public: void showScore(); //출력 함수 void setScore(const int s); //score 값 변경 private: int score; //정수 저장할 변수 }; | cs |
이렇게 함수를 선언하고 멤버 변수 score는 private 접근 속성을 줬습니다.
1 2 3 4 | void IntSample::setScore(const int s) { score = s; //score는 IntSample의 멤버변수이므로 별도의 선언 없이 사용 가능함 } | cs |
그리고 setScore 함수를 정의했습니다.
1 2 3 4 5 6 | int main() { IntSample obj; //객체 생성 obj.setScore(100); obj.showScore(); } | cs |
main 함수에서는 score에 직접 접근하지 못하기 때문에 setScore라는 함수를 통해서 값을 변경합니다.
그러면 동일한 결과가 나오게 됩니다.
보통 코딩할 때, 헤더 파일에 클래스를 선언하고, 정의는 소스 파일에서 해줍니다.
객체 생성 및 테스트는 main 함수에서 해줍니다.
'Programming > C++' 카테고리의 다른 글
[C++] 소멸자 (0) | 2018.01.22 |
---|---|
[C++] 생성자 (0) | 2018.01.22 |
[C++] 함수 오버로딩 (0) | 2018.01.22 |
[C++] 디폴트 매개변수 (0) | 2018.01.22 |
[C++] 함수 (0) | 2018.01.21 |