본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]백길남_2011년 11월 10일_일일보고서

by 알 수 없는 사용자 2011. 11. 10.
728x90
반응형

구조체 안에 함수를 사용할수 있는 것의 발전되어 클래스가 되었다.
C++ 은 일반 구조체에서 도 함수를 사용할 수 있다. (C 에서는 사용불가)

객체는 데이터 위주 (예제의 obj 함수를 둘러싼다.)
구조적 프로그램은 자료와 함수가 분리되어 있고 자료에 쉽게 접근하게 된다.(자료에 대한 보호가 부실)
객체는 자료에 대해 일괄적인 인터페이스를 제공하고 사용용도를 유도 할 수 있다.

 그럼이번에는 구조체 안에 함수를 사용하여 보자.
구조체 안에 함수를 사용하였으므로 구조체 인자를 다 없애 주어야한다.
그리고 구조체안에 변수가 다 선언되어 있으므로 그냥 가져다 쓰면된다.

#include <iostream.h>
#include <stdlib.h>
struct emb
{
    int * item;
    int iNum;
    //분홍색을 리터널(문자 상수)이라 한다.
    //구조체 초기화v
    bool embINIT()
    {
        cout << "embINIT" << endl;
        item = 0;
        iNum = 0;
        return true;
    }
    bool embINIT(unsigned int uiNum)
    {
        cout << "embINIT2" << endl;
        if(uiNum == 0)
        {
            return false;
        }
        //갯수만큼 동적할당 받아서 붙여줌
        item = (int *)malloc(sizeof(int)*uiNum);
        if(item == 0)
        {
            return false;
        }
        //갯수
        iNum = uiNum;
        return true;
    }
    void embfree()
    {
        cout << "embfree" << endl;
        if(item == 0)
        {
            return ;
        }
        free(item);
        item = 0;
        iNum = 0;
    }
};
 
 
//메인 함수에서 obj 를 건들지 않고
//obj 를 함수에서 간접적으로 접근하는 것을
//자료가 추상화 되었다고 한다.
int main()
{
    emb obj;
    
    obj.embINIT();
    obj.embINIT(300);
    obj.embfree();
    return 0;
}


이렇게 되면 전의 소스 보다 소스가 간결해 지면서 똑같이 동작함을 알 수가 있다.
오버로딩을 객체에서는 다형성 이라고 부른다.(인자로써 구별)
위 소스에서 조금더 추가하여 클래스를 생성할 수 있다.

붕어빵을 만들때에 사용되는 틀이 클래스에 해당이되고 만들어진 붕어빵을 객체라고한다.
같은 붕어빵 틀에서 만들었지만 다 다르게 됨을 알수있다.

그러므로 클래스에서 만들어진 객체라 할 지라도 각각 다 다르다고 말할 수 있다.
객체를 분류하는 기준을 클래스라고한다.

클래스를 만들때 모델링을 한다.
속성에 대해서 정의를 내리는 것을 말한다.
attribute 라한다.(도스명령창에서 attrib 명령을 치면 파일의 속성을 알 수 가 있다.)

객체에는 행동 과 상태가 존재한다.
상태는 자료에 저장하고 행동은 함수에 저장한다.
행동 과 상태로 객체의 표현이 가능해 진다.

여러 책을 가지고 클래스를 만들경우 여러 책의 공통 적인 부분으로 클래스를 만든다.
클래스를 만들고 객체 안에 정보를 넣을 수 있다.

클래스로 만들때

private 와 public 를 사용해주는데 이것을 접근 속성이라고한다.
class 를 사용하게되면 기본적으로 private 이 적용되어 진다.
하지만 함수는 메인에서 불러들이므로 접근 속성에 위배 되기 때문에 함수는 제외 하고 private 를 사용해 주어야한다.

함수위에는 public 을 사용해 주어야한다.
중간중간에 private 와 public 을 사용할수 있지만 정리를 위해서 모아서 사용한다.(변수와 함수를 모아서 사용)
함수 이름앞에 private 를 사용하고 컴파일시 에러 문구이다.

위 그림중 가운데 를 보면 작은 따옴표로 묶여 있는 부분이 있는데 이부분이 중요한다.
접근 속성 때문에 에러가 난 모습니다.(private)
여기서 emb:: 은 emb 구조체 를 말하고

:: 은 스코프 연산자를 말한다.

스코프 연산자는 범위 연산자라고 하며 오른 쪽 이 왼쪽에 소속이라는 뜻을 가지고 있다.
클래스는 구조체에서 발전되어서 만들어진 것이다.

[class 로 만든 소스]

#include <iostream.h>
#include <stdlib.h>
 
//struct emb
class emb
{
    private:
        int * item;
        int iNum;
    
    public:
    //분홍색을 리터널(문자 상수)이라 한다.
    //구조체 초기화v
        bool embINIT()
        {
            cout << "embINIT" << endl;
            item = 0;
            iNum = 0;
            return true;
        }
        bool embINIT(unsigned int uiNum)
        {
            cout << "embINIT2" << endl;
            if(uiNum == 0)
            {
                return false;
            }
            //갯수만큼 동적할당 받아서 붙여줌
            item = (int *)malloc(sizeof(int)*uiNum);
            if(item == 0)
            {
                return false;
            }
            //갯수
            iNum = uiNum;
            return true;
        }
        void embfree()
        {
            cout << "embfree" << endl;
            if(item == 0)
            {
                return ;
            }    
            free(item);
            item = 0;
            iNum = 0;
        }
};
 
 
//메인 함수에서 obj 를 건들지 않고
//obj 를 함수에서 간접적으로 접근하는 것을
//자료가 추상화 되었다고 한다.
int main()
{
    emb obj;
    
    obj.embINIT();
    obj.embINIT(300);
    obj.embfree();
    return 0;
}

클래스 내 외부에 함수는 서로 다른 함수이다.
그러므로 클래스 내부 함수라는 것을 정의 해주어야한다.

정의 해주기 위해서 스코프 연산자를 사용한다.( :: )
C++ 에서 클래스는 변수 이름과 함수이름 만 존재한다. 그리고 나중에 클래스는 헤더 파일로 함수는 cpp 파일로 분할 하게 된다.

[class 부분에 있는 함수를 밖으로 보낸 소스]

#include <iostream.h>
#include <stdlib.h>
 
class emb
{
    private:
        int * item;
        int iNum;
    
    public:
        bool embINIT();
        bool embINIT(unsigned int uiNum);
        void embfree();
};
int main()
{
    emb obj;
    
    obj.embINIT();
    obj.embINIT(300);
    obj.embfree();
    return 0;
}
bool emb::embINIT()
{
    cout << "embINIT" << endl;
    item = 0;
    iNum = 0;
    return true;
}
bool emb::embINIT(unsigned int uiNum)
{
    cout << "embINIT2" << endl;
    if(uiNum == 0)
    {
        return false;
    }
    item = (int *)malloc(sizeof(int)*uiNum);
    if(item == 0)
    {
        return false;
    }
    iNum = uiNum;
    return true;
}
void emb::embfree()
{
    cout << "embfree" << endl;
    if(item == 0)
    {
    return ;
    }    
    free(item);
    item = 0;
    iNum = 0;
}
 

이제 함수를 분리 시켜보자.
헤더 파일과 cpp 파일로 분할 한 모습이다.

[main.cpp]

#include <iostream.h>
#include "emb.h"
int main()
{
    emb obj;
    
    obj.embINIT();
    obj.embINIT(300);
    obj.embfree();
    return 0;
}

[emb.h]

#ifndef __EMB_H_
#define __EMB_H__
#include <stdlib.h>
#include <iostream.h>
class emb
{
    private:
        int * item;
        int iNum;
    
    public:
        bool embINIT();
        bool embINIT(unsigned int uiNum);
        void embfree();
};
#endif //__EMB_H__
 

[emb.cpp]

#include "emb.h"
 
bool emb::embINIT()
{
    cout << "embINIT" << endl;
    item = 0;
    iNum = 0;
    return true;
}
bool emb::embINIT(unsigned int uiNum)
{
    cout << "embINIT2" << endl;
    if(uiNum == 0)
    {
        return false;
    }
    item = (int *)malloc(sizeof(int)*uiNum);
    if(item == 0)
    {
        return false;
    }
    iNum = uiNum;
    return true;
}
void emb::embfree()
{
    cout << "embfree" << endl;
    if(item == 0)
    {
    return ;
    }    
    free(item);
    item = 0;
    iNum = 0;
    return;
}
 



[inline]

이 함수를 사용하게 되면 함수로 써 수행되는 것이아니라
메인 안에 함수 호출 부분에 함수의 내용이 들어가게된다. 이렇게 되면 함수를 호출 하지 않게 된다.
속도는 빨라지지만 용량이 늘어나므로 때에 따라서 잘사용하자.
클래스 내부 에다가 함수를  쓰면 자동으로 lnline사용하게된다.
파일을 분할했을시에  inline 함수는 헤더 에서도  사용해야한다.
객체의 크기는 STACK 이나 HEAP 이나 전역등이 차지하고 있는 크기를 말한다.

전역 변수를 선언 하고 함수 안에서 결과를 보면 클래스 내부 변수의 값이 출력됨을 알수 가 있다.
왜냐하면 함수는 클래스 내부에 존재 하기 때문인데 그럼 전역 변수를 출력하기 위해서는 어떻게 해야하는가?
출력문에서 변수 문 앞에 스코프를 붙여 주면 전역 변수로 인식 할 수 있다.

메인 함수 안에서도 같은 이름의 변수가 선언되어있다면 전역 변수 출력시 스코프 를 붙여 주면된다.
메인 함수 안에서는 클래스 내부의 변수는 출력할 수없다. 왜냐하면 클래스 안은 private 이기 때문이다.


#include <iostream.h>
#include <stdlib.h>
 
class emb
{
    private:
        int * item;
        int iNum;
    
    public:
        bool embINIT();
        bool embINIT(unsigned int uiNum);
        void embfree();
};
int iNum = 100;
int main()
{
    emb obj;
 
    obj.embINIT();
    obj.embINIT(300);
    obj.embfree();
    cout << iNum << endl;
    cout <<"class 의 크기 : " <<  sizeof(emb) << endl;
    return 0;
}
bool emb::embINIT()
{
    cout << "embINIT" << endl;
    item = 0;
    iNum = 0;
    //class 내부 변수 
    cout << iNum << endl;
    //전역 변수 
    cout << ::iNum << endl;
    return true;
}
bool emb::embINIT(unsigned int uiNum)
{
    cout << "embINIT2" << endl;
    if(uiNum == 0)
    {
        return false;
    }
    item = (int *)malloc(sizeof(int)*uiNum);
    if(item == 0)
    {
        return false;
    }
    iNum = uiNum;
    return true;
}
void emb::embfree()
{
    cout << "embfree" << endl;
    if(item == 0)
    {
    return ;
    }    
    free(item);
    item = 0;
    iNum = 0;
}
 

 

[결과]



 
#include <stdio.h>

int main()
{
  int A = 100;
  int * P = &A;
  int &= A;

  printf("A = %X\n",A);
  printf("P = %X\n",P);
  printf("R = %X\n",R);
  
  printf("A address = %X\n",&A);
  printf("P address = %X\n",&P);
  printf("R address = %X\n",&R);

  R = 99;
  printf("A = %X\n",A);
  printf("P = %X\n",P);
  printf("R = %X\n",R);


  
  return 0;
}

int A 에 100 을 넣고 int * P 에 A 의 주소를 넣는것까지는 많이 봐왔을 것이다.
하지만 int &R = A;  는 처음 보는것이다.
그렇다 바로 이것이 참조 인것이다. 위 소스에서 값 과 주소를 출력하는데 R 과 A 의 주소와 값이 동일 하다는 것을 알수가 있다.
A 와 R 을 같이 취급하고있는 것이다. 이것은 초기화시에만 사용할 수 있다.


 


728x90