Category Archives: C++

C++ 의 vector

 

std::vector는 C++ 표준 템플릿 라이브러리(STL)의 일부로서, 동적 배열과 유사한 구조를 가진 컨테이너입니다.

std::vector의 주요 특징:

  1. 동적 크기: 백터는 크기가 동적으로 변경될 수 있습니다. 즉, 런타임에 항목을 추가하거나 제거할 수 있습니다.
  2. 연속 메모리: 백터는 내부적으로 연속된 메모리 공간에 데이터를 저장합니다. 따라서 배열처럼 인덱스를 사용하여 빠르게 접근할 수 있습니다.
  3. 자동 메모리 관리: 백터는 내부적으로 메모리를 자동으로 할당하고 해제합니다.

std::vector의 사용 예:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers;

    // 값을 추가합니다.
    numbers.push_back(1);
    numbers.push_back(2);
    numbers.push_back(3);

    // 인덱스를 사용하여 값에 접근합니다.
    std::cout << numbers[1] << std::endl;  // 출력: 2

    // 크기와 용량을 조회합니다.
    std::cout << "Size: " << numbers.size() << std::endl;  // 출력: 3
    std::cout << "Capacity: " << numbers.capacity() << std::endl;

    // 반복자를 사용하여 백터의 요소를 반복합니다.
    for(int num : numbers) {
        std::cout << num << " ";
    } // 출력: 1 2 3

    return 0;
}

이 외에도 std::vector는 여러 메서드와 기능을 제공합니다. 예를 들면 inserteraseresizereserve 등이 있습니다. C++의 std::vector를 효과적으로 사용하려면 해당 메서드와 기능들을 숙지하는 것이 중요합니다.

C++ 의 참조 개념

C++에서의 참조는 변수나 객체의 별칭을 제공하는 방법입니다. 참조를 사용하면 변수나 객체에 대한 간접적인 접근을 할 수 있습니다. 여기서 주요 포인트와 예제를 통해 C++의 참조 개념을 설명하겠습니다.

  1. 참조의 선언:
    참조는 & 기호를 사용하여 선언됩니다. 예를 들어, int 타입의 변수에 대한 참조는 다음과 같이 선언할 수 있습니다.

    int num = 10;
    int &ref = num;
    
  2. 참조의 특징:

    • 참조는 선언과 동시에 초기화되어야 합니다.
    • 한번 초기화된 참조는 다른 변수나 객체를 참조하도록 변경할 수 없습니다.
    • 참조는 NULL 값을 가질 수 없습니다.
  3. 참조와 포인터의 차이:

    • 포인터는 메모리 주소를 저장하는 반면, 참조는 별칭으로 작동하며 메모리 주소를 직접 저장하지 않습니다.
    • 포인터는 *& 연산자를 사용하여 역참조하고 주소를 얻는 반면, 참조는 추가적인 연산자 없이도 원래의 변수나 객체에 접근할 수 있습니다.
  4. 참조의 활용:

    • 함수의 인자로 사용될 때, 값을 복사하는 것이 아닌 원래의 변수나 객체에 대한 접근을 제공하므로 효율적입니다.
    • 함수에서 여러 값을 반환할 필요가 있을 때 사용됩니다.
  5. 예제:

    void swap(int &x, int &y) {
        int temp = x;
        x = y;
        y = temp;
    }
    
    int main() {
        int a = 5, b = 10;
        swap(a, b);
        cout << "a: " << a << ", b: " << b;  // a: 10, b: 5
        return 0;
    }
    

    위의 예제에서 swap 함수는 참조를 인자로 받아 원래의 변수의 값을 직접 변경합니다.

이러한 참조의 개념은 C++에서 매우 중요하며, 효율적인 프로그래밍을 위해 잘 알아두어야 합니다.

C/C++ 포인터 기본 개념

 


포인터는 C와 C++ 언어의 핵심 개념 중 하나입니다. 이를 이해하는 것은 두 언어를 효과적으로 사용하기 위해 필수적입니다.

포인터란?

포인터는 메모리 주소를 저장하는 변수입니다. 다시 말해, 포인터는 어떤 데이터의 위치(메모리 주소)를 가리키는 변수입니다.

기본 사용법:

  1. 선언:

    c
    int *p; // 정수형 포인터 char *ch; // 문자형 포인터

  2. 주소 연산자 &: 변수의 메모리 주소를 가져오는 데 사용됩니다.

    c
    int x = 10; p = &x; // p는 x의 주소를 가리킵니다.

  3. 역참조 연산자 (*): 포인터가 가리키는 주소의 값을 가져옵니다.

    c
    int value = *p; // value는 10이 됩니다. p가 x의 주소를 가리키기 때문입니다.

포인터의 이점:

  1. 동적 메모리 할당: malloc(), calloc(), new 등의 함수나 연산자를 사용하여 실행 시간에 메모리를 할당할 수 있습니다.

  2. 배열과 문자열: 포인터를 사용하여 배열의 요소에 접근하거나 문자열을 관리할 수 있습니다.

  3. 함수와 구조체로의 참조 전달: 값 전달 대신 참조 전달을 사용하여 효율적으로 데이터를 전달하거나 변경할 수 있습니다.

  4. 데이터 구조: 링크드 리스트, 트리, 그래프와 같은 고급 데이터 구조를 구현할 때 필수적입니다.

주의사항:

  1. 와일드 포인터 (Dangling Pointer): 초기화되지 않은 포인터는 예측할 수 없는 메모리 주소를 가리키게 됩니다. 이러한 포인터를 역참조하면 프로그램에 오류가 발생할 수 있습니다.

  2. 메모리 누수: 동적으로 할당된 메모리를 적절히 해제하지 않으면 메모리 누수가 발생할 수 있습니다. C에서는 free(), C++에서는 delete를 사용하여 메모리를 해제해야 합니다.

  3. 포인터 연산: 포인터에 정수를 더하거나 빼면 해당 타입의 크기만큼 주소가 변경됩니다. 이를 활용하여 배열의 요소에 접근할 수 있지만, 주의하지 않으면 포인터가 유효한 메모리 범위를 벗어날 수 있습니다.

C++에서의 참고사항:

C++에서는 포인터 외에도 참조(reference)라는 개념이 추가로 있습니다. 참조는 원래의 변수를 ‘가리키는’ 다른 이름이라고 생각할 수 있으며, 포인터보다 사용하기 쉽고 안전합니다.

결론:

포인터는 강력하면서도 복잡한 개념입니다. 올바르게 사용하면 프로그램의 효율성과 유연성을 크게 향상시킬 수 있지만, 주의하지 않으면 오류의 원인이 될 수 있습니다. 따라서 포인터를 사용할 때는 항상 주의를 기울여야 합니다.

WPF 에서 초간단 런타임 다중 언어 지원

  제가 다니는 직장에서 최근에 시작한 프로젝트는 WPF (윈도즈 앱의 GUI 를 만드는 기술중 하나) 기반입니다. 제 매니저는 50대중반으로 당연히 WinForm 에 익숙하고, 올해 딱 50인 저의 직속 시니어는 WPF에 익숙하고, 전 그냥 다 해봐서 새 프로젝트이니 UWP (저도 이건 그냥 Hello World 찍는 수준입니다만, 다른 OS 에서도 쉽게 잘 되는 이유로…) 로 합시다! 했다가 윈도7 지원 문제로 까이고, 결국 WPF 로 시작되었습니다. 대충 골격은 저희 회사의 주력인 Windows CE 기반의 통신기기 (PBX에 가깝죠) 를 PC 윈도즈에서 모니터링하는 거고, 제가 담당한 부분은 오로지 GUI입니다. ㅋㅋㅋ 캐나다 제품들의 특징 중에 하나가 공용언어인 불어가 들어가는 경우가 많고, 미국 시장에도 진출한 제품들은 멕시코 이민자들이 너무 많은 관계로 스페인어를 지원합니다. 그러니 당연히 제가 담당한 부분도 그게 되야 하는거죠. 헐~

  저도 WPF 로 Localization 은 처음 해보는거라, 구글님과 스텍오버플로님에게 열심히 매달리고 있는데… 기본적으로 WPF 의 컴파일 타임 다중 언어 지원은 M$ 의 문서가 잘되어 있습니다만, 런타임간에 언어 전환은 네트에서 수많은 해결책들을 찾아 볼 수 있습니다.

  1. WPF Localization – On-the-fly Language Selection
  2. WPF Localization Using RESX Files
  3. WPF Runtime Localization
  4. WPF Localization Extension
  5. Localizing WPF Applications using Locbaml
  6. Simple WPF Localization
대충 이 정도가 있는데요. 더 찾아보면 더 있을 것 같습니다. 저 리스트 중에 제일 단순한 방법은 마지막 6번에 있는 방법이에요. Resource.resx 를 여러 언어 버전을 만들어주고 – 예를 들면, 불어는 Resource.fr.resx – 런타임에서 언어를 변경하면 모든 컨트럴에 언어가 바뀌게 됩니다. 이것도 디자인타임에서 변경내용을 실시간으로 보여주기 위해 몇가지 기교를 넣어서 제가 보기엔 그것도 귀찮아 보이더군요.  ㅋㅋㅋ 그래서 더 단순한 ‘Localization of a WPF app – the simple approach’ 에서의 방법으로 구현했습니다. 근데 이 문서는 구현한 방법에 대한 설명과 클래스 코드만 있고 데모 코드가 없어서 기존에 XAML-WPF 문법에 익숙하지 않으면 시작도 못해 볼 정도라 스프린트 데모때 설명을 위해 데모 코드를 만들어 봤습니다. 데모 코드는 https://github.com/hotdeveloper/TestLocWpf 에서 받으실 수 있습니다. 내용을 간단히 설명드리면,

솔루션 탐색기에서 프로퍼티를 열어보면 각 언어별 리소스가 있어요.

영어 리소스 파일 내용. 딕셔너리라고 보시면 됩니다.

불어 리소스 파일 내용

MainWindow.xmal 에 리소스 파일의 Name 필드를 적용하는 부분이죠.

버튼을 눌렀을 때, CultureInfo 클래스에 언어 코드를 넣은 오브젝트를 TranslationSource 클래스의 CurrentCulture 에 넣으면 GUI 가 그 언어로 바로 변경됩니다. Null 을 넣으면 시스템 기본 언어로 돌아오죠.
시스템 기본 언어가 적용된 상태죠.

Change 버튼을 누르면 불어가 적용됩니다.

  소스 코드가 워낙 짧아서 잠시 둘러보시면 금방 이해할 겁니다. 피드백, 문의는 댓글로 주셔요.

Now, let’s write funny codes.