fullstack

[C++] this 포인터

Language/C++

this 포인터는 자기참조 포인터이다. 즉, 자기 자신을 가리키는 용도로 사용된다.

만약 0x00번지에 할당된 객체의 멤버함수 내에서 this를 사용한다면, 0x00번지를 의미하는 포인터가 된다.


다음은 this를 포인터를 활용한 예이다.


1
2
3
4
5
6
7
8
9
class AAA
{
    int val;
public:
    AAA(int val)
    {
        this->val = val;
    }
};



위는 객체의 멤버변수와 생성자의 매개변수가 같은 이름을 사용하고 있다. 원래대로라면 어떤 변수이건간에 지역변수보다 우선시 될 수 없으므로 멤버변수에 접근할 수 없다.

하지만 this로 객체의 주소값을 가르켜 멤버변수에 접근하였다.

물론 매개변수와 멤버변수의 이름을 다르게 하면 쉽게 해결되지만 생각해야할 변수의 이름이 하나 줄어든 것 만으로도 큰 의미라고 할 수 있다.


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

[C++] 복사 생성자  (0) 2015.12.02
[C++] friend 선언  (0) 2015.12.02
[C++] 생성자(Constructor)와 소멸자(Destructor)  (0) 2015.11.30
[C++] 캡슐화 (EnCapsulation)  (0) 2015.11.30
[C++] 정보은닉 (Information Hiding)  (0) 2015.11.30

[C++] 생성자(Constructor)와 소멸자(Destructor)

Language/C++

- 생성자 (Constructor)


생성자는 객체를 생성과 동시에 초기화 할 수 있는 메커니즘이다.

모든 객체는 생성이 되면 메모리를 할당받고 생성자를 호출하게 된다.

생성자는 함수이고 ,클래스의 이름과 같은 이름을 지니며, 리턴이 없다.



1
2
3
4
5
6
class AAA
{
    int num;
public:
    AAA()    { num = 10; }
};



위와 같이 생성자를 이용하여 객체의 멤버변수를 초기화 할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
class AAA
{
    int num;
public:
    AAA(int n) { num = n; }
};
 
int main()
{
    AAA a(10);
 
    return 0;
}



또한 위와 같이 매개변수를 이용하여 초기화 할 수 있으며 오버로딩도 가능하다.




- 소멸자 (Destructor)


경우에 따라 객체가 소멸되기 전에 처리해야 할 작업이 있을 수 있다. (예를 들어 객체안에서 동적할당을 사용한 경우 메모리 해제)

소멸자는 그러한 일들을 처리하기 위한 메커니즘이다.

모든 객체는 소멸자를 호출하고 메모리 반환후 소멸하게 된다.

소멸자는 함수이고, 클래스의 이름 앞에 ~가 붙은 형태의 이름을 가지며, 리턴이 없다. 또한 생성자와 다르게 매개변수를 받을 수 없다.


1
2
3
4
5
6
7
class AAA
{
    int *arr;
public:
    AAA(int size) { arr = new int[size]; }
    ~AAA() { delete []arr; }
};



위와 같이 소멸자를 이용하여 동적할당받은 메모리를 해제해 줄 수 있다.




- 디폴트 생성자 , 디폴트 소멸자


생성자와 소멸자는 따로 정의하지 않으면 디폴트 생성자와 디폴트 소멸자가 자동으로 삽입되며, 둘은 아무런 일도 하지 않는다.

자동으로 삽입된 디폴트 생성자와 디폴트 소멸자는 아래와 같다.


1
2
3
4
5
6
7
class AAA
{
    int num;
public:
    AAA() {}
    ~AAA() {}
};



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

[C++] friend 선언  (0) 2015.12.02
[C++] this 포인터  (0) 2015.12.02
[C++] 캡슐화 (EnCapsulation)  (0) 2015.11.30
[C++] 정보은닉 (Information Hiding)  (0) 2015.11.30
[C++] 동적할당. new와 delete  (0) 2015.11.30

[C++] 캡슐화 (EnCapsulation)

Language/C++

C++ 객체지향에서 클래스는 캡슐화 하여야 한다.

캡슐화는 관련 있는 데이터와 함수를 하나의 단위로 묶는 것을 말한다.


다음은 캡슐화가 되어 있지 않은 경우이다.


1
2
3
4
5
6
7
8
9
10
11
12
class Point
{
public:
    int x;
    int y;
};
 
class DrawPoint
{
public:
    void draw(Point p) { cout << "draw " << p.x << ", " << p.y << endl; }
};



위 예제는 Point에 대한 데이터와 함수가 두 개의 클래스로 나뉘어져 있다. 

다음과 같이 관련있는 데이터와 함수를 묶어 캡슐화 해야 한다.


1
2
3
4
5
6
7
8
class Point
{
public:
    int x;
    int y;
 
    void draw() { cout << "draw " << x << ", " << y << endl; }
};



캡슐화에 대한 기본 개념은 어렵지 않다. 예제 또한 간단하여 쉽다고 생각할 수 있으나 실무에서는 어디까지를 관련있는 데이터나 함수로 볼 것인지에 대한 결정을 하기 매우 어렵기 때문에 많은 경험과 노하우를 필요로 한다.


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

[C++] this 포인터  (0) 2015.12.02
[C++] 생성자(Constructor)와 소멸자(Destructor)  (0) 2015.11.30
[C++] 정보은닉 (Information Hiding)  (0) 2015.11.30
[C++] 동적할당. new와 delete  (0) 2015.11.30
[C++] Reference  (0) 2015.11.29

[C++] 정보은닉 (Information Hiding)

Language/C++

C++ 객체지향에서 클래스는 정보은닉이라는 특성을 가져야 한다.

우선 정보은닉이 되지 않은 클래스를 보겠다.


1
2
3
4
5
class AAA
{
public:
    int num; // 0~100
};



위 클래스는 num 이라는 멤버변수를 가지고 있다. 하지만 외부에서 객체를 만들어 이 멤버변수에 값을 넣을 때 직접 접근 하므로 원치 않는 값이 들어올 수 있고 에러도 나지 않는다. 실제로 이런 경우가 발생하면 오류를 찾는데에 매우 많은 시간을 소요하게 된다.


다음은 정보은닉이 적용된 클래스이다.


1
2
3
4
5
6
7
class AAA
{
    int num; // 0~100
public:
    void setNum(int n) { num = n; }
    int getNum() { return num; }
};



멤버변수에 직접 접근하는 것을 막고 setNum과 getNum 함수를 통해서 멤버변수를 조작하도록 하였다.

여전히 원치않는 값이 들어갈 수 있고 별로 달라진게 없다고 생각할 수 있지만 다음과 같이 오류검출을 추가할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class AAA
{
    int num; // 0~100
public:
    void setNum(int n);
    int getNum() { return num; }
}
void AAA::setNum(int n)
{
    if(n<|| n>100)
    {
        cout << "error" << endl;
        return;
    }
    num = n;
};



위와같이 작성하면 멤버변수에 영향을 주지 않고 사전에 오류검출을 할 수 있는 것을 볼 수 있다.


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

[C++] 생성자(Constructor)와 소멸자(Destructor)  (0) 2015.11.30
[C++] 캡슐화 (EnCapsulation)  (0) 2015.11.30
[C++] 동적할당. new와 delete  (0) 2015.11.30
[C++] Reference  (0) 2015.11.29
[C++] namespace  (0) 2015.11.28

가상 하드 디스크(VHD) 만들기

Tip

- 가상 하드 디스크란?


윈도우 7부터 가상 하드 디스크(Virtual Hard Disk)라는 것을 만들 수 있다.

가상 하드 디스크는 말그대로 실제로 존재하지 않지만 실제로 존재하는 것처럼 사용할 수 있는 하드 디스크를 말한다.




- 가상 하드 디스크 만드는 방법


1. 윈도우 - 프로그램 및 파일 검색에서 컴퓨터 관리를 찾아 실행한다.




2. 컴퓨터 관리에서 저장소 - 디스크 관리를 선택 한다.




3. 동작 - VHD 만들기를 실행 후 가상 하드 디스크를 만들 위치와 이름, 용량을 지정해 준 뒤 확인 버튼을 클릭한다.




4. 가상 디스크가 만들어 질 때까지 기다린다.




5. 가상 디스크가 다 만들어 졌다면 새로 만들어진 가상 디스크를 우클릭하여 디스초기화를 선택하여 원하는 형식을 선택 후 확인 버튼을 누른다.





6. 이번에는 할당되지 않음 위에서 우클릭하여 새 단순 볼륨을 선택한다.




7. 설정하고 싶은 것이 있으면 바꾸고 별다른 게 없으면 다음버튼을 계속 누르고 마침해주면 된다.





그럼이제 새로운 가상 하드 디스크가 만들어졌다. 



USB나 외장하드를 연결했을 때처럼 자동실행이 뜨는 것을 볼 수 있고 내컴퓨터에 들어가보면 새로운 디스크를 쓸 수 있는 것을 볼 수 있다.





- 가상 하드 디스크 사용법


여기서부터가 이 가상 하드 디스크의 중요한 점이다.

이제 이 가상 하드 디스크는 드라이브와 달리 외장하드처럼 내가 원할때 연결해서 쓰고 쓰지 않을때는 분리해서 안보이게 할 수 있다.

즉 중요자료를 보관하거나 비밀자료를 숨기는데 매우 용이하다.



가상 하드 디스크를 분리하고 싶다면 우클릭하여 VHD 분리를 선택해 주기만 하면된다.




다시 가상 하드 디스크를 연결하고 싶다면 동작 - VHD 연결을 선택하고 아까만든 .vhd파일을 선택해 주기만 하면 다시 연결된다.



이처럼 분리해 놓았다가 원하는 때에 연결해 사용하면 된다.


'Tip' 카테고리의 다른 글

안보이는 폴더 만들기  (0) 2015.12.19

[C++] 동적할당. new와 delete

Language/C++

C++에서 메모리를 동적할당 및 소멸하기위해서는 C언어의 malloc과 free 대신 new 와 delete를 사용하게 된다.

간단하게 사용법만 정리해 보았다.


- 1차원 배열 동적할당


1
2
3
4
5
// 할당
int *arr = new int[size];
 
// 해제
delete[] arr;



- 2차원 배열 동적할당


1
2
3
4
5
6
7
// 할당
int **arr = new int*[size_1];
for(int i=0; i<size_1; i++) arr[i] = new int[size_2];
 
// 해제
for(int i=0; i<size_1; i++delete[] arr[i];
delete[] arr;



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

[C++] 캡슐화 (EnCapsulation)  (0) 2015.11.30
[C++] 정보은닉 (Information Hiding)  (0) 2015.11.30
[C++] Reference  (0) 2015.11.29
[C++] namespace  (0) 2015.11.28
[C++] 인라인 함수 (Inline Function)  (0) 2015.11.28

[C++] Reference

Language/C++

Reference는 변수에 별명을 붙여주는 것으로 즉, 하나의 변수를 두가지 이상의 이름으로 조작할 수 있도록 만드는 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    int val = 10;
    int &ref = val;
 
    val++;
    cout << "val: " << val << endl;
    cout << "ref: " << ref << endl;
 
    ref++;
    cout << "val: " << val << endl;
    cout << "ref: " << ref << endl;
 
    return 0;
}



위와 같이 &연산자를 통해 정의할 수 있으면 위와같이 선언하면 val메모리 공간에 ref라는 이름을 하나 더 부여하게 된다.

그럼 이제 val과 ref 두가지이름으로 값을 조작할 수 있다.


주의할 점은 Reference는 선언과 동시에 초기화 되어야 하며, 상수로 초기화할 수 없다.


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

[C++] 정보은닉 (Information Hiding)  (0) 2015.11.30
[C++] 동적할당. new와 delete  (0) 2015.11.30
[C++] namespace  (0) 2015.11.28
[C++] 인라인 함수 (Inline Function)  (0) 2015.11.28
[C++] 디폴트 매개 변수 (Default Parameter)  (0) 2015.11.28

[C++] namespace

Language/C++

- namespace란?


namespace란 이름을 지니는 공간이라는 뜻으로 특정 영역에 이름을 붙여주기 위한 기법이다.

프로젝트가 대형화 되면서 여러 모듈의 함수이름이 겹쳐 충돌현상이 발생할 수 있는데, namespace를 이용하여 이러한 문제를 해결할 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
namespace A
{
    void func()
    {
        std::cout << "Space A" << std::endl;
    }
}
 
namespace B
{
    void func()
    {
        std::cout << "Space B" << std::endl;
    }
}
 
int main()
{
    A::func();
    B::func();
    return 0;
}



위와 같이 func라는 같은 함수명을 A와 B영역으로 나누어서 사용할 수 있다.

- 범위 지정 연산자 (scope resolution operator)

위 예제에서 namespace에 접근하기 위해서 :: 연산자를 사용하는데, 이를 범위 지정 연산자라고 한다.
즉 A::func() 는 A라는 이름공간안에 있는 func를 참조하겠다는 의미로 사용된다.

- using

C++ 입출력 방식에서 cin, cout, endl도 std라는 공간안에 정의되어 있으므로 참조할 때마다 std:: 를 앞에다 붙여주어야 한다.
이는 using 키워드를 이용하여 선언해두면 std:: 를 매번 앞에 붙이지 않아도 된다.

1
2
3
using std::cin;
using std::cout;
using std::endl;



위와 같이 선언해 두면 cin, cout, endl을 참조할때 자동으로 std 공간안에서 찾게된다.


1
using namespace std;



위 방법은 std 공간안에 있는 모든 이름을 범위 지정 연산자없이 참조할 수 있는 선언으로 더욱 짧고 편리하지만, std 공간안의 모든 선언을 참조하게 되므로 이름충돌이 일어날 확률은 높아지게 된다.


[C++] 인라인 함수 (Inline Function)

Language/C++

인라인 함수란 프로그램 라인 안으로 들어가버린 함수라는 뜻으로 기존 C 에서는 아래와 같이 매크로 함수를 사용하여 구현하였다.


1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
 
#define SQUARE(x) ((x)*(x))
 
int main()
{
    cout << SQUARE(5<< endl;
}



위의 코드는 전처리 과정에서 SQUARE(5) 부분이 ((5)*(5))로 치환된다.

하지만 이는 긴 함수에 대한 구현이 어려웠는데, C++ 에서는 함수 앞부분에 inline 키워드만 붙여 아래와같이 인라인화 할 수 있다.


1
2
3
4
inline int square(int x)
{
    return x*x;
}



위와 사용하면 긴 함수도 inline 키워드를 붙여 쉽게 인라인화 할 수 있지만 긴 함수를 인라인화 하면 프로그램의 크기도 커지므로 짧은 함수만 인라인화 하는 것이 좋다.


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

[C++] Reference  (0) 2015.11.29
[C++] namespace  (0) 2015.11.28
[C++] 디폴트 매개 변수 (Default Parameter)  (0) 2015.11.28
[C++] 함수 오버로딩 (Function Overloading)  (0) 2015.11.28
[C++] for문 두줄로 구구단 출력하기  (0) 2015.11.09

[C++] 디폴트 매개 변수 (Default Parameter)

Language/C++

디폴트 매개 변수란 함수의 인자에 기본값을 주어 해당 매개 변수가 전달되지 않더라도 기본값으로 사용할 수 있는 것을 말한다.


1
int func(int a=0) { return a; }



위와 같이 정의할 수 있으며 위 함수는 매개변수를 받지 못하면 0을 return하게 된다.

아래는 디폴트 매개 변수를 사용한 예제이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int func(int a=0int b=0int c=0)
{
    return a+b+c;
}
int main()
{
    cout << func() << endl;
    cout << func(1<< endl;
    cout << func(1,1<< endl;
    cout << func(1,1,1<< endl;
}





단 함수 오버로딩과 동시에 잘못 정의하면 문제가 생길수 있으니 주의해야 한다.


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

[C++] Reference  (0) 2015.11.29
[C++] namespace  (0) 2015.11.28
[C++] 인라인 함수 (Inline Function)  (0) 2015.11.28
[C++] 함수 오버로딩 (Function Overloading)  (0) 2015.11.28
[C++] for문 두줄로 구구단 출력하기  (0) 2015.11.09