자료실/C++

C++ - 클래스(Class)의 구조와 접근 지정자

자료수집중 2020. 8. 17.
반응형

 

 

클래스는 C++ 객체 지향 프로그램의 가장 중요한 요소입니다.

C언어에서 사용한 구조체의 확장된 개념이라고 생각하면 됩니다.

구조체에서는 struct키워드를 사용하지만 클래스는 class키워드를 이용해서 타입을 정의하며 변수와 함수의 집합입니다.

클래스 내부에 정의된 변수나 함수를 멤버 변수, 멤버 함수(또는 메서드)라고 합니다.

class 클래스이름
{
    멤버변수
    멤버함수
    .
    .
    .
    .
    .
};

 

 

클래스를 사용하기 위해선 구조체처럼 해당 클래스의 변수를 선언해야 합니다.

클래스이름 변수명;

 

예제로 살펴보겠습니다.

#include <iostream>

class Student {
	
};

int main()
{
	Student stn;
	return 0;
}

class student를 정의하고 main에서 student의 변수 stn을 선언했습니다.

여기서 stn은 객체입니다. class student로 정의되는 객체입니다.

또 stn은 class student의 인스턴스입니다. 

클래스를 이용해 정의된 변수를 객체라고 합니다. 이 변수들을 해당 클래스의 인스턴스라고 합니다.

 

 

이제 클래스를 채워보겠습니다.

클래스와 구조체의 가장 큰 차이점 중 하나는 접근 지정자가 존재한다는 겁니다.

클래스는 접근 지정자에 따라서 클래스 멤버 변수나 함수를 내부와 외부에서의 사용을 제한할 수 있습니다.

접근 지정자는 public, private, protected 3가지가 있습니다.

public은 모두 사용이 가능합니다. 

private는 오직 자신의 클래스 내부에서만 사용이 가능합니다.(friend선언시 사용 가능)

protected는 자신의 클래스 내부와 자식 클래스(파생 클래스)에서 사용이 가능합니다.

 

protected는 상속에서 더 알아보고 public private를 예제를 통해 알아보겠습니다.

#include <iostream>

using namespace std;

class Student {

public:
	char name[20]="";
	int age=0;
	void show() {
		cout << "이름 : " << name << "\n";
		cout << "나이 : " << age << "\n";
		cout << "아이디 : " << id << "\n";
	}
private:
	int id = 1010156;
};

int main()
{
	Student stn;
	cout << "학생의 이름 : " ;
	cin >> stn.name;
	cout << "학생의 나이 : ";
	cin >> stn.age;
	cout << '\n';

	stn.show();

	return 0;
}

클래스 내부의 멤버들을 사용하기 위해서는 .(멤버 연산자)를 이용해서 접근할 수 있습니다.

 

각각 접근 지정자를 선언 후( ex)public: ) 하위 멤버로 선언하면 접근 지정자의 성격을 가지게 됩니다.

접근 지정자를 생략하고 그냥 멤버를 선언하면 기본적으로 private입니다.

 

위의 예제를 살펴보면 public으로 선언된 멤버들은 클래스의 외부에서도 사용할 수 있는 상태입니다.

public으로 선언된 int name, int age, void show()는 외부에서도 변경 및 사용이 가능한 결과를 보여줍니다.

 

하지만 private로 선언된 멤버는 클래스 내부에서만 사용 가능하게 됩니다.

만약 private로 선언된 멤버를 클래스 외부에서 사용하게 되면 에러가 발생하게 됩니다.(액세스 할 수 없음)

위 예제에서 보면 private로 선언된 int id는 내부 멤버 함수인 show()에서만 사용이 가능합니다.

 

 

접근 지정자를 이용해서 멤버들의 중요도에 따라서 접근성을 조정할 수 있습니다.

 

 

'자료실 > C++' 카테고리의 다른 글

C++ - 클래스(class) 생성자와 소멸자  (0) 2020.08.19
C++ - string 클래스  (0) 2020.08.18
C++ - 네임스페이스(namespace)  (0) 2020.08.13
C++ - 입출력  (0) 2020.08.12
C++ - 프로젝트 생성  (0) 2020.08.11

댓글