fullstack

[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++] 이진 검색 구현

자료구조

이진 검색 알고리즘은 정렬된 리스트에서 특정한 값의 위치를 찾기위해 찾을 값과 현재 유효한 값의 범위의 중간값을 비교해 범위를 좁히는 식으로 검색하여 빠르게 목표값을 찾을 수 있는 장점이 있다.


1
2
3
4
5
6
7
8
9
10
11
12
int binarySearch(int arr[], int size, int find)
{
    int low=0, high=size-1, mid;
    while(low<=high)
    {
        mid = (low+high)/2;
        if(arr[mid] > find) high = mid - 1;
        else if(arr[mid] < find) low = mid + 1;
        else return mid;
    }
    return -1;
}



#4 low가 high보다 커진다면 찾으려는 데이터가 없다는 것이다.

#11 목표값이 없을 경우에는 -1을 리턴해 준다.

'자료구조' 카테고리의 다른 글

[C++] Bubble Sort 구현  (0) 2015.11.12
[C++] 간단한 Queue 만들기  (0) 2015.11.12
[C++] 간단한 Stack 만들기  (0) 2015.11.11

[C++] 10진수 2진수 변환, 2진수 10진수 변환

알고리즘

10진수를 2진수로 변환하는 함수와 2진수를 10진수로 변환하는 함수를 만들어 보았다.

2진수를 문자열로 만들지 않고 int형으로 하였다.




10진수 -> 2진수 변환

1
2
3
4
5
6
7
8
9
10
11
int tenConvertTwo(int num)
{
    int result = 0;
    for(int i=1; num>0; i*=10)
    {
        int binary = num % 2;
        result += binary*i;
        num /= 2;
    }
    return result;
}



2진수 -> 10진수 변환

1
2
3
4
5
6
7
8
9
10
11
12
int twoConvertTen(int num)
{
    int result = 0, mul = 1;
    while(num>0)
    {
        if(num%2)
            result += mul;
        mul *= 2;
        num /= 10;
    }
    return result;
}



가독성은 조금 떨어지지만 최대한 간단하게 구현하였다.

'알고리즘' 카테고리의 다른 글

[Java] D-Day 계산  (0) 2015.11.09

[C++] Bubble Sort 구현

자료구조

정렬기법중 버블소트는 시간복잡도가 n제곱으로 상당히 비효율적이지만 코드가 단순해서 가장 많이 사용된다.


len만큼의 길이를 가진 배열 arr을 오름차순으로 정렬하고 싶다면 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void bubbleSort(int arr[], int len)
{
    for(int i=0; i<len; i++)
    {
        for(int j=0; j<len-1-i; j++)
        {
            if(arr[j] > arr[j+1])
            {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1= temp;
            }
        }
    }
}



'자료구조' 카테고리의 다른 글

[C++] 이진 검색 구현  (0) 2015.11.16
[C++] 간단한 Queue 만들기  (0) 2015.11.12
[C++] 간단한 Stack 만들기  (0) 2015.11.11