전체 글 169

[C++] static 에 대해서

static 키워드 static이 앞에 붙는 변수나 함수는 어떤 객체에 소속되어 있는 것이 아니라 프로그램이 시작되면 독립적인 메모리를 차지한다는 특징이 있습니다. static 키워드는 변수, 클래스의 멤버 변수, 클래스의 멤버 함수에 붙일 수 있으며 저는 '접근이 제한적인 전역 변수'라고 부릅니다. 실제로 전역 변수와 메모리를 차지하는 형태가 비슷합니다. 메모리에는 코드, 데이터, 힙, 스택 총 4개의 영역이 존재하는데요 static 변수, 함수와 전역 변수는 동일하게 데이터 영역에 할당됩니다. 그런데 전역 변수와 다른 점은 전역 변수는 어디에서나 접근이 가능하다는 특징이 있지만 static 키워드가 붙은 변수나 함수는 '제한된 범위'에서만 접근이 가능합니다. 하나의 블럭, 하나의 네임스페이스, 하나의..

언어/C, C++ 2024.01.08

[C++] 인라인 함수

함수 호출의 단계 함수를 정의하고 컴파일하면, 함수는 기본적으로 메모리의 '코드 섹션'에 저장되고 알맞은 고유의 주소를 가집니다. 그리고 함수 호출 시에는 스택에 함수의 주소를 올려 함수의 본체(body)를 찾아 실행하는 단계를 거치게 되죠. 함수 정의와 함수 호출에는 생각보다 오버헤드가 조금 있습니다. 1) 함수를 사용하기 위해 기존 레지스터에 들어있던 값을 스택에 푸시 2) 현재 PC(Program Counter) 값을 스택에 푸시 3) 함수 주소로 PC값을 변경하여 점프 4) 함수 실행 5) 기존 PC값과 레지스터 값을 스택에서 팝 하여 복구 이런 단계 때문에 함수 호출은 기본적으로 코드를 쌩으로 사용하는 것보다는 속도가 느리다는 단점이 있습니다. 그래서 '재귀'라는 알고리즘 메커니즘이 속도가 느리..

언어/C, C++ 2024.01.08

[C++] 캐스팅 4총사

캐스팅 이란? 캐스팅은 쉽게 말해서 형 변환입니다. 기본 데이터 타입 int, char, short, float 등.. 데이터를 담는 그릇을 바꿔준다고 보시면 되겠습니다. 다음 예시를 보겠습니다. 이런 식으로 바꿔주고 싶은 데이터형을 앞에 명시해 준다면, 자동적으로 적당한 데이터로 컴파일러가 데이터 형을 변환합니다. 위 예시는 'C언어 스타일 캐스팅' 방법입니다. C 스타일 캐스팅 C 언어에서는 하나의 캐스팅밖에 존재하지 않았습니다. 이 예시들을 보면 알 수 있듯 그냥 간편하게 괄호 안에 데이터형을 명시해 주면 강제로 캐스팅해 줍니다. 강제로 캐스팅해 준다. 이거 참 무섭지 않나요? 런타임에서 충분히 오류가 발생할 수 있는 코드도 컴파일에서 통과시켜 준다는 것입니다. 1) float에서 int로 바꾸는 ..

언어/C, C++ 2024.01.08

[C++] 다형성

다형성이란 무엇인가? 다형성은 '하나의 함수가 여러 기능을 가질 수 있는 특성'을 뜻합니다. 다형성 또한 상속, 은닉성을 잇는 OOP의 매우 중요한 개념이라고 볼 수 있죠. 다형성에는 2가지 종류가 있습니다. 1) 같은 이름의 함수가 여러 종류의 매개변수를 처리하여 다른 기능을 하도록 하는 오버로딩 2) 부모 클래스에 존재하는 함수를 자식 클래스에서 재정의하여 다른 기능을 하도록 하는 오버라이딩 오버로딩은 이전 포스팅 '연산자 오버로딩'에서 비슷한 내용을 다뤘으므로, 자세한 것은 설명하지 않을 것이고 OOP에서 중요한 것은 오버라이딩입니다. 오버라이딩은 클래스 상속 관계에서 완전히 같은 이름과 같은 매개변수를 가지는 함수를 자식 클래스에서 재정의하여 다른 기능을 하도록 재정의하는 것입니다. 해당 코드를 ..

언어/C, C++ 2024.01.07

[C++] 클래스 상속

개요 객체 지향 프로그래밍의 핵심 개념은 은닉성, 상속, 다형성입니다. 이번 포스팅에서 설명할 것은 '상속'인데, 상속은 객체들을 관리하고 설계하기에 매우 훌륭한 도구입니다. '상속'은 '파생 클래스'가 '기초 클래스'의 기능을 계승하는 것이라고 설명할 수 있습니다. 일반적으로 상속의 뿌리에는 '베이스 클래스'라는 것이 있고, 베이스 클래스를 상속받는 '파생 클래스'가 존재합니다. 흔히 이것을 '부모'와 '자식'의 관계에 있다고 말하는데요. 부모는 자식에게 상속하고 싶은 함수와 변수를 설정하고, 자식은 부모로부터 상속받은 함수와 변수를 사용할 수 있습니다. 다음 코드로 예시를 보겠습니다. class Player { public: Player(int x, int y, int id) : _x(x), _y(y..

언어/C, C++ 2024.01.07

[C++] 클래스가 암시적으로 정의하는 함수들

클래스를 기본적으로 정의하면 암시적으로 생성되는 함수들이 있습니다. 1) 기본 생성자 2) 기본 소멸자 3) 기본 복사 생성자 4) 기본 대입 연산자 class Object { //이 아래 코드는 굳이 명시하지 않아도 //기본적으로 컴파일러가 만들어준다. public: //기본 생성자 Object() {} //기본 소멸자 ~Object() {} //기본 복사 생성자 Object(const Object& other) : a(other.a) , b(other.b) {} //기본 대입 연산자 Object& operator=(const Object& other) { if(this != &other) { Object newObject; newObject.a = other.a; newObject.b = other...

언어/C, C++ 2024.01.06

[C++] A* 알고리즘을 이용한 '미로찾기 알고리즘'

참고: https://powerclabman.tistory.com/26 [C++] 경로 역추적: BFS을 이용한 '미로찾기 알고리즘' 개요 위 그림과 같은 임의의 미로가 있고 플레이어와 도착지의 위치가 정해져 있을 때, 플레이어는 도착지를 어떻게 찾을 수 있을까요? 그리고 어떻게 해야 최단 경로로 도착지에 도달할 수 있 powerclabman.tistory.com 참고: https://powerclabman.tistory.com/27 [C++/이론] 다익스트라 알고리즘 (Dijkstra Algorithm) 참고: https://powerclabman.tistory.com/24 참고: https://powerclabman.tistory.com/25 가중치 그래프 이전 포스팅에서 사용했던 그래프는 모두 가중..

[C++/이론] 다익스트라 알고리즘 (Dijkstra Algorithm)

참고: https://powerclabman.tistory.com/24 참고: https://powerclabman.tistory.com/25가중치 그래프이전 포스팅에서 사용했던 그래프는 모두 가중치가 없는 그래프였습니다. 즉, 노드와 노드를 이동하는데 비용이 동일하다는 것이죠. 근데, 실제로 상황에서 A->B로 가는 것과 A->C로 가는 것의 비용이 다를 수도 있겠죠? 서울 -> 강원도 서울 -> 부산 두 조건 다 도시와 도시 사이를 이동하는 것이지만, 소모하는 기름, 거리, 톨게이트 비용 등.. 많은 것이 다를 것입니다. 이런 비용을 '가중치' 라고 하고, 가중치를 표현한 그래프를 '가중치 그래프'라고 부릅니다. int adjacent[5][5] = { 0,1,1,0,0, 0,0,1,0,1, 0,0,..

[C++] 경로 역추적: BFS을 이용한 '미로찾기 알고리즘'

개요 위 그림과 같은 임의의 미로가 있고 플레이어와 도착지의 위치가 정해져 있을 때, 플레이어는 도착지를 어떻게 찾을 수 있을까요? 그리고 어떻게 해야 최단 경로로 도착지에 도달할 수 있을까요? 그에 대한 알고리즘을 소개해보겠습니다. 미로 찾기 베이스 미로 찾기 알고리즘을 개발하기 위한 베이스입니다. 이 파트는 넘어가셔도 상관없다만, 몇 가지만 확인해 주시면 해당 포스트를 이해하는데 도움이 될 것입니다. (포스팅을 위해 하나의 파일로 만들었습니다.) 1. 2차원 좌표값은 Pos 클래스를 사용합니다. Pos(y, x)로 나타내며 y는 y축 값, x는 x축 값을 나타냅니다. 연산자 오버로딩을 해주었기에, 자유롭게 연산이 가능합니다. 2. 미로는 NxM 사이즈의 bool 형 2차원 배열입니다. 0(false)..