C++ 공부 | 자연수 뒤집어 배열로 만들기 - Code Kata
this→ | 객체 자기 자신의 주소를 가리키는 포인터
- 멤버 함수가 호출된 객체 자기 자신의 주소를 가리키는 숨겨진 포인터입니다. 따라서 this->는 그 포인터를 사용하여 객체의 멤버 변수나 멤버 함수에 접근하는 방식을 의미
- this-> is a specific syntax used to access members of the current object within its own class method
- The this Pointer: In C++, this is a special pointer automatically passed to every non-static member function. It holds the memory address of the specific object instance currently executing the function.
- The Arrow Operator (>): Because this is a pointer, you must use the arrow operator (>) instead of the dot operator (.) to access the object's variables or functions.
- Common Use Cases:
- Resolving Ambiguity: It is most frequently used when a function parameter has the same name as a class member (e.g., this->name = name;).
- Returning the Current Object: It allows a function to return a reference to itself using return *this;, which is common in method chaining.
- Clarity: Some developers use this-> explicitly to make it clear they are referring to a class-level member rather than a local variable.
- C++ 에서 객체 (Object) 란 클래스(Class) 를 바탕으로 실제 구현된 데이터와 기능의 집합체
- 인스턴스 (Instance) 화 한다란 말로 혼용되어 사용됨 : 클래스로부터 객체를 만드는 과정을 인스턴스화라고 하며, 그렇게 생성된 구체적인 객체를 인스턴스라고 부릅니다.
- Class == 설계도 | 인스턴스 == 실제 만들어진 결과물
생성자 (Constructor)
- 생성자는 반환형을 명시하지 않으며, class이름과 동일한 이름을 가진 함수로 정의됩니다.
- 매개변수 (parameter) 없는거, 있는거, 기본 매개변수가 있는 생성자 등으로 가능
- 객체가 생성될 때, 멤버 변수를 포함해서 필요한 정보들이 메모리에 올라갑니다.
- 이 작업이 (인스턴스화 되는 순간) 완료되면 생성자가 호출됩니다.
인스턴스화와 메모리 할당 방식
1. 인스턴스화와 메모리 할당 방식
C++에서 인스턴스화는 주로 다음 세 가지 방식으로 이루어지며, 각기 다른 메모리 영역을 사용합니다.
- 스택(Stack) 영역 (자동 메모리 할당):
- 방식: 함수 내부에서 지역 변수로 객체를 생성 (MyClass obj;)
- 특징: 함수가 종료되면 자동으로 메모리가 해제됩니다.
- 힙(Heap) 영역 (동적 메모리 할당):
- 방식: new 키워드를 사용하여 생성 (MyClass* pObj = new MyClass();)
- 특징: 프로그래머가 명시적으로 delete를 호출하여 메모리를 해제해야 합니다. 그렇지 않으면 메모리 누수(Memory Leak)가 발생합니다.
- 데이터(Data/Static) 영역 (정적/전역 메모리 할당):
- 방식: 전역 변수나 static 키워드를 사용하여 생성.
- 특징: 프로그램 시작 시 메모리에 올라가고 프로그램이 종료될 때 해제됩니다.
2. 인스턴스화 시 메모리에 올라가는 것
객체가 메모리에 생성될 때 다음 정보들이 공간을 차지합니다.
- 멤버 변수: 각 인스턴스는 자신만의 멤버 변수 값을 저장할 메모리 공간을 갖습니다.
- 가상 함수 테이블 포인터(vptr): 클래스에 가상 함수(Virtual Function)가 있는 경우, 가상 함수 테이블을 가리키는 포인터가 메모리에 올라갑니다.
참고: 멤버 함수(Method)는 인스턴스별로 메모리에 올라가지 않고, 코드 영역에 딱 하나만 존재하며 인스턴스들이 공유합니다.
3. 정리
- 클래스: 설계도 (코드 영역)
- 인스턴스(객체): 실제 데이터 (스택, 힙, 또는 데이터 영역)
따라서, 인스턴스화는 클래스라는 틀을 바탕으로 메모리에 실제 데이터를 할당하는 핵심 과정입니다.
in c++ #ifndef, #define, #endif
- In C++, #ifndef, #define, and #endif are preprocessor directives used together to create Include Guards. Their primary purpose is to prevent a header file from being included more than once in the same compilation unit, which would otherwise cause "redefinition" errors.
- 중복 정의 에러 방지: 같은 헤더 파일이 다른 헤더 파일들에 의해 여러 번 포함될 때, 구조체나 클래스가 중복 정의되는 것을 막습니다.
- 컴파일 속도 향상: 이미 포함된 파일은 전처리기가 건너뛰게 되어, 불필요한 전처리 작업을 줄여 컴파일 속도를 높입니다.
- #ifndef (if not defined)
- #define: 첫 번째 호출 시에만 이 부분이 실행되어, 해당 헤더 파일이 처리되었음을 표시합니다.
- #endif: #ifndef
- 요즘은 #pragma once 를 사용한다고함 더 좋은데 모든 컴파일러 공식 표준이 아니여서 #ifndef 를 더 선호
Class 의 Header (선언부) 와 Source (구현부) 나누기
- 나누는 이유
Header
(목차)
- 맴버 함수 정의
- 맴버 변수
Source
(내용)
- 맴버 함수 세부 구현
CH 1-6
- 맴버 초기화 리스트
- Vehicle(string c, int s) : color(c), speed(s) { }
- !!! 생성자의 실제 코드 부분 보다, 맴버 초기화 리스트가 먼저 실행된다
- 자식 부모 클래스
- Drived:Base()
- Derived 생성자 호출 시 , 코드를 수행하기 전에 Base() 를 실행하라는 의미
- 이러한 방식으로 기본 클래스는 기본 클래스의 생성자가 초기화하고 파생 클래스는 파생 클래스의 생성자가 초기화할 수 있다.
- Derived 생성자 호출 시 , 코드를 수행하기 전에 Base() 를 실행하라는 의미
- Drived:Base()
Code Kata
- 017. 자연수 뒤집어 배열로 만들기 | Solved Date: 2026-05-01-Fri | Problem Link
