티스토리 뷰

42/cpp

객체지향, 접근지정자

stdbc 2021. 5. 25. 13:19

객체지향(OOP: Ojbect-oriented programming)

속성동작을 함께 결합하여 재사용 가능한 패키지로 만드는 기능을 제공

- 함수를 작성하는 데 초점을 맞추기보다는 명확하게 정의된 동작 세트가 있는 객체를 정의하는 데 중점을 둔다. 누가 주체이고, 어떤 행동을 할지 분명히 알 수 있다. 

- 프로그램을 보다 모듈화된 방식으로 작성할 수 있고, 더 쉽게 쓰고 이해할 수 있으며, 더 높은 수준의 코드 재사용성을 제공한다.

 

클래스

객체 지향 프로그래밍에서, 우리는 종종 우리의 타입이 데이터를 보유할 뿐만 아니라, 데이터와 함께 작동하는 기능을 제공하기를 원한다. C++에서는 이 작업을 class 키워드를 통해 수행한다.

 

구조체 선언과 마찬가지로 클래스 선언은 정의만 할 뿐 메모리에 할당되지 않고, 클래스 변수 선언 후 실제로 메모리에 올라간 특정 클래스 타입의 객체를 인스턴스라고 부른다.

 

클래스를 사용하기 위한 클래스 변수 선언 = 객체 선언 = 클래스의 인스턴스화 -> 메모리할당

객체(실제 집) = 클래스(집 설계도)의 인스턴스 


접근 지정자

출처

 

클래스의 멤버에 접근할 수 있는 사용자를 결정한다.

  • public: 공개 멤버, 클래스 외부에서도 접근 가능
  • priavte: 비공개 멤버, 클래스 내에서만 접근 가능
  • protected: 파생클래스에서 접근 가능 상속 참고

기본적으로 클래스의 모든 구성원(멤버)는 private다. 클래스에는 여러 접근 지정자를 사용하여 각 멤버의 접근 수준을 설정할 수 있다.

 

멤버 변수(속성, 필드)는 비공개로 하고, 멤버 함수(동작, 메소드)는 공개하는 것이 일반적이다. 

class DateClass 
{ 
    // members are private by default 
    int m_month;
    int m_day; 
    int m_year;

public: 
    // public, can be accessed by anyone
    void setDate(int month, int day, int year)  
    { 
        // setDate() can access the private members of the class because it is a member of the class itself 
        m_month = month; 
        m_day = day; 
        m_year = year; 
    } 
    void print() // public, can be accessed by anyone 
    { 
        std::cout << m_month << "/" << m_day << "/" << m_year; 
    } 
};

 

왜 멤버변수를 private로 지정할까? = 캡슐화

출처

 

객체의 필드와 메소드들을 하나로 묶고, 실제 구현 내용을 감추는 것(정보은닉)을 의미한다. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다. 필드와 메소드를 캡슐화하여 보호하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는데 있다.

 

장점

- 외부에서 멤버를 실수로 사용하지 못하도록 보호할 수 있다. (객체의 무결성)

- 낮은 결합도(특정 기능을 실행하는 데 다른 클래스나 모듈들에 의존적인 정도)를 유지할 수 있게 해준다.

- 사용하기 쉽고 프로그램의 복잡성을 줄여준다.

    ex) 완전히 캡슐화된 클래스를 사용하면, 클래스를 사용하기 위해 공개적으로 사용할 수 있는 멤버 함수와 이 함수의 인수 및 반환 값만 알면 된다. 예를 들어 std::string, std::array, std::vector, std::map 등을 사용하는 데 있어서 클래스가 내부적으로 어떻게 구현되었는지 몰라도 사용할 수 있다.

제대로된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도 그 부품을 사용하는 방법만 알면 쓸 수 있어야 한다. 이를테면 모니터가 어떻게 동작하는지 몰라도 컴퓨터와 모니터를 연결하는 방법만 알면 화면을 표시 할 수 있는 것과 같은 이치다. 즉 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것이다. 이러한 컨셉을 정보의 은닉화(Information Hiding), 또는 캡슐화(Encapsulation)라고 부른다. 자연스럽게 사용자에게는 그 부품을 사용하는 방법이 중요한 것이 된다.  

출처

 

getter, setter

객체의 필드에 직접 접근하면 안되는 이유


this 포인터

출처

 

this는 객체 자신의 주소값이다. this 키워드는 cpp의 클래스나 구조체, 공용체의 멤버 함수에서 해당 객체의 주소를 참조할 때 쓰인다. 

 

<this가 클래스 내에서 사용되는 이유>

1. 객체 자신의 주소를 리턴할 때

Exam* Exam::identify()
{
    return (this);
}

 

2. 객체 자신의 참조자를 리턴할 때 - 대입연산자 오버로딩 참고

Exam& operator=(const Exam& op)
{
    std::cout << "Assignation operator called" << std::endl;
    if (this != &op)
    {
    }
    return (*this);
}

 

3. 객체 자신을 복사하여 리턴할 때

 

4. 동일 이름의 변수와 구분을 하기 위해서 - 겹치는 변수명이 없는 경우에는 'this'를 생략하면, 컴파일시 자동으로 "this->data" 와 같은 명시적 표현으로 변환된다.

void Exam::SetData(int parm_data)
{
    // 지역 변수 data
    int data = 0;
    // 멤버 변수의 data임을 this포인터로 지칭한다.
    this->data = parm_data;
    // 전역 변수를 지칭할 때 - ::data = parm_data;
    // 지역 변수를 지칭할 때 - data = parm_data;
}

 

5. 객체 내부에서 자신의 주소값이 사용 될 때

 


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함