fullstack

[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

[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

[C++] 함수 오버로딩 (Function Overloading)

Language/C++

기존 C 컴파일러에서는 함수의 이름으로만 함수를 찾기 때문에 동일한 이름의 함수 정의는 불가능 했다.

하지만 C++ 컴파일러에서는 [함수의 이름 + 매개 변수의 정보]로 호출하고자 하는 함수를 찾기 때문에 함수의 이름이 같아도 매개변수의 타입이나 개수가 다르다면 함수명 중복을 허용한다.

이를 함수 오버로딩(Function Overloading) 이라 한다.

즉 함수 오버로딩이란 같은 이름의 함수를 매개변수의 타입이나 개수를 다르게 하여 여러개 정의하는 것이다.


다음은 함수 오버로딩의 예이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
void func()
{
    cout << " function(void) " << endl;
}
 
void func(int a, int b)
{
    cout << " function(int a, int b) " << endl;
}
 
void func(char c)
{
    cout << " function(char c) " << endl;
}



위와 같이 같은 이름의 함수를 여러개 정의 할 수 있다.

주의할것은 함수의 이름과 매개 변수의 정보가 같고 리턴타입만 다른 함수는 오버로딩되지 않는다.


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

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

[C++] for문 두줄로 구구단 출력하기

Language/C++
그냥 심심해서 해본 for문 단 두줄로 구구단 출력하기

for문의 고정관념을 깨면 재밌는 코드가 많이 나온다.


1
2
3
4
5
6
#include <iostream>
void main()
{
    for(int i=1++i<10std::cout<<std::endl)
        for(int j=1; j<10std::cout<<i<<"*"<<j-1<<"="<<i*(j++)<<" ");
}



출력결과



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

[C++] Reference  (0) 2015.11.29
[C++] namespace  (0) 2015.11.28
[C++] 인라인 함수 (Inline Function)  (0) 2015.11.28
[C++] 디폴트 매개 변수 (Default Parameter)  (0) 2015.11.28
[C++] 함수 오버로딩 (Function Overloading)  (0) 2015.11.28