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++

[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