ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024 - 01 - 22 C++ Grammar D+4
    Language Grammar/C++ 2024. 1. 22. 18:23

    *정보 은폐

    JpegImage 클래스의 경우로 예를 들자면,

    class JpegImage
    
    {
    
    private:
    
        byte * RawData;
    
        JPEGHEARDER Header;
    
        void DeComp();
    
        void EnComp();
    
    
    
    public:
    
        Jpeg();
    
        ~Jpeg();
    
        bool Load(char* FileName);
    
        bool Save(char* FileName);
    
        void Draw(int x, int y);
    
    };




    1. 몰라도 된다.
    사용자의 입장에서는 JpegImg 파일을 Load 하여 출력하는 행위만 원하므로 Load,Save, Draw 함수만 모두 접근이 가능한 public 접근자를 줌

    2. 몰라야 한다 
    나머지를 Private 로 선언하는 이유는 혹여나 사용자가 의도치않게 
    이미지 정보를 저장하는 RawData 및 압축을 해제하고 이미지 데이터의 구조 판별과 
    헤더 분석이 끝나야만 호출 할수있는 DeComp 함수를 건드릴경우 이미지 손상의 위험이 있기 때문에 미연에 방지하기 위함이다.

    3. 클래스의 안정적인 기능 개선
    기존 함수보다 더 좋은 알고리즘을 써 개선한 함수를 만들었을때, 숨겨진 함수면 즉시 수정해도 사용자의 입장에서는 영향을 받지않는다.
    하지만 공개된 함수라면 사용자들이 이미 알고 있는 영역이며, 많은 사람들이 사용하고 있기 때문에 수정을 하려면 기존 사용자들이 이 객체에 대해 습득한 지식은 무효가 되며 추상화의 조건을 어기게 되는 것이다.
    그래서 사용자들과 직접적인 인터페이스를 이루지 않는 부분은 최대한 숨기는 것이 유리하다.

    *프렌드(friend) 함수

    전역함수로 선언을 한뒤 쓰일 클래스안에 friend 타입 함수이름 {인수} 를 선언하면 해당 클래스안의 모든 멤버변수에 대해 접근할 수있음

    실습코드

     

    class Date;
    
    class Time
    {
        friend void OutToday(Date&, Time&);
    private :
        int hour, min, sec;
    public:
        Time(int h, int m, int s) { hour = h; min = m; sec = s; }
    };
    
    class Date
    {
        friend void OutToday(Date&, Time&);
    private:
        int year, month, day;
    public:
        Date(int y, int m, int d) { year = y; month = m; day = d; }
    };
    
    void OutToday(Date& d, Time& t)
    {
        printf("오늘은 %d년 %d월 %d일이며 지금 시간은 %d:%d:%d입니다. \n",
            d.year, d.month, d.day, t.hour, t.min, t.sec);
    }
    
    void main()
    {
        //27-2 프렌드 함수
        Date D(2005, 01, 02);
        Time T(12, 34, 56);
        OutToday(D, T);
    }






    *프렌드(friend) 클래스

    클래스와 클래스간 멤버변수를 참조하고 싶으면 클래스안에 friend 클래스이름을 선언할시
    선언당한 클래스는 해당 클래스의 멤버변수에 접근할수있는 권한을 가진다.

    실습 코드

     

    class ClassTime
    {
        friend class ClassDate;
    private:
        int hour, min, sec;
    public:
        ClassTime(int h, int m, int s) { hour = h; min = m; sec = s; }
    };
    
    class ClassDate
    {
    private:
        int year, month, day;
    public:
        ClassDate(int y, int m, int d) { year = y; month = m; day = d; }
        void OutToday(ClassTime& t)
        {
            printf("오늘은 %d년 %d월 %d일이며 지금 시간은 %d:%d:%d 입니다.\n",
                year, month, day, t.hour, t.min, t.sec);
    
        }
    };
    
    
    void main()
    {
        //27-2 프렌드 클래스
        ClassDate D(2005, 01, 02);
        ClassTime T(12, 34, 56);
        D.OutToday(T); 
    }



    *프렌드(friend) 멤버 함수

    개념은 프렌드 함수와 동일하되, 다른 클래스에 속한 멤버함수를 쓴다는 차이점이 있다.

    실습 코드

     

    class FMTime;
    class FMDate
    {
    private:
        int year, month, day;
    public:
        FMDate(int y, int m, int d) { year = y; month = m; day = d; }
        void OutToday(FMTime& t);
    };
    
    class FMTime
    {
        friend void FMDate::OutToday(FMTime& t);
    private:
        int hour, min, sec;
    public:
        FMTime(int h, int m, int s) { hour = h; min = m; sec = s; }
    };
    
    void FMDate::OutToday(FMTime& t)
    {
        printf("오늘은 %d년 %d월 %d일이며 지금 시간은 %d:%d:%d 입니다\n",
            year,month,day,t.hour,t.min,t.sec);
    }
    void main()
    {
        //27-2 프렌드 멤버함수
        FMDate D(2005, 01, 02);
        FMTime T(12, 34, 56);
        D.OutToday(T);
    }




    *프렌드의 특성

    1. 프렌드 지정은 단방향이며 명시적으로 지정한 대상만 프렌드가 된다. A가 B를 프렌드로 선언하더라도 B가 A를 프렌드로 선언하지 않으면 A는 B의 프렌드가 아니다. 그래서 B는 A의 모든 멤버를 읽을 수 있지만 A는 그렇지 못하다.

    2. 프렌드 지정은 전이되지 않으며 친구의 친구 관계는 인정하지 않는다.
    예) A -> B 프렌드 지정 B-> C 프렌드 지정이라고해서 A 는 C 의 프렌드가 아니다

    3. 복수의 대상에 대해 동시에 프렌드 지정을 할 수 있지만, 프렌드 지정은 한 번에 하나씩만 가능하다. 
    예) *  friend class A,B (X)
          
          * friend class A (O)
            friend class B

    4. 프렌드 관계는 상속되지 않는다.
    예) B는 A의 프렌드이지만 B의 상속을 받은 C 는 프렌드가 아니다.

    하지만 C가 상속받은 B의 멤버 함수는 B 클래스의 소속이기때문에 A에 대한 액세스가 허용된다.

    * 정적 멤버

    클래스안에 정의된 멤버함수안에 컴파일러가 던져주는 객체의 주소 정보

    this : 객체 자기 자신을 의미하는 키워드

    * 정적 멤버 변수

     클래스 바깥에 선언되어 있지만 클래스에 속하며 객체별로 할당되지 않고, 모든 객체가 공유하는 멤버이다.

    객체 전체를 대표하는 클래스와 관련된 정보를 저장하는 특수한 멤버

    * 전역 변수의 문제점

    1.클래스와 관련된 정보임에도 불구하고 클래스 바깥의 전역변수로 선언하여 클래스 자신의 대한 정보를 완전히 캡슐화하지못함

    2.전역변수가 있어야만 동작할 수 있으므로 재사용하고자 할 경우 항상 전역변수와 함께 배포해야 한다. 클래스만 배포해서는 제대로 동작 하지 않는다.

    3.전역변수는 은폐할 방법이 없기 때문에 외부에 대한 접근을 방해하지못한다.

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

    2024 - 01 - 30 C++ Grammar D+6  (1) 2024.01.30
    2024 - 01 - 23 C++ Grammar D+5  (0) 2024.01.23
    2024 - 01 - 18 C++ Grammar D+3  (0) 2024.01.18
    2024 - 01 - 16 C++ Grammar D+2  (0) 2024.01.16
    2024 - 01 - 15 C++ Grammar D+1  (0) 2024.01.15
Designed by Tistory.