728x90

vsc, linux 등에서 컴파일을 하기 위해서는 gcc 설치가 반드시 선행되어야 한다. vsc에서 컴파일 하는 포스팅을 하기는 했는데 gcc 설치를 빼먹었다. 

2024.08.02 - [개발 관련 지식 및 Tool 사용방법/Visual studio code(VSC, VSCode)] - vsc에서 Cmake 개발환경 구축하기

 

vsc에서 Cmake 개발환경 구축하기

설치해야 하는 Extention 항목C/C++C/C++ Extension PackCMakeCMake ToolCMake Language SupportVSC externsions 메뉴에서 c/c++로 검색해 c/c++, c/c++ Extension pack 을 install 한다.Cmake, Cmake Tools, CMake Language Support 도 위와 마찬가

vuzwa.tistory.com

 

컴파일러를 설치하는 방법은 다양하지만 (MinGW, Cygwin 등) 이번 포스팅에서는 msys2를 사용하는 방법에 대해 알아보도록 하자.

msys2 홈페이지 접속

https://www.msys2.org/

 

MSYS2

Software Distribution and Building Platform for Windows

www.msys2.org

 

위 홈페이지를 접속해 화면을 조금 내려보면 아래와 같이 msys2-x86_64-20240727.exe 나온다. 설치파일 이름은 포스팅한 날짜 기준이다. 클릭하고 다운로드 받은 다음 실행해주면된다.(관리자 관한을 추천)

 

글을 쓰다보니 홈페이지에 내용이 전부 다 있네? ㅋㅋㅋ

순서대로 따라하면된다.

이미 설치되어 있는 컴파일러를 최신으로 업데이트 하위해서는 아래명령어를 입력하면 된다.

pacman -Suy

몇가지 물음이 나오는데 Y를 입력해주면된다. 전체데이터를 받아와 업데이트를 진행하기 떄문에 시간이 조금 걸린다.

 

 

설치가 완료되었으면 시스템 환경 변수에 컴파일러 경로를 추가해줘야 vsc에서 정상적으로 찾을 수 있다. 

 

`새로 만들기(N)`을 클릭하고 아래와 같이 경로를 입력해주면 된다. 

 

 


 여기서 발생한 의문점. MinGW64, 32와 ucrt 모두 gcc 설치가 가능한데 차이점이 뭐지 ? 궁금해서 찾아본내용을 요약 정리한다. 

  MinGW64 UCRT64
런타임 msvcrt.dll(UCRT64에 비해 오래됨) 최신의 Universal C 런타임
호환성 윈도우 7 이상 윈도우 10 이상
C/C++ 표준 지원 C++에 대해서는 차이점 없이 모두 지원,
MinGW64는 C 99, 11, 17에 대해 매우 제한적으로 지원하는 반면 ucrt는 거의 대부분 지원한다. 
사용목적 윈도우 10이전의 빌드 환경 윈도우 10 이상의 빌드환경

 

이정도로 구분할 수 있다.

결론 : ucrt64를 사용해라.

 

- 끝 -

728x90
728x90

윈도우 11에서 마우스 우클릭을 하면 아래처럼 나온다.

더 많은 옵션 표시 라고 나오거나 추가 옵션 표시라고 나온다. 이거 진짜 사람 미치게 만든다 하 내가 원하는 건 VSCode와 Git, SNV인인데..

매번 추가 옵션 표시를 눌러서 저 위 메뉴가나오게 하는 게 너무 화난다. 마우스 우클릭 하면 항상 저상태(윈도 11 이전)로 만드는 방법에 대해 알아냈다. 

cmd (명령 프롬트롬)을 관리자 권한으로 실행하고 아래 명령을 입력하고 엔터

reg.exe add “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32” /f /ve

 

이상태에서 explorer 프로세서를 종료하고 재실행해야 적용된다.  아래명령을 입력하면 바탕화면이 검은색으로 변할 것이다. 

taskkill /f /im explorer.exe

 

이 상태에서 다시 explorer을 입력하면 된다.

다시 되돌아 왔다. 이제 마우스를 우클릭하면 아래와 같이 나타난다. 후 

 

우클릭 메뉴를 다시 윈도우 11 버전의 상태로 되돌리려면 아래 명령어를 입력하고 프로세서를 종료하고 재실행하는 과정을 해주면 된다. 

reg.exe delete “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}” /f

 

- 끝 -

728x90
728x90

윈도우에서 리눅스 환경과 유사하게 패키지를 설치할 수 있는 패키지 매니저가 있다. 바로  Chocolatey

 

https://community.chocolatey.org/

 

Community

Chocolatey is software management automation for Windows that wraps installers, executables, zips, and scripts into compiled packages. Chocolatey integrates w/SCCM, Puppet, Chef, etc. Chocolatey is trusted by businesses to manage software deployments.

community.chocolatey.org

 

위 링크로 접속해 설치하면된다. 링크에 접속하면 나타나는 회면에서 Install Chocolatey 클릭

스크롤을 아래로 조금 내리다보면 Install Chocolatey for Individual Use: 라는 문구가 보이고 아래에 커맨드를 복사하는 버튼이 보인다. 커맨드를 복사한 다음 윈도우 Power shell을 관리자 권한으로 실행한다. 

 

아래와 같은 창이 나타나면 복사한 커맨드를 붙여넣기한다.

 

 

이상태에서 엔터를 누르면 설치가 진행된다.

 

설치가 완료된 다음 choco 라고 입력해서 아래와 같이 나오면 정상적으로 설치된 상태다. 이제 ninja를 설치해보자.

 

choco install ninja 를 입력해보자.

여기서 y 입력후 엔터

 

이어서 설치가 진행되고 설지가 완료된 후 ninja --version을 입력해보면 설치된 ninja 버전을 확인 할 수 있다. 

설치한 경로도 친절하게 알려준다. 

 

- 끝 -

728x90
728x90

오버로딩(Overloading) 은 같은 이름의 함수를 여러개 정의할 수 있는 기능이다. 이는 함수의 이름은 같지만 매개변수의 타입이나 개수에 따라 다르게 정의될 수 있음을 의미한다. 함수 오버로딩을 사용하면 가독성을 높이고 함수의 이름을 직관적으로 사용할 수 있다.

기본 개념

  • 함수 오버로딩은 함수의 이름을 동일하게 유지하면서도 서로 다른 매개변수 목록을 갖는 여러 버전의 함수를 정의할 수 있다. C++컴파일러는 함수 호출 시 제공된 인수에 기반하여 적절한 오버로딩 된 함수를 선택해 컴파일 한다.

함수 오버로딩의 예

#include <iostream>

// 매개변수가 없는 함수
void print() {
    std::cout << "No arguments" << std::endl;
}

// 정수형 매개변수를 가진 함수
void print(int i) {
    std::cout << "Integer: " << i << std::endl;
}

// 실수형 매개변수를 가진 함수
void print(double d) {
    std::cout << "Double: " << d << std::endl;
}

// 두 개의 매개변수를 가진 함수
void print(int i, double d) {
    std::cout << "Integer: " << i << " and Double: " << d << std::endl;
}

int main() {
    print();          // No arguments
    print(10);        // Integer: 10
    print(3.14);      // Double: 3.14
    print(10, 3.14);  // Integer: 10 and Double: 3.14

    return 0;
}

print라는 이름의 함수가 네 가지 버전으로 정의되어 있다. 각각의 함수는 다른 매개변수 목록을 가지고 있고 이로 인해 print()를 호출할 때마다 전달되는 인수에 따라 적절한 함수가 호출된다.

오버로딩 규칙

  1. 매개변수의 개수
    • 함수가 매개변수의 개수에 따라 오버로딩될 수 있다.
      void func(int a); // 1개의 매개변수 
      void func(int a, int b); // 2개의 매개변수
  2. 매개변수의 타입
    • 함수가 매개변수의 타입에 따라 오버로딩될 수 있다.
      void func(int a); // int 타입 매개변수 
      void func(double a); // double 타입 매개변수
  3. 매개변수의 순서
    • 매개변수의 순서가 다르면 오버로딩할 수 있다.
      void func(int a, double b); // int, double 순서
      void func(double a, int b); // double, int 순서

주의사항

  1. 리턴 타입만으로는 오버로딩을 구분할 수 없다.
    • 같은 매개변수 목록을 가진 두 함수가 서로 다른 리턴 타입을 가질 경우 컴파일 오류가 발생한다.
  2. 디폴트 인수(Defulat Arguments)
    • 디폴트 인수가 있는 함수는 오버로딩과 혼동될 수 있으므로, 매개변수의 개수나 타입이 다르더라도 주의 해야한다.
728x90
728x90

C++에서 함수 오버라이딩(Function Overriding)은 상속(Inheritance)에서 발생하는 개념으로, 부모 클래스(Base Class)에서 정의된 함수를 자식 클래스(Derived Class)에서 재정의하는 것을 의미합니다. 이로 인해 자식 클래스에서 부모 클래스의 함수를 재사용하거나 확장할 수 있습니다. 함수 오버라이딩은 다형성(Polymorphism)의 핵심 요소 중 하나로, 런타임 시점에 적절한 함수가 호출되도록 합니다.

함수 오버라이딩의 조건

  1. 함수 시그니처(Function Signature): 오버라이딩하는 함수는 부모 클래스의 함수와 동일한 함수 이름, 매개변수 리스트, 반환 타입을 가져야 합니다.
  2. 접근 제어자(Access Specifier): 부모 클래스의 함수가 public이나 protected로 선언되어 있어야 자식 클래스에서 오버라이딩할 수 있습니다.
  3. virtual 키워드: 부모 클래스의 함수는 virtual 키워드로 선언되어야 합니다. 이 키워드는 해당 함수가 자식 클래스에서 오버라이딩될 수 있음을 나타냅니다.
  4. 부모클래스와 동일한 이름의 함수를 자식 클랙스에서 정의한다고해서 무조건 함수 오버리이딩이 되는것은 아니다. 매개변수의 자료형 및 개수가 다르면 이는 함수 오버로딩되어 전달되는 인자에 따라서 호출되는 함수가 결정된다. 즉, 함수 오버로딩은 상속관계에서도 구성이 될 수 있다.

예제 코드

#include <iostream>
using namespace std;

class Base {
public:
    virtual void show() {  // 부모 클래스의 함수는 virtual로 선언
        cout << "Base class show() function" << endl;
    }
};

class Derived : public Base {
public:
    void show() override {  // 자식 클래스에서 오버라이딩
        cout << "Derived class show() function" << endl;
        Base::show(); // 오버라이드된 부모클래스의 함수를 호출하는 경우 
    }
};

int main() {
    Base *b;
    Derived d;
    b = &d;

    // 포인터를 통해 자식 클래스의 show()가 호출됨
    b->show();  // 출력: Derived class show() function

    return 0;
}

override 키워드

C++11부터는 자식 클래스의 오버라이딩 함수에 override 키워드를 명시적으로 추가할 수 있습니다. 이는 해당 함수가 부모 클래스의 함수를 정확히 오버라이딩하고 있음을 컴파일러에게 명확히 알리며, 만약 부모 클래스에 동일한 시그니처의 함수가 없다면 컴파일 오류가 발생하게 됩니다.
const 키워드와 함께 사용해야 하는 경우는 const를 먼저 작성하고 override를 작성해야 한다.

함수 오버로딩과의 차이점

  • 함수 오버로딩(Function Overloading)은 같은 클래스 내에서 같은 이름의 함수를 매개변수의 타입이나 개수에 따라 여러 번 정의하는 것.
  • 함수 오버라이딩(Function Overriding)은 상속 관계에서 자식 클래스가 부모 클래스의 함수를 재정의하는 것.

요약

함수 오버라이딩은 부모 클래스에서 정의된 함수를 자식 클래스에서 동일한 시그니처로 재정의하는 기능으로, 다형성을 구현하는 중요한 요소입니다. 이 기능을 통해 자식 클래스는 부모 클래스의 함수 동작을 대체하거나 확장할 수 있습니다.

728x90

+ Recent posts