본문 바로가기
C++/기초(두들낙서)

[C++] 네임스페이스, 클래스와 구조체,this 포인터

by Meaning_ 2022. 6. 25.
728x90
반응형

네임스페이스

 

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
37
38
39
#include <iostream>
 
 
using namespace std;
 
 
int n;
void set() {
    n = 10;
}
 
namespace doodle {
    int n;
    void set() {
        n = 20;
 
    }
}
 
namespace google {
 
    int n;
    void set() {
        n = 30;
    }
}
 
 
int main() {
    ::set();//10
    doodle::set(); //n이 doodle의 n의미
    google::set(); //google의 n의미
 
 
    cout << ::n << endl
    cout << doodle::n << endl;
    cout << google::n << endl;
}
 
cs

 

3개의 네임스페이스에는 n이 각각 하나씩 있는데 이때 n의 소속을 밝혀주지 않았다.

예를 들어 doodle::n=20; 이런식으로!!

이렇게 변수나 함수의 소속을 밝히지 않았을 때는 자신이 속한 네임스페이스의 변수나 함수가 된다.

 

소속을 밝혀주지 않았지만 doodle 네임스페이스에 속해있으므로 n은 사실상 doodle::n인것이다!!

 

 

 

::n=30은 전역변수 n인 것이다.

그러니까 10이였던 n이 30이 되고

doodle::n=20

google::n은 선언해준게 없으므로 0이 출력된다. 

 

네임스페이스 중첩

 

네임스페이스 안에 네임스페이스를 하나 더 써주는 것이다.

 

 이런 경우 답은 10 30 0 인데 google 네임스페이스에서 n이 set함수보다 밑에 나왔기 때문에

n=30 은 n이 google 네임스페이스에 없으므로 밖에 있는 doodle 네임스페이스로 가서 n을 찾는다.

doodle 네임스페이스에는 n이 있고, 20으로 선언된 n이 google 네임스페이스의 set함수에 의해 30이 된다. 

 

그리고 google네임스페이스는 n을 따로 선언해주지 않아서 0이된다. 

 

 

네임스페이스와 함수 프로토타입

 

doodle 네임스페이스에서 함수를 프로토타입으로 만들어주고 밑에서 선언해볼 것이다.

 

이럴때는 굳이 네임스페이스 다시 지정해주지 않고 doodle::set() 이런식으로 함수를 선언해줘도 된다!!

 

 

클래스

 

클래스는 자료저장 + 자료처리의 기능을 한다.  변수+함수의 조합이다.

즉, 특정한 용도를 수행하기 위한 변수와 함수를 모아놓은 틀을 말한다.

객체(오브젝트): 그 특을 이용하여 찍어낸 개체(변수, 메모리 상의 공간)

 

우선 struct부터 살펴보자. 

 

여기서 volume의 크기를 0부터 100까지만 제한하기 위해  set메서드를 만들어준다.

 

하지만 이래도 프로그래머가 실수할 수 있다.  위의 사진 처럼 만약 set메서드를 안쓰고 volume을 400으로 바꿔버릴 수도 있다. 이때 사용하는게 접근제어 지시자 이다!!

안에서는 접근이 가능하면서 밖에서는 접근이 못하게끔 하는 것이다. 종류가 3가지가 있는데

private,protected,public이 있다.

 

이런식으로 변수를 private으로 만들고 getter와 setter 메서드만 public으로 설정해서

밖에서 getter,setter로만 변수에 접근할 수 있게 하는 방법을 캡슐화라고 한다. 

 

 

그래서 클래스와 구조체의 차이점은?

struct는 기본 상태가 public이다. 굳이 getter,setter없이도 변수에 접근할 수 있다.

class는 기본상태가 private이다.그래서 변수에 접근하려면 getter,setter메서드를 public으로 지정해서 접근해야한다. 

 

 

this 포인터 

객체 자신을 가리키는 포인터 

자기가 소속된 객체의 주소값을 가지고 있다. 

&a와 a의 this값이 같다는 것을 알 수 있다.

 

포인터를 매개변수로 받는거랑 this 포인터랑 똑같다. 

그럼 왜 매개변수로 받지 않을까? 그냥 보이지 않는 매개변수가 존재하는 것이다. 

함수에서 모든 애들이 다 this포인터를 보이지 않는 매개변수로 받는다. 

728x90
반응형

댓글