클래스 기초

접근 지정자


3가지 접근 지정자

  1. private
    동일한 클래스의 멤버 함수에만 제한한다.
    클래스 밖에서 직접 접근 불가 -> 클래스 안에서만 사용 가능하다.
  2. protected
    클래스 자신과 상속받은 자식 클래스에한 허용한다.
  3. public
    모든 다른 클래스에 허용한다.
    클래스 밖에서도 직접 접근 가능하다.
접근 지정자해당 클래스에서의 접근파생클래스에서의 접근클래스 밖에서의 접근
privateOXX
protectedOOX
ppublicOOO

클래스 정의 안에서 접근 지정자를 지정하면, 새로운 접근 지정자가 나타날 때까지 모든 멤버가 해당 접근 권한을 가진다.

class test {
		int testInt;	//private로 선언됨 -> 디폴트 접근 지정 = private이기 때문
    public:
    	float testFloat;
        double testFunction();
}

멤버의 접근 권한 설정

클래스의 멤버 변수

privateprotected로 설정한다.
이는 잘못된 변경으로부터 멤버 변수를 보호하기 위함으로,
=> 멤버 함수를 통해서 멤버 변수를 수정할 수 있는 방법으로 많이 사용한다. (접근자함수 내용 참고)

클래스의 멤버 함수

public으로 설정한다.
왜냐면, 멤버 함수는 객체가 사용할 수 있어야 하므로, 클래스 밖에서 접근할 수 있어야 하기 때문이다.

접근자 함수(accessor function)

접근자 함수 : public를 갖는 멤버 함수로, 클래스의 멤버 변수에 접근을 도와주는 기능 제공한다.
->보통은, Get 함수Set 함수로 구현된다.

  • Get 함수 : 멤버 변수에 대한 접근이 가능하도록 한다.(멤버변수의 값을 얻도록 함)
  • Set 함수 : 멤버변수의 값을 수정할 수 있도록 한다.
    => 위의 두 접근자 함수는 function name의 접두어로 사용된다.
// 클래스 선언부
class shape {
	private:
    		int height;
            	int width;
	public:
    		int GetHeight();
            	int GetWidth();
                void SetHeight(int userHeight);
                void SetWidth(int userWidth);
}

// 클래스 구현부
int shape::GetHeight() {
	return height;
}
int shape::GetWidth() {
	return width;
}
void shape::SetHeight(int userHeight) {
	height = userHeight;
}
void shape::SetWidth(int userWidth) {
	width = userWidth;
}

접근자 함수의 장점

  1. 다양한 레벌의 접근 권한 설정 가능하다.
    -> 접근자 함수는 필요한 것만 생성하면 된다.
  2. 멤버 변수의 값을 변경하거나 읽어올 때, 멤버 변수의 값에 대한 유효성을 검사할 수 있다.

friend함수 및 friend 클래스


friend 함수
클래스의 멤버 함수가 아닌 전역 함수임에도, private, protected멤버에 대한 접근이 허용된 함수이다.
-> 접근하고픈 class 선언부에 friend 키워드를 작성하고 함수 원형을 적는다.

friend 클래스
특정 클래스의 private,protected 멤버에 접근할 수 있는 class이다.
-> 접근하고픈 class 선언부에 friend class를 작성하고 클래스 name을 적어준다.

class Circle {
	friend void GetArea();	// friend 함수
    	friend class shape;	// friend 클래스
}
class shape {
	private:
    		int Height;
            	int Width;
}

//main
void GetArea() {
	//do something..
}

friend는 대부분의 경우에는 안전하게 멤버 변수를 보호하면서, 특수한 상황에서는 멤버 변수에 대한 접근을 허용하는 예외 규칙이라고 할 수 있다.

멤버함수의 this 포인터


this 포인터

멤버 함수를 소유한 객체를 가리키는 포인터로, 객체가 저장되어 있는 주소를 저장한다.
이는 클래스의 멤버 함수 내에서만 사용 가능하고, 개발자가 선언하는 변수가 아니다.
컴파일러가 선언하는 변수로, 컴파일러에 의해 묵시적으로 삽입 선언되는 매개 변수이다.

class Student {
		int stdNum;
    		int stdName;
	public:
		void SetStdNum(int stdNum) {
			this->stdNum = stdNum //첫 번째는 class꺼, 두 번째는 매개변수
            	}
}
/* this만 따로 출력도 가능하다. */

각 객체 속의 this 는 다른 객체의 this와 다름

this가 유용한 경우

  1. 매개변수의 이름과 멤버변수의 이름이 같은 경우
  2. 멤버 함수가 객체 자신의 주소를 리턴할 때

분할 컴파일


바람직한 C++ 프로그램 작성법

클래스를 헤더 파일과 cpp파일로 분리하여 작성한다.

  • 클래스 선언부 : 헤더 파일(.h)에 저장 -> 클래스 이름.h
  • 클래스 구현부 : cpp파일에 저장 (멤버함수의 구현) -> 클래스 이름.cpp

    단, 클래스 구현부에는 사용할 선언부를 include해야 한다.
    이를 통해, 클래스 재사용

중복 include 막는 방법

조건 컴파일 문으로 해결한다.

  1. 헤더 파일의 이름을 따서 #define을 이용하여 심볼을 만든다.
  2. 헤더 파일의 제일 앞에 해당 심볼을 사용해서 #ifndef를 추가한다.
  3. 헤더 파일의 제일 끝에 #endif를 추가한다.
// shape.h
// 심볼 이름은 컴파일 상수와의 충돌을 방지하기 위해, 클래스 이름으로 사용하는 것이 좋다.
#ifndef SHAPE_H
#define SHAPE_H

class shape {
	// declaration member function & variable...
}

#endif

//main.cpp
#include <iostream>
using namespace std;

#include "shape.h"
#include "shape.h"	// 조건 컴파일문으로 인해, 여러 번 include해도 문제가 발생하지 않는다.

int main() {
	//do something..
}

shape.h에 SHAPE_H가 없으면, define으로 선언하고 / 있으면, 바로 endif로 넘어간다.

좋은 웹페이지 즐겨찾기