no image
[UE5] UPROPERTY(), UFUNCTION()을 꼭 붙여야 할까?
언리얼로 개발을 하면서 검색을 하다가 다른 사람은 UPROPERTY()와 UFUCTION() 매크로를 사용한 것을 보았다.내 코드는 저 두가지 매크로를 사용하지 않았지만 아무런 문제는 없었다.그렇다면 저 매크로들은 왜 사용하는 것일까? 결과부터 말하자면 언리얼의 리플렉션 시스템에 속성과 함수를 노출시키기 위해서 사용한다고 한다.이 매크로는 언리얼 엔진이 C++ 코드와 에디터, 블루프린트 등 다른 시스템 간의 상호작용을 원활하게 할 수 있도록 중요한 역할을 한다. 그럼 리플렉션 시스템은 뭘까? 언리얼 엔진에서의 리플렉션 시스템개발자들이 C++ 코드와 언리얼 엔진의 다양한 시스템(에디터, 블루프린트, 직렬화, 네트워킹 등) 간의 상호작용할 수 있도록 지원하는 메커니즘이다.런타임 또는 컴파일 타임에 객체의 속..
2025.01.09
no image
[C++] 컴파일러와 인터프리터?
사실 코딩을 하다보면 절대 안들어본 사람이 없는 "컴파일"이게 대체 뭘까?? 사실 개발자에게도 컴파일러가 뭐에요?라고 물어보면 대답 못하는 사람도 있다...기초부터 탄탄하게!!! 컴파일러(Compiler)프로그래밍 언어로 작성된 소스 코드(흔히 우리가 에디터를 사용해서 쓰는 언어들)를 컴퓨터가 이해할 수 있는 기계어로 변환하는 소프트웨어 도구이다.프로그래머가 작성하는 코드는 고수준 언어 즉, High Level Language라고 불리고 기계어는 컴퓨터가 이해할 수 있는 언어 즉, Low Level Language라고 불린다.이 고수준 언어는 컴파일러라는 고마운 친구 덕분에 기계어 코드로 번역이 되는 것인데 이 과정은 컴파일(Compile)이라고 한다. 그렇다면 컴파일러는 이 고수준 언어를 저수준 언어로..
2025.01.03
C++
no image
[C++] Template, STL
2025년 1월 2일 목요일(2025년이 밝았따..!)신년인데도 집중이 잘 되지 않는데.. 왜 그럴까? 아직 이해를 잘 못해서 겁부터 먹는듯하다겁먹지마 파이팅!!! 오늘은 Template, STL에 관해 공부를 했다.Template일반화된 코드를 작성할 수 있는 문법정의할 함수 위에 template 를 추가하고, 일반화할 타입에 실제 타입 대신 T로 작성하면 끝!어떤 타입이 올지 모르지만 그 타입을 그냥 T라고 정의하겠다! 라는 의미근데 모든 매개변수 타입을 일반화할 필요는 없음배열의 크기 같은 경우는 항상 정수형이므로 그냥 int를 사용해줘도 문제 없음T Add(T arr[], int size) {}#include using namespace std;// general programming(일반화된 ..
2025.01.02
C++
no image
[C++] 유니크 포인터
2024년 12월 31일 화요일(2024년의 마지막 날...)아닛 벌써 한 것도 없는데 2025년이라니..?이번 년도는 퇴사도 하고.. 백수 생활도 하고.. 여러 경험을 해봤다..하지만 아직 실력은 늘지 않은 것 같다고!!언어는 다 거기서 거기라고 생각했지만 막상 C++ 기초부터 깊게 제대로 공부하니까 미치겠다고!!!!!  어찌되었든 오늘은 C++에서 가장 중요하고! 가장 많이 쓰이고! 그냥 숨쉬듯이 써야하는!제일 중요한 포인터를 공부해봤다. (사실 숨쉬듯이 써먹어야한다는 조언을 듣고.. 얘부터 확실하게 이해해야 다음 챕터 공부를 수월하게 진행할 수 있을 것 같아서 오늘도 약간 진도가 밀렸다..ㅎ)그럼 바로 포인터를 알아보자! 포인터사용하는 이유 : 메모리에 직접적으로 관리int a = 10;int* p..
2024.12.31
C++
no image
[C++] 생성자와 소멸자
2024년 12월 30일 월요일오늘은 월요병이 온 탓인지 학습에 쉽사지 집중을 하지 못했다.그래서 코드와 강의를 듣기보다는 지금까지 공부하면서 헷갈리고 명확하지 못한 것들을 확실히 정리하는 시간을 가졌다.오늘은 생성자와 소멸자에 대해 공부를 해봤다.생성자객체가 생성되는 시점에 자동으로 호출되는 멤버 함수클래스 이름과 동일한 멤버 함수리턴 타입 지정하지 않음(void도 마찬가지)오버로딩을 통해 다형성을 구현하면 중복된 생성자 중 하나만 호출생성자가 하나도 없다면 컴파일러에 의해 매개변수가 없는 기본 생성자가 자동 생성됨매개변수가 있는 생성자만 생성하고 매개변수가 없는 기본 생성자를 생성하지 않으면 컴파일 에러가 남 생성자가 필요한 이유인스턴스(객체)를 생성할 때 멤버 변수 값을 초기화하거나, 객체 크기에 ..
2024.12.30
C++
[C++] floating point exception (core dumped)에 대해 알아보자
이 오류는 프로그래머스 문제 나머지가 1이 되는 수 찾기를 풀다가 만나게 되었다.아래는 내가 오류를 겪었던 코드이다.어느 줄에서 오류가 났을지 같이 찾아보자...#include #include #include using namespace std;int solution(int n) { int answer = 0; for (int x = 0; x  찾았나요..?바로 n % x == 1이라는 구문인데, 지금 x는 0부터 시작되고 있는데 0은 나눗셈으로 정의되지 않는다.C++에서는 0으로 나누기를 실행할 때 런타임 오류로 이어진다고 한다. 항상 나눗셈이나 나머지 연산을 수행할 때에는 값이 0이 아닌지 확인하자..
2024.12.27
C++
no image
[C++] 프로그래머스 자릿수 더하기
문제자연수 N의 자릿수의 합을 구하는 문제이다. 풀이 방법1. N을 string 형태로 변환2. N의 길이만큼 N[i]를 정수로 변환해서 더함* 형변환이 가장 중요한 요인 문제 풀이#include #include #include using namespace std;int solution(int n){ int answer = 0; string str_n = to_string(n); for (int i = 0; i  char에서 int로 형변환 하는 과정에서 (int) 등의 여러 형변환을 사용해봤는데, N[i]의 ascii 코드로 변환이 되는 문제를 겪었다.char에서 '0'을 빼주면 int 형이 된다.원리는 ascii 코드에서는 숫자 문자들이 연속된 코드 값을 가지고 있다.'0'은 ..
2024.12.26
no image
[UE5] Unreal 인터페이스 살펴보기
Unreal 실행 화면을 가져왔다.화면의 숫자대로 보면 좋을 것 같다.- 1번 메뉴바에디터와 특정 명령이나 함수 기능에 접근할 수 있다. 파일을 저장하거나 불러오는 기능도 포함되어 있다. - 2번 메인 툴 바Unreal 엔진의 가장 일반적인 툴과 에디터 일부를 위한 단축 키를 포함하고 있다.에디터를 실행하고, 멈추고, 실행을 중지하는 기능도 메인 툴 바에 들어가 있다. - 3번 레벨 뷰포트카메라와 액터, 메쉬 등의 레벨 콘텐츠를 표시하는 곳인데 쉽게 말해 눈으로 보거나 우리가 다뤄야 할 객체들이 담겨있는 3D 공간이다. - 4번 Content Drawer 버튼프로젝트의 모든 에셋에 접근할 수 있는 버튼이다. - 5번 하단의 툴 바콘솔창과 출력 로그 창이 담겨있다. 소스 컨트롤 상태도 표시된다. - 6번 ..
2024.12.20
코딩테스트 공부 순서
(바쁘신 분들은 밑에 글 패스하고 바로 1번부터)현생에 치이기도 하고,, 여러가지 진로에 대한 고민을 많이 하느라 이제야 글을 쓰게 되었다.게임 업계 취업을 위한 퇴사를 했고 나름의 계획을 세웠다고 생각했으나... 큰 틀만 잡아놔서 시작하기 너무 막막했다..사실 그동안의 보상심리로 한달은 그냥 쭉 놀아서 개발적 사고가 모두 흐물흐물해졌다..사실 이쯤되니까 뭘 해야할지 길을 살짝 잃기도 하고,, 헤이해지기도 하고 무기력하고 난리가 났었지만! 😂주변 사람들의 약간의 쓴소리와 걱정들을 듣고 정신이 확 들었다. 내가 얼마나.. 충동적인 결정을 했고,, 무계획이고.. 한심하게 보이는지.. 후회하기엔 이미 엎질러진 물. 내가 선택한 길 내가 책임져야지..!많은 자기 성찰과 무참히 흩어진 내 생각 조각들을 맞추는 ..
2024.10.22

 

언리얼로 개발을 하면서 검색을 하다가 다른 사람은 UPROPERTY()와 UFUCTION() 매크로를 사용한 것을 보았다.

내 코드는 저 두가지 매크로를 사용하지 않았지만 아무런 문제는 없었다.

그렇다면 저 매크로들은 왜 사용하는 것일까?

 

결과부터 말하자면 언리얼의 리플렉션 시스템에 속성과 함수를 노출시키기 위해서 사용한다고 한다.

이 매크로는 언리얼 엔진이 C++ 코드와 에디터, 블루프린트 등 다른 시스템 간의 상호작용을 원활하게 할 수 있도록 중요한 역할을 한다.

 

그럼 리플렉션 시스템은 뭘까?

 

언리얼 엔진에서의 리플렉션 시스템

개발자들이 C++ 코드와 언리얼 엔진의 다양한 시스템(에디터, 블루프린트, 직렬화, 네트워킹 등) 간의 상호작용할 수 있도록 지원하는 메커니즘이다.

런타임 또는 컴파일 타임에 객체의 속성과 메서드에 대한 정보를 동적으로 접근하고 조작할 수 있게 해준다.

주로 UPROPERTY()와 UFUNCTION() 같은 매크로를 통해 구현되며, 언리얼 헤더 툴(UHT)에 의해 처리된다.

 

자세한 내용은 언리얼 공식 문서에 설명되어있으니 참고하면 좋을 것 같다.

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/reflection-system-in-unreal-engine

 

UPROPERTY()

- 클래스의 멤버 변수를 언리얼 에디터 내에 노출시킨다.

- 디자이너나 개발자가 에디터 상에서 직접 값을 수정할 수 있도록 한다.

- 블루프린트에서 해당 속성에 대해 접근거나 수정함으로써 블루프린트(시각적 스크립팅)과의 통합이 가능하다.

- 게임 데이터를 저장하거나 불러올 때, 자동으로 직렬화되어 저장한다.

- 언리얼의 가비지 컬렉션 시스템이 메모리를 효율적으로 관리할 수 있도록 도와준다
(UPROPERTY로 선언된 포인터는 자동으로 참조 카운트가 관리된다)

- 매크로 안에 다양한 메타데이터를 지정하여 속성의 동작 방식을 세부적으로 제어가능하다.
예를 들면 EditAnywhere, BlueprintReadWrite 등의 키워드를 사용해 편집 가능 여부나 블루프린트 접근성을 설정할 수 있다.

 

UFUNCTION()

- 클래스의 멤버 함수를 언리얼 에디터나 블루프린트에서 호출할 수 있게 한다.

- 블루프린트 내에서 해당 함수를 노드로 사용해 시각적으로 로직을 구성할 수 있다.

- 네트워크 동작 방식을 정의해(Server, Client, NetMulticast 등) 네트워크 함수를 호출할 수 있다.

- 특정 이벤트에 함수를 바인딩하여 이벤트가 발생했을 때, 자동으로 함수 호출이 가능하다.

- 메타데이터를 지정하여 함수의 동작 방식을 세부적으로 제어할 수 있다.

 

마지막 말

UPROPERTY()와 UFUNCTION()은 언리얼 헤더 툴이 올바르게 코드를 파싱하고 필요한 리플렉션 코드를 생성할 수 있게 도와준다.

언리얼 엔진에서 해당 매크로를 사용하면 개발자가 작성한 코드가 엔진의 다양한 기능과 원활하게 통합되어 개발 과정을 유연하고 효율적으로 가져갈 수 있을 것이다!

[C++] 컴파일러와 인터프리터?

닿메_dahme
|2025. 1. 3. 21:40

사실 코딩을 하다보면 절대 안들어본 사람이 없는 "컴파일"

이게 대체 뭘까?? 사실 개발자에게도 컴파일러가 뭐에요?라고 물어보면 대답 못하는 사람도 있다...

기초부터 탄탄하게!!!

 

컴파일러(Compiler)

프로그래밍 언어로 작성된 소스 코드(흔히 우리가 에디터를 사용해서 쓰는 언어들)를 컴퓨터가 이해할 수 있는 기계어로 변환하는 소프트웨어 도구이다.

프로그래머가 작성하는 코드는 고수준 언어 즉, High Level Language라고 불리고 기계어는 컴퓨터가 이해할 수 있는 언어 즉, Low Level Language라고 불린다.

이 고수준 언어는 컴파일러라는 고마운 친구 덕분에 기계어 코드로 번역이 되는 것인데 이 과정은 컴파일(Compile)이라고 한다.

 

그렇다면 컴파일러는 이 고수준 언어를 저수준 언어로 변역하는 일만 할까?

그건 아니다.

 

컴파일러의 역할

  • 구문 분석 (Parsing):
    • 소스 코드를 읽고, 문법적으로 올바른지 검사한다.
    • 코드의 구조를 이해하고, 이를 구문 트리(Syntax Tree)로 변환한다.
  • 의미 분석 (Semantic Analysis):
    • 변수의 타입 검사, 함수 호출의 유효성 검토 등 코드의 의미적 오류를 검사한다.
    • 코드가 논리적으로 올바르게 작성되었는지 확인한다.
  • 최적화 (Optimization):
    • 코드의 실행 효율성을 높이기 위해 불필요한 연산을 제거하거나, 더 효율적인 연산으로 대체한다.
    • 메모리 사용량을 줄이고, 실행 속도를 향상시키기 위한 다양한 최적화 기법을 적용한다.
  • 코드 생성 (Code Generation):
    • 최적화된 중간 코드를 대상 플랫폼의 기계어로 변환한다.
    • 실행 파일이나 목적 파일(Object File)을 생성한다.
  • 링크 (Linking):
    • 여러 개의 목적 파일과 라이브러리를 하나의 실행 파일로 결합한다.
    • 외부 참조를 해결하고, 최종 실행 가능한 프로그램을 만든다.
  • 에러 보고 (Error Reporting):
    • 소스 코드에 존재하는 문법적, 의미적 오류를 개발자에게 알린다.
    • 오류 메시지를 통해 문제를 수정할 수 있도록 도움을 주는 역할을 한다.

 

대표적인 컴파일러와 컴파일 언어

  1. GNU Compiler Collection (GCC)
    • 지원 언어: C, C++, Objective-C 등
    • 특징: 오픈 소스, 다양한 플랫폼 지원
  2. Clang
    • 지원 언어: C, C++, Objective-C, Swift 등
    • 특징: 빠른 컴파일 속도, 우수한 에러 메시지
  3. Microsoft Visual C++ (MSVC)
    • 지원 언어: C, C++
    • 특징: Windows 환경에 최적화, Visual Studio와 통합
  4. rustc
    • 지원 언어: Rust
    • 특징: 메모리 안전성 강조, 고성능
  5. Go Compiler (gc)
    • 지원 언어: Go
    • 특징: 빠른 컴파일 속도, 간결한 문법
  6. Swift Compiler (swiftc)
    • 지원 언어: Swift
    • 특징: 애플 플랫폼 최적화, 안전한 메모리 관리
  7. javac
    • 지원 언어: Java
    • 특징: 자바 소스를 바이트코드로 변환, JVM에서 실행

인터프리터(Interpreter)

고급 프로그래밍 언어로 작성된 소스 코드를 한 번에 하나씩 읽고 실행하는 소프트웨어 도구이다.

인터프리터는 컴파일 단계를 거칠 필요가 없다는 장점이 있지만 컴파일러를 사용한것보다 속도가 느린 편이다.

 

인터프리터의 주요 역할과 기능

  1. 소스 코드 해석 (Source Code Interpretation):
    • 소스 코드를 한 줄씩 읽어들여 즉시 실행한다.
    • 구문 분석과 의미 분석을 실시간으로 수행하여 코드를 실행 가능한 상태로 변환한다.
  2. 실행 속도:
    • 컴파일러가 전체 코드를 사전에 변환하는 과정이 없기 때문에 초기 실행 속도가 빠르다.
    • 매 실행 시마다 코드를 해석해야 하므로 장기적인 실행 속도는 컴파일된 프로그램보다 느릴 수 있다.
  3. 플랫폼 독립성:
    • 인터프리터가 설치된 다양한 플랫폼에서 동일한 소스 코드를 실행할 수 있다.
    • 플랫폼에 따라 별도의 컴파일 과정이 필요 없으므로 이식성이 높다.
  4. 디버깅 및 개발 편의성:
    • 코드의 각 부분을 실시간으로 실행하고 결과를 확인할 수 있어 디버깅이 용이하다.
    • 개발자가 코드를 수정하고 즉시 결과를 확인할 수 있어 개발 속도가 빨라진다.
  5. 동적 기능 지원:
    • 런타임에 코드를 수정하거나 생성하는 동적 기능을 쉽게 구현할 수 있다.
    • 예를 들어, 스크립트 언어에서 자주 사용되는 동적 타이핑과 같은 기능을 자연스럽게 지원다.

 

컴파일러와 인터프리터의 비교

특징 컴파일러 인터프리터
변환 방식 전체 소스 코드를 한 번에 기계어로 변환 소스 코드를 한 줄씩 해석하고 즉시 실행
실행 속도 실행 파일이 최적화되어 있어 빠름 해석 과정이 추가되어 상대적으로 느림
디버깅 컴파일 시점에 오류를 모두 발견 실행 중에 오류를 발견하며, 디버깅이 용이함
이식성 컴파일된 실행 파일은 특정 플랫폼에 종속됨 인터프리터가 있는 모든 플랫폼에서 동일한 소스 코드 실행 가능
개발 주기 컴파일 과정이 필요하여 개발 속도가 상대적으로 느림 코드 수정 후 즉시 실행 가능하여 개발 속도가 빠름
예시 언어 및 도구 C, C++, Rust (컴파일러: GCC, Clang, MSVC) Python, JavaScript, Ruby (인터프리터: CPython, Node.js, MRI)

 

대표적인 인터프리터와 인터프리터 언어

  • Python: CPython, PyPy, Jython 등 다양한 인터프리터가 존재.
  • JavaScript: 브라우저 내장 인터프리터(예: V8, SpiderMonkey) 및 Node.js.
  • Ruby: MRI (Matz's Ruby Interpreter), JRuby, Rubinius.
  • PHP: Zend Engine 등 다양한 PHP 인터프리터가 사용됨.

 

이렇게 컴파일러와 인터프리터에 대해 알아보았다.

 

마무리 말

갑자기 이렇게 가장 기초적인 컴파일러에 대해 왜 알아봤냐 하면..

오늘 기술 면접을 다녀왔는데 컴파일러의 링크에 대한 질문에 답변을 못했기 때문이다.

가장 쉽고 기초적인 개념일수록 그냥 넘어가고 잊어버리기 쉬우니 아무리 쉬운 것도 꼭꼭 한번씩 집고 넘어가는 습관을 들이자!!

참고링크

https://losskatsu.github.io/os-kernel/compiler-interpreter/#2-%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0interpreter

 

[리눅스] 컴파일러 vs 인터프리터 차이

[리눅스] 컴파일러 vs 인터프리터 차이

losskatsu.github.io

https://devparker.tistory.com/110

 

[CS] 컴파일러(Compiler)란? - 개념과 역할

컴파일러란? 컴파일러(Compiler)는 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할 수 있는 기계어로 변환하는 소프트웨어 도구입니다. 프로그래머가 작성한 고수준 언어(High-level Language)

devparker.tistory.com

 

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

[C++] 진짜 랜덤값? 가짜 랜덤값?  (0) 2025.01.14
[C++] Text RPG 몬스터 생성 로직 설계  (1) 2025.01.13
[C++] Template, STL  (0) 2025.01.02
[C++] 유니크 포인터  (0) 2024.12.31
[C++] 생성자와 소멸자  (0) 2024.12.30

[C++] Template, STL

닿메_dahme
|2025. 1. 2. 21:14

2025년 1월 2일 목요일(2025년이 밝았따..!)

신년인데도 집중이 잘 되지 않는데.. 왜 그럴까? 아직 이해를 잘 못해서 겁부터 먹는듯하다

겁먹지마 파이팅!!!

 

오늘은 Template, STL에 관해 공부를 했다.

Template

  • 일반화된 코드를 작성할 수 있는 문법
  • 정의할 함수 위에 template <typename T> 를 추가하고, 일반화할 타입에 실제 타입 대신 T로 작성하면 끝!
  • 어떤 타입이 올지 모르지만 그 타입을 그냥 T라고 정의하겠다! 라는 의미
  • 근데 모든 매개변수 타입을 일반화할 필요는 없음
    • 배열의 크기 같은 경우는 항상 정수형이므로 그냥 int를 사용해줘도 문제 없음
    • T Add(T arr[], int size) {}
#include <iostream>
using namespace std;

// general programming(일반화된 프로그래밍)
template <typename T>
T Add(T x, T y) {
    return x + y;
}

int main() {
    cout << Add(3, 4) << endl;         // 정수형 덧셈
    cout << Add(3.3, 4.2) << endl;     // 실수형 덧셈

    return 0;
}

 

STL

STL(Standard Template Library)

  • C++에서 제공하는 표준 템플릿 라이브러리

컨테이너

  • 데이터를 담는 자료구조
  • 모든 컨테이너는 템플릿으로 구현되어있음
  • 타입에 상관없이 사용
  • 메모리 관리를 내부적으로 함
    • 사용시 메모리 관리를 고려하지 않아도 됨
  • 모든 컨테이너는 반복자를 가지고 있음
    • 각 컨테이너를 동일한 문법으로 접근 가능

Vetor

  • 배열과 유사하지만 배열의 업그레이드 버전인 컨테이너
  • 템플릿 클래스로 구현되어 있음
  • 삽입되는 원소 개수에 따라 내부 배열의 크기가 자동 관리됨
  • 임의접근이 가능함(인덱스를 통해 특정 위치에 접근 가능)
  • 벡터 특성상 삽입/삭제는 맨 뒤에 하는게 좋음(배열의 특성)

2차원 Vector

vector<vector<int>> vec(3, vec<int>(4, 1)); // 3x4 행렬이고 모든 원소 1로 초기화

vector의 멤버 함수

  • push_back()
    • vector의 맨 끝에 원소를 추가하는 메서드
    • 원소 개수가 늘어남에 따라 크기는 자동으로 증가하기 때문에 크기를 신경 쓸 필요는 없음
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        vector<int> vec;
        vec.push_back(10);
        vec.push_back(20);
    
        for (int num : vec) {
            cout << num << " ";
        }
        
        return 0;
    }
    // output
    // 10 20 30
    
  •  pop_back()
    • vector의 맨 끝에 원소 제거하는 메서드
    • 맨 끝 원소가 줄어드니까 크기도 줄어듬
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        vector<int> vec = {10, 20, 30};
        vec.pop_back();  // 마지막 요소(30) 제거
    
        for (int num : vec) {
            cout << num << " ";
        }
        
        return 0;
    }
    // output
    // 10 20
    
  •  size()
    • vector의 크기 확인
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        vector<int> vec = {10, 20, 30};
        
        cout << vec.size() << endl;
        
        return 0;
    }
    // output
    // 3
    
  •  erase()
    • 특정 위치의 원소 제거
    • 벡터 특성상 시간이 많이 걸리는 함수이기 때문에 되도록이면 지양
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        vector<int> vec = {10, 20, 30, 40, 50};
    
        // 두 번째 요소 제거 (index 1)
        vec.erase(vec.begin() + 1);
    
        cout << "Vector after erasing second element: ";
        for (int num : vec) {
            cout << num << " ";
        }
        cout << endl;
    
        // 2~4 번째 요소 제거 (index 1~3)
        vec.erase(vec.begin() + 1, vec.begin() + 4);
    
        cout << "Vector after erasing range: ";
        for (int num : vec) {
            cout << num << " ";
        }
        return 0;
    }
    // output
    // Vector after erasing second element: 10 30 40 50
    // Vector after erasing range: 10 50
    

 

Map

  • 키-값 쌍이 하나의 타입이 됨
  • 키 값을 기준으로 데이터가 자동 정렬
  • 중복된 키값 허용 x
#include <iostream>
#include <map>

using namespace std;

int main() {
    // map 선언 및 값 추가
    map<int, string> myMap;
    myMap[5] = "E";
    myMap[2] = "B";
    myMap[8] = "H";
    myMap[1] = "A";
    myMap[3] = "C";

    // map 내용 출력
    cout << "Map의 내용 (키 값 기준으로 자동 정렬):" << endl;
    for (map<int, string>::iterator it = myMap.begin(); it != myMap.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }

    return 0;
}

 

  • insert()
    • make_pair를 통해 키-값 쌍을 만들고 이를 insert를 만들어서 추가
  • find()
    • 특정 키값이 존재하는지 확인 가능
  • size()
    • 맵에 키-값 쌍의 개수를 반환
  • clear()
    • map에 저장되어있는 모든 원소를 삭제

 

이렇게 각 코드 상황에 맞게 적절한 메소드를 사용하면 좋을 것 같고, 이런 메소드가 있었구나~ 하면 될 것 같다!

2차원 벡터는 아직 조금 어렵게 느껴지는데 코드를 계속 짜봐야 빨리 적응할 수 있을 것 같다

[C++] 유니크 포인터

닿메_dahme
|2024. 12. 31. 21:13

2024년 12월 31일 화요일(2024년의 마지막 날...)

아닛 벌써 한 것도 없는데 2025년이라니..?

이번 년도는 퇴사도 하고.. 백수 생활도 하고.. 여러 경험을 해봤다..

하지만 아직 실력은 늘지 않은 것 같다고!!

언어는 다 거기서 거기라고 생각했지만 막상 C++ 기초부터 깊게 제대로 공부하니까 미치겠다고!!!!!

 

오늘의 나

 

어찌되었든 오늘은 C++에서 가장 중요하고! 가장 많이 쓰이고! 그냥 숨쉬듯이 써야하는!

제일 중요한 포인터를 공부해봤다. (사실 숨쉬듯이 써먹어야한다는 조언을 듣고.. 얘부터 확실하게 이해해야 다음 챕터 공부를 수월하게 진행할 수 있을 것 같아서 오늘도 약간 진도가 밀렸다..ㅎ)

그럼 바로 포인터를 알아보자!

 

포인터

사용하는 이유 : 메모리에 직접적으로 관리

int a = 10;
int* ptr_a = &a;

cout << a << endl;
cout << &a << endl;
cout << ptr_a << endl;
cout << *ptr_a << endl;

// output
// 10
// a가 저장되어있는 메모리 주소값
// a가 저장되어있는 메모리 주소값
// 10
  • 참조(&-앤퍼센트) : 변수의 메모리 주소 가져옴
    • &a → a의 주소
  • 역참조(*) : 포인터가 가리키는 주소에 저장된 값을 가져옴
    • *a → a의 값

 

Dangling Pointer

  • 이미 해지된 메모리를 참고하고 있는 포인터

 

Unique Pointer

  • 레퍼런스 카운터가 최대 1개인 스마트 포인터
  • 소유권을 넘겨주는 것은 가능하지만, 동시에 2개 이상 소유 못함
  • 복사 또는 대입이 안됨(이렇게 하면 컴파일 에러 발생)
// unique pointer 생성할 때
#include <memory>  // unique_ptr 사용

unique_ptr<int> ptr1 = make_unique<int>(10);

unique_ptr과 make_unique는 서로 짝

// 컴파일 에러 발생하는 상황
#include <memory>  // unique_ptr 사용

unique_ptr<int> ptr1 = make_unique<int>(10);
unique_ptr<int> ptr2 = ptr1;  // 여기서 이미 ptr이 메모리 참조값을 가지고 있음(최대 1개 만족)
// 가능한 상황
#include <memory>  // unique_ptr 사용
using
unique_ptr<int> ptr1 = make_unique<int>(10);
unique_ptr<int> ptr2 = move(ptr1);  // ptr의 소유권을 ptr2로 이동

// ptr은 이제 비어있게됨
if (!ptr1)
	cout << "ptr1은 비어있음" << endl;

 

 

포인터도 원시 포인터가 있고 스마트 포인터가 있었다..

뭔가 알듯말듯 이해한 것 같은데 막상 문제 풀면 틀리고..

머리로 이해하고 손으로 먼저 확실하게 이해한 다음에 코드로 만져봐야겠다.

[C++] 생성자와 소멸자

닿메_dahme
|2024. 12. 30. 22:18

2024년 12월 30일 월요일

오늘은 월요병이 온 탓인지 학습에 쉽사지 집중을 하지 못했다.

그래서 코드와 강의를 듣기보다는 지금까지 공부하면서 헷갈리고 명확하지 못한 것들을 확실히 정리하는 시간을 가졌다.

오늘은 생성자와 소멸자에 대해 공부를 해봤다.

생성자

  • 객체가 생성되는 시점에 자동으로 호출되는 멤버 함수
  • 클래스 이름과 동일한 멤버 함수
  • 리턴 타입 지정하지 않음(void도 마찬가지)
  • 오버로딩을 통해 다형성을 구현하면 중복된 생성자 중 하나만 호출
  • 생성자가 하나도 없다면 컴파일러에 의해 매개변수가 없는 기본 생성자가 자동 생성됨
    • 매개변수가 있는 생성자만 생성하고 매개변수가 없는 기본 생성자를 생성하지 않으면 컴파일 에러가 남

 

생성자가 필요한 이유

  • 인스턴스(객체)를 생성할 때 멤버 변수 값을 초기화하거나, 객체 크기에 맞는 메모리 할당, 파일을 열거나 네트워크 연결하는 등 생성하는 지점에서 해야 하는 초기화 작업들을 담당하기 위해 존재

 

생성자로 멤버 변수 초기화

  • 2가지 방법으로 초기화가 가능함.
Rectangle::Rectangle(){ width = 10; length = 10; }
Rectangle::Rectangle(int x) { width = x; length = x; }
Rectangle::Rectangle(int w, int l) { width = w; length = l }
Rectangle::Rectangle() : width(10), length(10) {}
Rectangle::Rectangle(int x) : width(x), length(x) {}
Rectangle::Rectangle(int w, int l) : width(w), length(l) {}

int width;  // int 클래스의 인스턴
int length;

🔼 이 케이스가 가능한 이유는 C++에서 멤버 변수 또한 객체이기 떄문.

int의 크기를 가지는 객체이므로 int 클래스의 인스턴스 width의 생성자 매개변수로 값을 넘겨줘서 초기화

 

위임 생성자

  • 타겟 생성자를 통해 생성자 작업을 대행
  • 더 공부해야할 것 같다.

 

소멸자

  • 객체가 소멸할 때 자동으로 호출되는 함수
    • 함수 내부에서 return되는 순간 생성자의 역순으로 호출됨
  • 임의로 호출 불가
  • 클래스와 동일한 이름, 리턴 타입 지정 x
  • 반드시 하나만 존재
  • 소멸자 앞에 ~(틸트)가 붙음
  • 소멸자가 없으면 컴파일러가 기본적으로 소멸자를 생성해줌
    • new 키워드로 만든 동적 생성 객체는 delete로 소멸시켜주자

 

소멸자가 필요한 이유

  • 객체가 사라지는 시점에 할당 받은 메모리를 해제, 파일 저장 및 닫기, 네트워크 닫기 등 자원에 대한 마무리 작업 수행
  • 소멸자가 없다면 메모리 오버플로우 발생 가능성 높음
    • 왜? 객체가 만들어질 때마다 메모리 등의 자원이 계속 추가적으로 사용될 것이고, 계속 반복되면 불필요한 데이터들도 메모리 공간에 남아있게 되어 남아있는 공간이 없어질 것.

 

참고링크

https://easy-study-note.tistory.com/33

 이 오류는 프로그래머스 문제 나머지가 1이 되는 수 찾기를 풀다가 만나게 되었다.

아래는 내가 오류를 겪었던 코드이다.

어느 줄에서 오류가 났을지 같이 찾아보자...

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(int n) {
    int answer = 0;
    
    for (int x = 0; x < n; x++)
    {
        if (n % x == 1)
        {
            answer = x;
            break;   
        }
    }
    
    return answer;
}

 

찾았나요..?

바로 n % x == 1이라는 구문인데, 지금 x는 0부터 시작되고 있는데 0은 나눗셈으로 정의되지 않는다.

C++에서는 0으로 나누기를 실행할 때 런타임 오류로 이어진다고 한다.

 

항상 나눗셈이나 나머지 연산을 수행할 때에는 값이 0이 아닌지 확인하자..

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

[C++] Text RPG 몬스터 생성 로직 설계  (1) 2025.01.13
[C++] 컴파일러와 인터프리터?  (1) 2025.01.03
[C++] Template, STL  (0) 2025.01.02
[C++] 유니크 포인터  (0) 2024.12.31
[C++] 생성자와 소멸자  (0) 2024.12.30

문제

자연수 N의 자릿수의 합을 구하는 문제이다.

 

풀이 방법

1. N을 string 형태로 변환

2. N의 길이만큼 N[i]를 정수로 변환해서 더함

* 형변환이 가장 중요한 요인

 

문제 풀이

#include <iostream>
#include <string>
#include <typeinfo>

using namespace std;
int solution(int n)
{
    int answer = 0;
    string str_n = to_string(n);
    
    for (int i = 0; i < str_n.size(); i++)
    {
        answer += str_n[i] - '0';
    }

    return answer;
}

 

char에서 int로 형변환 하는 과정에서 (int) 등의 여러 형변환을 사용해봤는데, N[i]의 ascii 코드로 변환이 되는 문제를 겪었다.

char에서 '0'을 빼주면 int 형이 된다.

원리는 ascii 코드에서는 숫자 문자들이 연속된 코드 값을 가지고 있다.

'0'은 48, '1'은 49 ~ '9'는 57의 형태로 할당되어 있다.

그래서 char '2'를 int 2로 출력하고 싶다면 '2' - '0' 즉, 50 - 48 = 2 이런 형태로 형변환이 가능한 것이다.

 

처음에는 toInt, (int), stoi 등 여러가지를 다 써봤지만 다들 ascii 코드값을 가지고 있어 많이 혼란스러웠다.

이렇게 또 하나 알아간다 ㅎㅎ

 

 

Unreal 실행 화면을 가져왔다.

화면의 숫자대로 보면 좋을 것 같다.

- 1번 메뉴바

에디터와 특정 명령이나 함수 기능에 접근할 수 있다. 파일을 저장하거나 불러오는 기능도 포함되어 있다.

 

- 2번 메인 툴 바

Unreal 엔진의 가장 일반적인 툴과 에디터 일부를 위한 단축 키를 포함하고 있다.

에디터를 실행하고, 멈추고, 실행을 중지하는 기능도 메인 툴 바에 들어가 있다.

 

- 3번 레벨 뷰포트

카메라와 액터, 메쉬 등의 레벨 콘텐츠를 표시하는 곳인데 쉽게 말해 눈으로 보거나 우리가 다뤄야 할 객체들이 담겨있는 3D 공간이다.

 

- 4번 Content Drawer 버튼

프로젝트의 모든 에셋에 접근할 수 있는 버튼이다.

 

- 5번 하단의 툴 바

콘솔창과 출력 로그 창이 담겨있다. 소스 컨트롤 상태도 표시된다.

 

- 6번 아웃라이너(Outliner)

레벨의 모든 콘텐츠에 대한 계층 트리 뷰를 표시한다.

 

- 7번 디테일 패널

액터 선택 시 나타난다. Transform, Mesh, Material, Physics 세팅과 같은 액터를 위한 다양한 프로퍼티를 표시한다.

 

참고링크 : https://dev.epicgames.com/documentation/ko-kr/unreal-engine/unreal-editor-interface

 

 

(바쁘신 분들은 밑에 글 패스하고 바로 1번부터)

현생에 치이기도 하고,, 여러가지 진로에 대한 고민을 많이 하느라 이제야 글을 쓰게 되었다.

게임 업계 취업을 위한 퇴사를 했고 나름의 계획을 세웠다고 생각했으나... 큰 틀만 잡아놔서 시작하기 너무 막막했다..

사실 그동안의 보상심리로 한달은 그냥 쭉 놀아서 개발적 사고가 모두 흐물흐물해졌다..

사실 이쯤되니까 뭘 해야할지 길을 살짝 잃기도 하고,, 헤이해지기도 하고 무기력하고 난리가 났었지만! 😂

주변 사람들의 약간의 쓴소리와 걱정들을 듣고 정신이 확 들었다. 내가 얼마나.. 충동적인 결정을 했고,, 무계획이고.. 한심하게 보이는지.. 후회하기엔 이미 엎질러진 물. 내가 선택한 길 내가 책임져야지..!

많은 자기 성찰과 무참히 흩어진 내 생각 조각들을 맞추는 시간을 가졌다.

 

결론은 게임 개발.. 죽기 전에 한 번쯤 해봐야 후회가 없을 것 같아 게임 업계 취준을 다시 준비하게 되었다.

뭐든 설계부터 해야 후과정이 깔끔하게 진행되는 것을 경험한 나는.. 공부하기전 나만의 공부 순서? 커리큘럼을 짜볼 것이다.(사실 막상 혼자 독학하려니 뭐부터 해야할지 막막하고 계속 미루게 되더라..)

나 뿐만 아니라 비슷한 상황의 사람들에게 도움이 될까 하여 글로 남겨본다.

관련 링크는 모두 글 제일 마지막에 링크 걸어둘테니 참고하면 좋을 것 같다.

 

1. C++ 언어 문법 공부

이상하게 대학 시절 C++에 대한 강의는 없던터라 기초부터 고급문법까지 혼자 독학해야할 것 같다. 이 부분은 유튜브 강의나 "모두의 코드"의 강의를 통해 진행할 예정이다.

2. 자료구조, 알고리즘 공부

학교 다니면서 너무 놀았던 탓에 자료구조와 알고리즘에 대한 부분이 너무 약하다는 생각이 들었다.. 진짜 너무 .. 

자료구조 공부는 이론도 거의 까먹은 상태라 이론 위주의 책을 하나 구매하여 공부할 예정이고, 이론만 공부하다보면 실무에서 코드로 어떻게 접근하는지 모르는 경우가 많다. 나 또한 이 경우에 해당하고. 그래서 마침 이론으로만 봤던 자료구조를 어떻게 구현할 수 있는지 코드로 설명하는 유튜버 얌얌코딩 님을 를 찾았기 때문에 이 강의와 자료구조 책, 동빈나의 코딩테스트를 위한 책을 보며 병행할 예정이다.

3. 백준, 프로그래머스 쉬운 문제 다 풀기

언어에 대한 이해가 잡혔고, 문제를 이해하며 어떤 방법으로 로직을 설계할지 연습하는 과정이다.

쉬운 단계의 문제(프로그래머스 기준 0~1단계)를 하루에 최소 5문제 이상 풀고 단계가 오를 수록 최소 3문제 정도로 풀어나가려고 한다. 코딩 테스트 통과까지는 최소 백준 실버 1, 골드 2 정도로 해야하고, 프로그래머스는 레벨 2.5 ~ 3까지 풀어야 수월하게 문제를 풀 수 있다고 한다.. (힘내자..!)

 

4. 언리얼 엔진 프로젝트 제작

언리얼 엔진에서 사용하는 함수들이 있을텐데 그것들을 3번과정과 병행하며 공부하면 좋을 것 같다.

지금 포트폴리오도 내가 보기엔 너무 볼품이 없다.. 풍성하게 만들어나가고 싶다. 아자아자!

 

사실 어느 정도의 시간이 걸릴지 아직 잘 모르겠어서 너무 두렵고 막막하지만 그래도 하나하나 하다보면 어느새 성장해있고 현 상태에서 모르는 것들을 잘 이해하고 활용하는 미래의 나를 상상하며 열심히 버텨야겠다. 다들 파이팅! 🫡

 

모두의 코드 강의 링크 -> https://modoocode.com/135

 

씹어먹는 C++ 강좌 계획

모두의 코드 씹어먹는 C++ 강좌 계획 작성일 : 2011-03-05 이 글은 570645 번 읽혔습니다. 안녕하세요 여러분~ 이제 C 언어에 이어서 C++ 강좌를 연재하게 된 이재범 입니다. 저의 C++ 강좌는 여러분이 C

modoocode.com

 

자료구조 책 -> https://product.kyobobook.co.kr/detail/S000212705529

 

읽고 나면 진짜 쉬워지는 자료 구조 | 제레미 쿠비카 - 교보문고

읽고 나면 진짜 쉬워지는 자료 구조 | 기술 면접, 코딩 테스트의 필수 주제인 자료 구조! 최적의 자료 구조를 선택해야 더 효율적인 코드를 구현할 수 있다!자료 구조를 사용하는 궁극적인 이유

product.kyobobook.co.kr

 

유튜브 강의 -> https://www.youtube.com/watch?v=Vm2fNaEc1Lo&list=PLWKwcHKTXy5QXZEw5dJ6ubggsBhLtTsBa&index=1

 

아 그리고 내가 이 계획을 세우며 참고한 블로그 링크도 첨부하겠다.

https://skmouse.tistory.com/entry/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EA%B3%B5%EB%B6%80%EB%B0%A9%EB%B2%95

 

2024.09.12)코딩테스트 공부방법

[2024년 코딩테스트 빈출 문제유형]1. BFS, DFS2. 구현(빡구현 문제라고 많이들 칭한다)3. DP(Dynamic Programming)4. Union-Find[코딩테스트/취업&코테 정보] - 2024 개발자 부트캠프 무엇을 해야하나?[코딩테스트

skmouse.tistory.com