갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 모바일 게임 순위
  • 게임 매출 순위
  • c# coroutine
  • C# boxing
  • 유니티 골드그래프
  • 알고리즘
  • C++ 상속
  • pc게임 순위
  • C# 예외 처리
  • 전세계 게임 매출
  • Unity Graph
  • c# 코루틴
  • 강남 방탈출
  • 롤 골드그래프
  • c# delegate
  • 전세계게임매출순위
  • C++ virtual
  • 유니티 그래프
  • 게임 디자인 패턴
  • 게임매출순위
  • 자바
  • 2020년 게임 매출
  • c# collection
  • C++ 소멸자
  • C++
  • 유니티 그래프 그리기
  • c# unboxing
  • c# Thread
  • pc 게임 순위
  • 글로벌게임매출

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C++] 접근지정자
프로그래밍/C++

[C++] 접근지정자

2019. 10. 29. 23:27
728x90
반응형

1. 접근지정자 (access specifiers)

struct Book {
    int code;
    int price;
};

int main() {
    Book b;
    b.price = -1000;
}

 

위와 같은 코드가 있다고 해보자.
Book이란 구조체는 책의 code번호와 가격 정보를 들고있다.
사용자는 main()함수에서 책을 만들고 책의 가격을 바꾸려고 하는데 사용자가 실수로 '-'를 넣었다고 해보자.
가격은 음수가 될 수 없는데 이러한 실수를 막으려면 어떻게 해야 할까?

  - 멤버 데이터를 외부에서 직접 접근하면 객체가 잘못된 상태를 가지게 될 수 있다.

  - 접근지정자를 통해 멤버 함수를 통해서만 멤버 데이터를 변경할 수 있게한다.

    => 멤버 함수는 인자의 유효성 여부를 조사 할 수 있다.

 

struct Book {
private:
    int code;
    int price;

public:
    void changePrice(int n) {
        if(n < 1) return;
        
        price = n;
    }
};

int main() {
    Book b;
    // b.price = -1000;
    b.changePrice(-1000);
}

  - 최소한 오동작할 환경은 막을 수 있다.

  - 접근 지정자 (access specifiers)

  - 멤버 데이터와 멤버 함수

    => 멤버 데이터는 private로 만드는 경우가 많다.

    => 멤버 함수는 public로 만드는 경우가 많다.

 


2. 정보은닉, 캡슐화, setter/getter

struct Book {
private:
    int code;
    int price;

public:
    void changePrice(int n) {
        if(n < 1) return;
        
        price = n;
    }
    int getPrice() { return Price; }  // getter
};

int main() {
    Book b;
    b.changePrice(-1000);
}

  - 객체의 사용자는 객체의 내부 멤버 데이터의 구조에 대해서는 알 필요가 없다. 멤버 함수만 알면 된다.

    => 정보 은닉 (information hiding)

  - 멤버 함수를 통해서만 객체의 상태를 변경할 수 있기 때문에 객체의 상태를 항상 안전하게 유지 할 수 있다.

    => 캡슐화 (encapsulation)

  - setter / getter

    => 멤버 데이터의 값을 변경하거나 얻기 위해 사용하는 멤버 함수를 나타내는 용어

  - Struct vs Class

    => Struct : 접근 지정자 생략 시 기본 설정 값은 public

    => Class  : 접근 지정자 생략 시 기본 설정 값은 private

  - 참고

    => java, C# 등의 대부분의 객체지향 언어 : 접근 지정자를 모든 멤버에 개별적으로 표기

    => C++ : 접근 지정자를 한번 표기하면 새로운 접근 지정자가 나올 때까지 계속 적용

 


3. friend 함수 개념

class Car {
    int color;
    int speed;
    int engineTemp;
public:
    int getSpeed() { return speed; }
    
    friend void fixCar(Car& c);
};

void fixCar(Car& c) {
    int n = a.engineTemp;
}

int main() {
    Car c;
    fixCar(c);
}

 

color, speed, engineTemp는 private으로 지정된 멤버 데이터이다.
한데 밖에 있는 fixCar() 함수에서 engineTemp 멤버 데이터에 접근하고 싶다면 어떻게 해야 할까?
friend void fixCar(Car& c);

위 내용을 클래스 내부에 넣으면 문제 없이 컴파일 된다.

  - friend 함수

    => 멤버 함수는 아니지만 private멤버에 접근 할 수 있게 하고 싶을 때

  - 왜 멤버 함수로 만들지 않는가?

    => 멤버 함수로 만들 수 없는 경우가 있다.

  - 왜 getter/setter를 사용하지 않는가?

    => getter/setter를 제공하면 모든 함수에서 접근할 수 있다.

    => 모든 함수가 아닌 특정 함수에서만 접근할 수 있게 하고 싶을 때

728x90
반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++] 소멸자 (destructor)  (0) 2019.11.04
[C++] 생성자 (constructor)  (0) 2019.10.31
[C++] 객체지향 프로그래밍의 개념(2)  (0) 2019.10.29
[C++] 객체지향 프로그래밍의 개념(1)  (0) 2019.10.29
[C++] 동적 메모리 할당, nullptr  (0) 2019.10.27
    '프로그래밍/C++' 카테고리의 다른 글
    • [C++] 소멸자 (destructor)
    • [C++] 생성자 (constructor)
    • [C++] 객체지향 프로그래밍의 개념(2)
    • [C++] 객체지향 프로그래밍의 개념(1)
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바