003. 클래스의 기본
I. 구조체와 클래스
-
구조체의 등장 배경은 무엇인가?
- 일단 구조체의 이점은 관련있는 데이터를 하나로 묶으면 관리하기에도 프로그래밍 하기에도 편리하다는 점이 있다.
- 부류를 형성하는 데이터들을 하나의 자료형으로
- 정의해서, 관리 및 프로그램 구현에 도움을 주겠다는 의도로 등장.
- 구조체에 대한 불만과 개선
- #include <stdio.h>
- struct Person
{
int age;
char name[10];
}; - int main()
{
int a = 10;
Person p;
return 0;
}
-
위와 같이 소스를 짜면 맞을듯 하나 틀리다.
- main함수 안에 Person p; 라고 쓴 부분이 있는데 C파일에서는 컴파일 오류가 난다. 오류를 없애려면 struct Person p; 로 써야 한다.
- cpp로 확장자를 바꾸어서 하면 컴파일이 잘 된다. 이유는 C 언어와 달리 C++의 매커니즘에는 사용자 정의 자료형과 기본 자료형을 동일시하자는 철학이 있다고 한다.
- 구조체에 대한 자세한건 C에서 참조 하세요
-
구조체가 아니라 클래스(class)
- 클래스 = 멤버 변수 + 멤버 함수
- 다음 소스는 기본적인 클래스를 쓴 예제이다.
- #include <iostream>
using namespace std;
class Account
{
public:
char accID[20];
char secId[20];
char name[20];
int balance;
void Deposit(int money)
{
balance += money;
}
void Withdraw(int money)
{
balance -= money;
}
};
int main()
{
Account yoon={"1234","2321","yoon",1000};
yoon.Deposit(100);
cout<<"잔 액 : "<<yoon.balance<<endl; - yoon.Withdraw(200);
cout<<"잔 액 : "<<yoon.balance<<endl;
return 0;
}
II. 클래스와 객체
-
데이터 추상화
- 현실세계의 사물을 데이터적인 측면과 기능적 측면을 통해서 정의하는 것.
-
클래스
- 추상화 된 데이터를 가지고 사용자 정의 자료형을 정의하는 것.
-
객체
- 클래스를 이용해서 정의된 자료형의 변수
III. 클래스 멤버의 접근 제어
- 클래스의 내부 접근과 외부 접근
- #include <iostream>
using namespace std;
class Counter
{
public:
int val;
void Increment(void)
{
val++ //내부 접근
}
};
int main()
{
Counter cnt;
cnt.val = 0; //외부접근
cnt.Increment(); //외부접근
cout<<cnt.val<<endl; //외부접근
return 0;
}
- 위 소스를 보면 클래스 안에서 접근을 하면 내부 접근 그 이외는 외부 접근으로 친다.
-
public & private
- private : 내부 접근만 허용 되며, 외부 접근 시도시 컴파일 에러가 난다.
- public : 어디서 접근 하든 상관 안한다.
- #include <iostream>
using namespace std; - const int OPEN = 1;
const int CLOSE = 2; - class Door
{
private:
int state;
public:
void Open()
{
state = OPEN;
}
void Close()
{
state=CLOSE;
}
void ShowState()
{
cout<<"현재 문의 상태 : ";
cout<<((state == OPEN)? "OPEN" : "CLOSE")<<endl; //if문과 같은 것
}
};
int main()
{
Door d;
//d.state = OPEN; <= 외부에서 state(private)로 접근 하려고 했지 때문에 오류
d.Open();
d.ShowState();
return 0;
}
- 위의 소스를 보면 메인에서 주석처리 된 부부은 private로 접근 하려고 해서 오류가 난다. 나머지는 public으로 접근이라 상관 없다.
IV. 멤버 함수의 외부 정의
- 멤버 함수를 클래스 외부에 정의하기
- #include <iostream>
using namespace std; - const int OPEN = 1;
const int CLOSE = 2; - class Door
{
private:
int state;
public:
void Open();
void Close();
void ShowState();
};
void Door::Open()
{
state = OPEN;
}
void Door::Close()
{
state=CLOSE;
}
void Door::ShowState()
{
cout<<"현재 문의 상태 : ";
cout<<((state == OPEN)? "OPEN" : "CLOSE")<<endl; //if문과 같은 것
}
int main()
{
Door d;
//d.state = OPEN; <= 외부에서 state(private)로 접근 하려고 했지 때문에 오류
d.Open();
d.ShowState();
return 0;
}
-
위의 소스는 앞절에서 한 소스를 클래스 안에 있던 함수를 외부로 빼온거 말고는 없다.
- 잘 보면 외부로 함수를 빼었을 때 void Door::Open 이런식으로 써있는데 Door:: 은 Door이라는 클래스 안에 있는 Open 함수를 쓰겠다는 의미이다.
-
클래스 내부 정의의 의미와 inline
- 클래스의 멤버 함수를 내부에 정의한다는 것은 외부에 정의한 것과 달리 inline으로 처리할것으로 요구한다는 의미를 지닌다.
- #include <iostream>
using namespace std; - const int OPEN = 1;
const int CLOSE = 2; - class Door
{
private:
int state;
public:
void Open();
void Close();
void ShowState();
};
inline void Door::Open()
{
state = OPEN;
}
inline void Door::Close()
{
state=CLOSE;
}
inline void Door::ShowState()
{
cout<<"현재 문의 상태 : ";
cout<<((state == OPEN)? "OPEN" : "CLOSE")<<endl; //if문과 같은 것
}
int main()
{
Door d;
//d.state = OPEN; <= 외부에서 state(private)로 접근 하려고 했지 때문에 오류
d.Open();
d.ShowState();
return 0;
}
- 위의 소스처럼 외부로 정의된 함수 앞에 inline 함수를 쓰면 된다. 컴파일러는 최적화를 위해서 무시할 때도 있다.
- 헤더 파일을 이용한 파일의 분할
- Door.h
- #include <iostream>
using namespace std; - const int OPEN = 1;
const int CLOSE = 2; - class Door
{
private:
int state;
public:
void Open();
void Close();
void ShowState();
};
- Door.cpp
- #include <iostream>
#include "Door.h"
using namespace std; - void Door::Open()
{
state = OPEN;
}
void Door::Close()
{
state=CLOSE;
}
void Door::ShowState()
{
cout<<"현재 문의 상태 : ";
cout<<((state == OPEN)? "OPEN" : "CLOSE")<<endl; //if문과 같은 것
}
- main.cpp
- #include "Door.h"
int main()
{
Door d;
//d.state = OPEN; <= 외부에서 state(private)로 접근 하려고 했지 때문에 오류
d.Open();
d.ShowState();
return 0;
}
- 위의 소스들처럼 클래스를 헤더파일어 넣고 그 헤더를 사용하면서 쓰면 된다.
문제
3 -1
문제 1
계산기 기능을 하는 Calculator라는 이름의 클래스를 작성해 보자. 기본적으로 지니고 있는 기능은 덧셈, 뺄셈, 곱셈, 그리고 나눗셈이며, 연산을 할 때마다 어떠한 연산을 몇번했는지 기록되어야 한다 다음에 제공되는 main 함수와 출력 결과를 통해서 요구되는 Calculator 클래스를 디자인해보자
문제2
Printer라는 이름의 클래스를 디자인하자. Printer클래스는 두가지 기능을 지닌다. 그 중 첫번째는 문자열을 설정할 수 있는 기능이고, 두번째 기능은 설정되어 있는 문자열을 출력하는 기능이다. main함수와 출력 결과를 통해서 요구되는 Printer 클래스를 디자인 해보자.( 멤버 변수는 private로 멤버함수는 public으로 하자)
이 글은 스프링노트에서 작성되었습니다.
'2. C/C++ > 02. C++' 카테고리의 다른 글
006. static 멤버와 const 멤버 (0) | 2008.12.07 |
---|---|
005. 복사생성자 (0) | 2008.12.07 |
004. 클래스의 완성 (0) | 2008.12.07 |
002. C 기반의 C++ 2 (0) | 2008.12.07 |
001. C 기반의 C++ 1 (0) | 2008.12.07 |