Programming/C++

[C++] 클래스와 객체

Jubil 2018. 1. 22. 15:51
반응형

클래스 정의 -> 객체 생성


클래스는 하나의 추상적 개념체입니다. 실체인 객체를 만들기 위한 틀이죠.


사람이라는 클래스가 있고, 그에 따른 실제 객체인 나, 친구, 엄마 등을 만들 수 있는 것입니다.


그래서 클래스는 객체들이 공통적으로 가지고 있을 멤버 변수나 멤버 함수를 정의해야 합니다.

(여러 개의 변수와 함수를 가질 수 있음)



클래스 선언 :


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