Member

Class는 다음을 포함할 수 있는 새로운 데이터 타입을 정의한다.
- 데이터: 멤버변수(Member Variable)또는 멤버(Member)라고 한다.

- 함수: 메서드(Method)나 멤버함수(Member Function)라고 한다.

- 타입 정의

- 포함된 클래스
멤버 변수(Member Variable)
class complex{
public:
double r, i;
};
complex z, c; // complex (instance)
z.r=3.5; z.i=2;
c.r=2; c.i=-3.5; // complex
std::cout<<"z is ("<<z.r<<", "<<z.i<< ")\n";
complex 클래스는 복수수의 실수부와 허수부를 저장하는 변수(r, i)를 가지고 있다.
class에 대한 개체(instance) 선언은 내장 타입과 동일하게 선언한다.

개체의 멤버 변수는 도트 연산자(‘ . ‘)를 통해서 접근한다.
접근성
C++에서 클래스의 각 멤버는 지정된 접근성을 가진다.

접근 지정자(Access Modified)
- public: 어디서나 접근 가능
- protected: 클래스 내부와 파생 클래스에서 접근 가능
- privated: 클래스 내부에서만 접근 가능
class rational
{
public:
...
rational operator+(...){...}
rational operator-(...){...}
private:
int p;
int q;
};
접근 지정자는 뒤에 다른 접근 지정자가 오기 전까지 나오는 모든 멤버에 적용된다.
    세부 정보 숨기기
private로 선언하게 되면, 모든 개체에 대한 속성을 보장할 수 있다.
(public으로 선언하면, 사용자가 데이터를 수정할 수 있기 때문에 불변성을 보장할 수 없다.)

private 멤버는 코드 수정에 대한 자유도를 높여준다.
private 메서드의 인터페이스나 private 변수의 타입을 변경하여도 클래스의 모든 애플리케이션은
재-컴파일 후에 계속 동작한다.

반면 public 메서드의 인터페이스를 수정하면, 사용자 코드가 손상될 수 있다.

private 멤버를 설계하면, 외부에서 클래스의 동작을 정의하지만, 구현 방법이 아닌 클래스를 정의함으로써
추상데이터 타입(Abstract Data Type, ADT)를 설정한다.

작은 헬퍼 클래스의 경우 게터(getter)와 세터(setter) 함수를 통해서만 데이터에 접근
z.set_real(z.get_real()*2); // private
z.real*=2; // public
C는 절차지향 언어로 알려져 있으며, 객체 지향 언어가 아니라고 알려져 있다.
하지만 struct 기능을 통해 class와 똑같이 선언할 수 있다.

C++또한 struct 키워드를 포함한다. struct는 class와 똑같이 선언하고, 모든 클래스의 기능을
사용할 수 있다.
(단, struct의 모든 멤버들의 기본 접근 지정자는 public임)
struct xyz{
double x; double y; double z;
};
class xyz{
public:
double x; double y; double z;
}
//
C++에서 가능하면, class를 사용하되 불변하지 않는 헬퍼 타입에 대해서만 struct를 사용하는 것이 좋다
    friend
class에서 private와 protected 멤버에 접근할 수 있도록 friend라는 키워드를 부여할 수 있다.
class complex{
...
friend std::ostream& operator<<(std::ostream&, const complex&);
friend class complex_algebra;
};
위의 코드를 통해서 complex_algebra 클래스는 complex 클래스 내부 데이터 및 함수에 대한 접근이 허용된다.
friend 선언은 public, private, protected 부분에 위치할 수 있음
접근 연산자
C++은 4가지 접근 연산자를 제공한다.
complex c;
complex *p=&c;
c.m=10; // . (c m )
(*p).r=10; // *(p.r) *(p.r) :
p->r=3.5 // .
//C stuct ->
// (pointer Member)
//
double complex::*member_selector=&complex::i;
// pg.493
클래스에 대한 static 선언
static으로 선언된 멤버 변수는 클래스마다 하나의 메모리만 차지한다.
(이를 통해서 클래스 개체 간에 리소스를 공유할 수 있다.)

싱글턴(singletn)도 static을 이용한 디자인 패턴이다.

static const 인 데이터 멤버는 하나만 존재하며 변경할 수 없다.(컴파일 타임에 사용 가능)
메타 프로그래밍에서 사용됨

메서드도 static으로 선언할 수 있으며, 메서드를 static으로 선언하면 static 데이터에만 접근할 수 있으며,
static 함수만 호출할 수 있다.(메서드가 개체 데이터에 접근할 필요가 없는 경우 이로 최적화 가능)
멤버 함수(Member Function)
개체 지향 소프트웨어에서 일반적인 멤버 함수는 getter와 setter가 있다.
class complex{
public:
double get_r(){ return r; }
void set_r(double newr){ r=newr; }
double get_i(){return i; }
void set_i(double newi){ i=newi; }
private:
double r, i;
}
int main(void){
complex c1, c2;
c1.set_r(3.0); //
c1.set_i(2.0);
c2.set_r(c1.get_r());
c2.set_i(c1.get_i());
return 0;
}
메서드에서 default 접근 지정자는 모든 멤버와 동일하게 private이다.
getter와 setter는 public 접근성을 부여하고, 외부에서 private 변수에 접근할 수 있게 해준다.