삽질의 현장/- C++

#010_시(c)시(c)해서 C++?!_ 잡다구리한 것들... (싱글톤, 기능성, 다형성)

shovelman 2015. 7. 10. 00:42

안녕하세요 삽잡이입니다...


오늘은 굳이 C++과 연관 있으려나 할 부분도 있겠지만,

C++ 공부를 위해 키보드좀 두드리면서... 

개인적으로 정리하고픈 것들을 올리는 시간을 가지도록 하겠습니닷...



1. 싱글톤 패턴 (Singleton Pattern)


우선... 싱글톤 패턴이라는 것은... 간략하게

딱 하나의 객체만을 생성하도록 고정하는 패턴입니다...

그 한 객체에만 접근할 수 있도록 하는 것이죠...


예를들어 Sap 학교 1-3 반 학생들을 관리하는 출석부가 있다고 가정해보죠...

그 출석부 안에는 많은 학생들의 정보가 써있을 터이지만

출석부는 하나면 충분합니다... 당연히 한권이겠죠...


이를 코드에서 표현하자면 이와 같이 되는 것이죠...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
class 출석부
{
    static 출석부 1-3반;//단일개체 (Singleton 개체)
public:
    static 출석부 *GetSingleton();
    void 출첵();
};
 
//... 중략 ...
 
출석부 *출석부::GetSingleton()
{
    return &1-3반;
}
cs



많은 학생들을 관리하는 출석부는 단 한권만 있어도 무방하며 효율적이기에

하나만 생성하고 이를 통해 관리한다...

이것을 바로 싱글톤 패턴이라고 할 수 있는것입니다...




2. 기능키 사용하기


<conio.h>헤더.. console and port I.O 의 약자를 사용하는 헤더 파일입니다.

그 안에 getch() 는 더도 말고 덜도 말고 따악 '한글자'를 입력받는... 그런 함수입니다...

이 함수를 왜 언급했냐면 말입니다... 


해당 함수를 통해 기능키... 

즉, F1~F12, ESC 등등 그리고 방향키를 눌러봤을 때에도 재미있게

입력한 키의 번호가 뜨는것을 확인할 수 있습니다.


아... 우리 눈으로 확인하려면 getch()는 확인 못하고

에코기능을 가지고 잇는 getche() 함수를 통해 입력한 값의 코드를 확인할 수 있습니다...


그렇다는 말은 아래 코드와 같이

기능키를 입력받음으로 메뉴 선택을 할 수 있는 기능을 구현할 수 있게 된다 이겁니다...


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//... 중략 ...
enum Key
{
    F1, F2, F3
};
 
//... 중략 ...
    int key = 0;
    key = _getch();
 
    if (key == 0)
    {
        key = _getch();
        switch (key)
        {
        case 59:    return F1;    
        case 60:    return F2;
        case 61:    return F3;
        
//... 중략 ...
    cout << "[F1] 호날두 [F2] 메시 [F3] 삽잡이" << endl;
 
//... 중략 ...
        switch (key)
        {
        case F1: 호날두(); break;
        case F2: 메시(); break;
        case F3: 삽잡이(); break;
 
        defaultcout << "잘못 선택하였습니다." << endl;
        }
//... 중략 ...
cs


코드를 많이 간추리긴 했지만...

이와 같이 눌린 기능키에 맞게 출력되게 할 수 있다 이겁니다...


참고로, 기능키/ 방향키 와 같은은 특수키(?) 들은 생긴지

다른 기존의 키들에 비해 훨씬 덜 됬기 때문에 추후 구현이 됬데요...

그래서 getch()를 두번 받아야 원하는 값이 출력되도록 약속이 되어 있습니다...

F1 같은 경우에는 0과 59의 코드를 가지고 있는데요...


음... 그러니까 아마 위의 코드와 다르게 한번만 getch()를 받았다 하면

0만 인식을 하기 때문에 기능키를 구별할 수 없게됩니다...

그렇기에 위의 코드와 같이 getch()를 두번 입력 받아야 원하는 기능키의 코드를 얻을 수 있다 이겁니다...




3. 다형성 객체 관리


예를들어 학생 관리 프로그램을 만든다고 생각해봅시다...

Student라는 기반 클래스가 있다고 가정해보도록 하겠습니다.

이 기반클래스로부터 문과생, 이과생, 예체능생(?)이 파생됬다고 생각해보져....


C++에서 

파생된 객체들은 기반 클래스 형식의 포인터 변수로 담을 수 있습니다...


그렇다면

Student라는 형식의 포인터 변수로 

문과/이과/예체능 형식의 객체를 저장할 수 있게 된다는 뜻입니다....


이때는 이와 같이 학생들을 관리할 수 있겠죠...


1
2
3
4
5
6
7
8
9
Student* stu = 0;
 
switch (key)
{
    case F1: stu = new 문과생(name);    break;
    case F2: stu = new 이과생(name);    break;
    case F3: stu = new 예체능(name);    break;
    
//... 중략 ...
cs


Student* 라는 기반 클래스로 부터 파생된 객체들을 담을 수 있다....


여기서 근데 문제가 하나 생길 수 있습니다...

각기 다른 객체들이 하나의 기반클래스로 모였다면...


이를 식별할 수 있는가?


즉, Stu[0] 에는 문과생, Stu[1] 에는 이과생 이렇게 들어있는데

이들은 단지 Stu[0], Stu[1] 뿐입니다... 

기반 클래스만으로 어떻게 구별을 할 수 있겠냐 이말이죠....


이때는 다운 캐스팅을 통해 구별해야하는데요... 

이때 사용하는 것이 dynamic_cast 입니다.


1
2
3
4
5
6
7
//... 중략 ...
    문과생 *문과 = dynamic_cast<문과생 *>(stu);
    if(문과)
    {
        //문과생이 맞으니 이에 따른 명령을 수행하겠어...
    
//... 중략 ...
cs


이와같이 stu... 즉, 학생이라는 기반 클래스에 담겨져있는 

객체의 주소가 문과생 파생클래스 라면!

이렇게 기반클래스에서 다운케스팅을 함으로써 파생 클래스를 식별할 수 있게 된다 이겁니다...




이상 잡다구리하게 좀 알아봤습니다...

코드를 워낙 해괴하게... 알아보실수 있으련지...

아무튼... 이상 삽잡이였습니다!