[접근 지정자] - public, private, protected

private 클래스 내의 멤버 함수들에게만 접근을 허용

              자기 객체 안에서만 접근 가능, 클래스에서 정의된 메소드를 통해 접근할 수 있다.

              접근지정자를 명시하지 않은 경우, 기본적으로 private

 

public 프로그램의 모든 함수에게 접근을 허용
             * 클래스의 모든 멤버 변수,함수를 public으로 한다면 구조체(struct)와 동일

                → 구조체(struct)는 기본적으로 public 이다

 

protected 클래스 내의 멤버 함수와 이 클래스를 상속 받은 파생 클래스의 멤버 함수에게 접근을 허용

 

( 아래의 예시에서는 상속 내용까지는 다루지 않기 때문에 protected에 대한 내용은 빠져있습니다. )


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
32
33
34
35
36
#include <iostream>
 
using namespace std;
 
class Base {
private:
    int a;
    int b;
public:
    Base(int _a, int _b, int _c) {
        a = _a;
        b = _b;
        c = _c;
    }
    int get_a() { return a; }
    int get_b() { return b; }
    void print_a() {cout << "a: " << a << endl;}
    void print_b() { cout << "b: " << b << endl; }
 
    int c;
 
};
 
int main() {
    Base A(345);
    //cout << A.a << endl;  ==> a는 private 으로 지정되어 외부에서 접근 불가
    cout <<"c : " << A.c << endl;  // c는 public 으로 지정된 변수로 외부에서 접근이 가능
    
    int tmp = 10;
    cout <<"변경 전 : " << tmp << endl;
 
    tmp = A.get_a();  // 객체 A 내부의 메소드인 get_a를 통해 private a에 대한 값을 얻을 수 있다.
    cout << "변경 후 : " << tmp << endl//get_a()를 통해 얻은 값 tmp가 A 내부에 a 값과 같아짐을 볼 수 있다.
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

[ 실행 결과 ]

반응형

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

클래스(Class) (1) - 객체, 클래스 설명  (0) 2020.03.31
메모리 할당 (new,delete)  (0) 2020.01.26
참조자(Reference)  (0) 2020.01.23
이름 공간(Name Space)  (0) 2020.01.23

[ 객체(Object) ]

현실의 것을 컴퓨터로 표현하기 위해 추상화 과정을 통해 바꿔 놓은 것

변수와 메소드로 이루어진 소프트웨어 덩어리
  
  객체의 변수 인스턴스 변수(Instance variable)
  객체의 함수 인스턴스 메소드(Instance method)

 

메소드-변수 모식도

메소드(  변수  ) 로 메소드가 변수들을 감싸는 것으로 그림 표현 가능

  객체에 정의된 변수들에 접근하기 위해서 메소드를 통해야 가능하기 때문
      (사용자 정의에 의해서 private에 포함되는 변수들에 한함)

 

캡슐화(Encapsulation)
  외부에서 인스턴스의 변수 값을 직접 바꿀 수 없고, 인스턴스 메소드를 통해 간접적으로 조절하도록 하는 것

  캡슐화의 장점

    → 객체가 내부적으로 어떻게 작동하는지 몰라도 사용할 수 있다


[ 클래스(Class) ]

객체를 만들기 위한 '설계도' 라고 생각할 수 있다

ex) '소나타'라는 이름의 car 객체를 만들기 위한 설계도인 CLASS CAR

 

클래스는 설계도에 불가 실재하지 않음

클래스로 생성된 인스턴스 실재하는 객체

 

형태 : class car{}; car 클래스
        car 소나타; → car 객체 '소나타'

 

클래스 상의 정의된 변수, 함수 멤버 변수(member variable), 멤버 함수(member function) 

 

클래스를 이용해 '만들어진 객체' 인스턴스(Instance)

만들어진 객체의 변수, 함수 인스턴스 변수, 인스턴스 함수

반응형

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

클래스(Class) (2) - 접근 지정자  (0) 2020.03.31
메모리 할당 (new,delete)  (0) 2020.01.26
참조자(Reference)  (0) 2020.01.23
이름 공간(Name Space)  (0) 2020.01.23

* 메모리 구조 *
  프로그램이 실행되기 위해 메모리에 로드되어야 한다.
  프로그램이 실행될 때 운영체제로부터 프로그램을 위한 메모리를 할당 받는다.

    1. 코드 영역 - 프로그램의 코드가 들어감
          cpu가 코드 영역에 저장된 명령어를 하나씩 처리

    2. 데이터 영역 - 전역, 정적 변수 저장.
             프로그램의 시작과 함께 할당, 프로그램 종료 시 소멸

    3. 스택 영역 - 지역, 매개 변수 저장. 컴파일 타임에 크기가 결정됨.
          함수의 호출과 함께 할당, 함수의 호출이 완료되면 소멸.
          메모리의 높은 주소 -> 낮은 주소 방향으로 할당.

    4. 힙 영역 - 사용자의 동적 할당 시 사용하는 영역. 런 타임에 크기가 결정.
       사용자에 의해 메모리 공간이 동적으로 할당, 해제 됨
       메모리의 낮은 주소 -> 높은 주소 방향으로 할당.

* new와 delete *
 

  C 언어에서 malloc, free 와 같이 C++에서 메모리를 할당하는 함수

  메모리 할당. new
    형태 : int *p = new int ; ==> int형 메모리를 할당 후  포인터 p에 주소값을 저장
  * 배열 할당 *
     형태 : int *p = new int[arr_size]; ==> arr_size 만큼의 int형 배열 할당.

  할당된 메모리 삭제. delete
    형태 : delete p;  ==> new 통해 할당한 공간만 가능.

 

   * 할당된 배열 삭제 *
     형태 : delete[] p; ==> new로 할당된 배열 p 삭제.

반응형

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

클래스(Class) (2) - 접근 지정자  (0) 2020.03.31
클래스(Class) (1) - 객체, 클래스 설명  (0) 2020.03.31
참조자(Reference)  (0) 2020.01.23
이름 공간(Name Space)  (0) 2020.01.23

* 레퍼런스(Reference) (== 참조자) *
의미 : 어떤 다른 변수의 참고, 즉 다른 이름, '별명' 
         이미 존재하는 변수에 할당된 메모리 공간을 접근할 수 있는 또 다른 이름.

 

형태 : int &p ===> int형 레퍼런스 p

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
int main(){
    int number =2
    int &= number;  //number를 참조하는 레퍼런스 p 
    p = 5;            //p의 number참조로 number의 값이 5로 변경됨
    
    int &ref;  // 이런 문장은 존재 불가능! 
               // 존재하지 않는 것의 별명을 지을 필요는 없기 때문
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter


number의 값이 2 -> 5 로 변경


!! 레퍼런스(참조자)의 가장 중요한 특성 !! "반드시 정의 시 초기화" 되어야 함 !! 

!! 포인터(pointer)와 참조자(reference)의 차이 !!

  포인터 ==> 메모리 값(주소)을 보관하는 "변수"

  참조자 ==> 컴파일 시, 가리키는 변수의 주소값으로 치환되는 것.   

  1. NULL 값의 허용 여부
    포인터 ==> NULL 값 허용.
    참조자 ==> NULL 값이 될 수 없음.
  
    포인터의 경우 선언 시, NULL 값으로 초기화하지 않고 사용하면 에러가 나는 경우 발생.
    또한 잘못된 참조로 인해, 오류가 발생하기도 함.

    위의 오류를 방지하기 위해 참조자를 사용하면 좋음.
    NULL 값의 허용 여부에 따라, 허용하는 경우 NULL 여부를 체크하는 과정이 있어야 오류를 검사할 수 있음.
    허용하지 않는 경우, NULL 여부 체크를 생략해도 됨.

  2. 참조 대상 할당 및 접근
    포인터  ==>  참조 대상에 대해 &연산을 통해 주소값을 포인터에 할당
    참조자  ==>  참조 대상을 그대로 할당, 선언과 동시에 초기화를 하지 않으면 컴파일 오류 발생!

  3. 참조 대상 변경 가능 여부
    포인터 ==> 참조 대상을 언제든지 변경 가능
    참조자 ==> 참조 대상을 변경할 수 없음. "초기화 과정에서만 할당 가능"
                   재할당하는 경우에도 컴파일 에러 발생

1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main(){
    int a = 10
    int &ref = a; 
    int b = 3
    ref = b; 
 
    return 0;
}

  참조자 ref는 a를 참조하고
  ref = b; 는 참조자 ref가 b를 참조하는 것이 아니라 b의 값 3이 a에 대입된다.
  즉, a=3;
---------------------------------------------------------------------------------------

% 참조자는 리터럴 상수를 참조할 수 없다. % 
상수를 참조하기 위해서는
const int &ref = 4;
와 같은 형태로 "const" 키워드를 사용하여 참조

% 참조자의 배열은 "illegal" % 
  참조자는 이미 메모리 상에 존재하는 변수의 주소값에 대한 또 다른 이름으로
  별도의 메모리 공간을 차지하지 않는 것인데,
  메모리 공간을 차지하지 않는 것의 포인터는 모순.
  배열의 첫번째 이름은 포인터.

% 배열의 레퍼런스는 가능하다. ( 잘 사용하지 않음 ) % 
  형태 : int (&ref)[3] ;
  배열의 크기를 명확히 명시해 주어야 한다.
  포인터를 사용하면 int *p 하나로 사용가능하여 배열의 경우 "포인터"를 권장.

% 레퍼런스를 리턴하는 함수 %

1
2
3
4
5
6
7
8
#include <iostream>
 
int fn1(int &a) { return a; } 
 
int main() { 
  int x = 1
  std::cout << fn1(x)++ << std::endl
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter


위의 코드는 복사된 x값, 1이 리턴되어 수정이 불가능. 따라서 fn1(x)++ 불가.

1
2
3
4
5
6
7
8
9
#include <iostream>
 
int &fn2(int &a) { return a; } 
 
int main() { 
    int x = 1
    std::cout << fn2(x)++ << std::endl
    std::cout << "x :: " << x << std::endl
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter


위의 코드는 fn2에서 x의 참조자로 a를 지정하고, 별명인 a를 반환하므로 fn2(x)++ 가능.
------------------------------------------------------------------------------------

 

결과적으로 보다 안정성있는 프로그램을 작성하기 위해 참조자를 사용함.
참조자로 가능한 경우 왠만하면 참조자 사용, 어쩔 수 없는 경우 포인터 사용.

반응형

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

클래스(Class) (2) - 접근 지정자  (0) 2020.03.31
클래스(Class) (1) - 객체, 클래스 설명  (0) 2020.03.31
메모리 할당 (new,delete)  (0) 2020.01.26
이름 공간(Name Space)  (0) 2020.01.23

** 이름공간(namespace) **

  정의된 객체, 함수에 대해 어디소속인지 지정해주는 것
  중복된 이름의 객체, 함수여도 소속된 이름 공간이 다르면 다른 것으로 취급.

 

  std::cout, std::cin, std::endl 에서 std는 c++의 표준라이브러리의 모든 함수, 객체 등이 정의된 이름공간(namespace)

  namespace space1{}   -- 이름공간에 포함되고자하는 함수나 객체들을 넣어주어 이름 공간을 만들어 주면 된다.

  ('space1' 이라는 이름 공간 정의 )

1
2
3
4
5
6
#include <iostream>
 
using namespace std;   // "iostream" 안에 이름공간 "std"를 사용하겠다.
 
cout << "Hello, World" << endl //cout 과 endl 은 "iostream" 헤더파일 안에 
                               //"std"라는 이름 공간에 정의되어 있는 것들 

  using namespace 를 사용해 어떤 이름공간을 사용하겠다라고 선언하는 것은 권장하지 않는다고 한다.
    ---> 명시적으로 "std:: "와 같이 붙여주는 것이 함수의 한정적인 사용을 막아 오류를 예방할 수 있음.

  이름공간의 이름을 명명하지 않은 경우, 해당 파일 안에서만 접근 가능. "static" 과 같은 효과
    형태 : namespace {}

반응형

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

클래스(Class) (2) - 접근 지정자  (0) 2020.03.31
클래스(Class) (1) - 객체, 클래스 설명  (0) 2020.03.31
메모리 할당 (new,delete)  (0) 2020.01.26
참조자(Reference)  (0) 2020.01.23

+ Recent posts