'Programming'에 해당되는 글 341건

  1. 2012.05.12 캡슐화
  2. 2012.05.08 const 함수 2
  3. 2012.05.03 정보은닉(Information Hiding)
  4. 2012.05.02 Message Passing
  5. 2012.05.02 클래스 기반의 두 가지 객체생성 방법

캡슐화

Programming/C++ 2012. 5. 12. 02:11 |
캡슐화
:하나의 목적 하에 둘 이상의 기능이 모여서 하나의 목적을 달성.

캡슐화에는 정보은닉이 기본적으로 포함된다.

캡슐화는 감싸는 개념이다. 그런데 감싸려면 안전하게 감싸야 한다. 다시 말해서 이왕이면 멤버변수가 보이지 않게 정보를 은닉해서 감싸는 것이 좋다. 그래서 캡슐화는 기본적으로 정보은닉을 포함하는 개념이라고 이야기한다.

※ 캡슐화는 어려운 개념이다. 왜냐하면 캡슐화의 범위를 결정하는 일이 쉽지 않기 때문이다.

#include <iostream>


using namespace std;


class Point 

{

    private:

        int xpos, ypos;


    public:

        void Init(int x, int y)

        {

            xpos = x;

            ypos = y;

        }

        

        void ShowPointInfo(void) const

        {

            cout<<"["<<xpos<<", "<<ypos<<"]"<<endl;

        }

};


class Circle 

{

    private:

        int rad;

        Point p;


    public:

        void Init(int x, int y, int r)

        {

            rad = r;

            p.Init(x, y);

        }


        void Show(void) const

        {

            cout<<"radius: "<<rad<<endl;

            p.ShowPointInfo();

        }

};


class Ring

{

    private:

        Circle c1;

        Circle c2;


    public:

        void Init(int x1, int y1, int r1, int x2, int y2, int r2)

        {

            c1.Init(x1, y1, r1);

            c2.Init(x2, y2, r2);

        }


        void ShowRingInfo(void) const

        {

            cout<<"Inner Circle Info..."<<endl;

            c1.Show();

            cout<<"Outter Circle Info..."<<endl;

            c2.Show();

        }

};


int main(void)

{

    Ring ring;

    ring.Init(1, 1, 4, 2, 2, 9);

    ring.ShowRingInfo();

    return 0;

}


이 코드에서 주목할 점.


Ring 클래스, Circle 클래스, Point 클래스 모두 자신의 정보를 출력하기 위한 함수를 멤버에 포함시켜서 캡슐화를 완성하였다.

'Programming > C++' 카테고리의 다른 글

이니셜라이저(Initializer)  (0) 2012.05.19
생성자(Constructor)  (0) 2012.05.12
const 함수  (2) 2012.05.08
정보은닉(Information Hiding)  (0) 2012.05.03
Message Passing  (0) 2012.05.02
Posted by scii
:

const 함수

Programming/C++ 2012. 5. 8. 03:01 |

int GetX(void) const;

int GetY(void) cosnt;

void Show(void) cosnt;


이 const가 의미하는 바는 "이 함수 내에서는 멤버변수에 저장된 값을 변경하지 않겠다!" 라는 뜻이된다.


매개변수도 아니고, 지역변수도 아닌 멤버변수에 저장된 값을 변경하지 않겠다는 선언이다. 따라서 const 선언이 추가된 멤버함수 내에서 멤버변수의 값을 변경하는 코드가 삽입되면, 컴파일 에러가 발생한다. 


이렇게 함수는 cosnt로 선언하면, 실수로 자신의 의도와 다르게 멤버변수의 값을 변경했을 때, 컴파일 에러를 통해서 이를 확일할 수 있다. 



const 함수의 또 다른 특징 



const 함수 내에서는 const가 아닌 함수의 호출이 제한된다!!!


const로 선언되지 않은 함수는 아무리 멤버변수에 저장된 값을 변경하지 않더라도, 변경할 수 있는 능력을 지닌 함수이다. 따라서 이러한 변경이 가능한 함수의 호출을 아예 허용하지 않는 것이다.




InitNum 함수의 매개변수 ea는 'const 참조자'이다. 그런데 이를 대상으로 GetNum함수를 호출하면 컴파일 에러가 발생한다. 이는 GetNum이 const 함수가 아니기 때문이다.

const 참조자를 이용해서는 const 함수만 호출이 가능하다.

'Programming > C++' 카테고리의 다른 글

생성자(Constructor)  (0) 2012.05.12
캡슐화  (0) 2012.05.12
정보은닉(Information Hiding)  (0) 2012.05.03
Message Passing  (0) 2012.05.02
클래스 기반의 두 가지 객체생성 방법  (0) 2012.05.02
Posted by scii
:

클래스는 객체의 생성을 목적으로 디자인한다.


좋은 클래스가 되기 위한 최소한의 조건은 무엇일까?


ⓐ 정보은닉

ⓑ 캡슐화


이 두가지는 꼭 생각하며 클래스를 디자인해야 한다.


정보은닉을 하는 이유? 

제한된 방법으로의 접근만 허용을 해서 잘못된 값이 저장되지 않도록 하는데 있다. 또 실수를 했을 때, 실수가 쉽게 발견되도록 하는데 있다.


만약, 멤버변수가 직접적으로 접근이 가능하다면, 그리고 그곳에 음수가 들어가면 안되는 곳이라면.. 직접접근을 했을 때 위험에 노출된다. 

하지만 멤버변수를 private으로 설정하고 함수로만 멤버변수에 접근이 가능하도록 디자인한다면!!! 그 함수만 잘 만들면 잘못된 값의 저장을 막을 수 있다. 

이렇듯, 정보은닉은 꼭 생각하며 클래스를 디자인해야 한다.




코드에 있는 int GetX() const,   bool GetX(int xpos) 함수들을 가리켜 "엑세스 함수(access function)"이라고 한다. 이들은 멤버변수를 private으로 선언하면서 클래스 외부에서의 멤버변수 접근을 목적으로 정의되는 함수들이다.


보통 Get함수이름, Set함수이름을 쓴다. Get은 값을 리턴하는 목적이고, Set값을 대입하는 목적이다.


※ 지금 당장은 필요치 않지만 필요할 수 있다고 판단되는 함수들도 더불어 멤버에 포함시키는 경우도 많다. 대표적인 예가 '엑세스 함수'들이다.


'Programming > C++' 카테고리의 다른 글

생성자(Constructor)  (0) 2012.05.12
캡슐화  (0) 2012.05.12
const 함수  (2) 2012.05.08
Message Passing  (0) 2012.05.02
클래스 기반의 두 가지 객체생성 방법  (0) 2012.05.02
Posted by scii
:

Message Passing

Programming/C++ 2012. 5. 2. 22:30 |

관계를 형성하는 둘 이상의 클래스


하나의 독립된 클래스를 정의하는 것은 쉽다. 그러나 둘 이상의 클래스를 정의하되, 아래처럼 관계를 형성해서 정의하는 것은 쉽지 않다. 

하지만 이는 매우 중요하다. 단순히 함수호출로 이해하면 별 것 아니지만, 메시지 전달의 관점에서 보면 이는 매우 중요하다.


#include <iostream>

using namespace std;


class FruitSeller

{

private:

int numOfApple;

int totalMoney;

int APPLE_PRICE;

public:

void InitMember(int price, int num)

{

numOfApple = num;

APPLE_PRICE = price;

totalMoney = 0;

}

int SellFuit(int money)

{

int n = money/APPLE_PRICE;

numOfApple-=n;

totalMoney += money;

return n;

}

void ShowSeller(void)

{

cout<<"판매자의 남은 사과: "<<numOfApple<<endl;

cout<<"판매자의 현재 돈 : "<<totalMoney<<endl<<endl;

}

int gg;

};


class FruitBuyer

{

private:

int numOfApple;

int totalMoney;

public:

void InitMember(int money)

{

numOfApple = 0;

totalMoney = money;

}

void BuyFuit(FruitSeller &seller, int money) // 메시지 패싱. &를 이용하여 seller에게 접근(call-by-reference).

{

totalMoney -= money;

numOfApple += seller.SellFuit(money); //이 문장은 seller야 나에게 사과 2000원어치 줘라라는 뜻이된다.

}

void ShowBuyer(void)

{

cout<<"구매자의 소유한 사과: "<<numOfApple<<endl;

cout<<"구매자의 현재 돈 : "<<totalMoney<<endl<<endl;

}

};


int main(void)

{

FruitSeller seller;

seller.InitMember(1000, 20);

seller.ShowSeller();


FruitBuyer buyer;

buyer.InitMember(5000);

buyer.ShowBuyer();

buyer.BuyFuit(seller, 2000);  //seller에게 2000을 건내주고 있다.


seller.ShowSeller();

buyer.ShowBuyer();


return 0;

}



'Programming > C++' 카테고리의 다른 글

생성자(Constructor)  (0) 2012.05.12
캡슐화  (0) 2012.05.12
const 함수  (2) 2012.05.08
정보은닉(Information Hiding)  (0) 2012.05.03
클래스 기반의 두 가지 객체생성 방법  (0) 2012.05.02
Posted by scii
:

ClassName objName;  // 일반적인 변수의 선언방식으로 객체생성.

ClassName * ptrObj = new ClassName;  // 동적 할당방식(힙 할당방식)으로 객체생성.


'Programming > C++' 카테고리의 다른 글

생성자(Constructor)  (0) 2012.05.12
캡슐화  (0) 2012.05.12
const 함수  (2) 2012.05.08
정보은닉(Information Hiding)  (0) 2012.05.03
Message Passing  (0) 2012.05.02
Posted by scii
: