프로그래밍 언어 74

[ C++ ] 10. 클래스와 클래스 멤버

클래스와 클래스 멤버 객체 지향 프로그래밍에서, 우리는 종종 우리의 타입이 데이터를 보유할 뿐만 아니라, 데이터와 함께 작동하는 기능을 제공하기를 원한다. C++에서는 이 작업을 class 키워드를 통해 수행한다. class 키워드를 사용하면 클래스라고 하는 새로운 사용자 정의 타입을 정의할 수 있다. 클래스 (class) C++에서 클래스와 구조체는 본질적으로 같다: struct DateStruct { int year; int month; int day; }; class DateClass { public: int m_year; int m_month; int m_day; }; 중요한 차이점은 클래스의 public 키워드뿐이다. 이것은 다음 포스트에서 자세히 설명할 예정이다. 구조체 선언과 마찬가지로, 클..

[ C++ ] 09. std::vector의 capacity 및 stack 동작

std::vector의 capacity 및 stack 동작 이전 포스트에서 std::vector가 동적 배열이라는 것을 이야기했다. std::vector는 가장 유용하게 많이 사용되므로 다른 속성과 기능에 대해서 좀 더 이야기해보자. Length vs. Capacity int* array = new int[10] { 1, 2, 3, 4, 5 }; 위 예제 코드는 요소 5개만 할당하였어도 배열의 길이는 10이라고 말할 수 있다. 초기화한 요소만 사용하고, 사용하지 않는 요소들을 미래에 확장하기 위해 남겨두기 위해서는 어떻게 해야 할까? 위 예제에서는 할당된 요소 수에서 "사용하는" 요소 수를 별도로 기억해야 한다. int* array = new int[10] { 1, 2, 3, 4, 5 }; // 미래에 ..

[ C++ ] 08. 스택과 힙(Stack & Heap)

스택과 힙 (Stack and Heap) 프로그램이 사용하는 메모리는 일반적으로 세그먼트(segment)라고 하는 몇 가지 다른 영역으로 나뉜다. 코드 세그먼트 : 컴파일된 프로그램이 저장되는 영역, 일반적으로 read-only 속성이다. 데이터 세그먼트 : 전역 변수 및 정적 변수가 저장되는 영역 힙 세그먼트 : 동적으로 할당된 변수가 할당되는 영역 스택 세그먼트 : 함수 매개 변수, 지역 변수 및 기타 함수 관련 정보가 저장되는 영역 힙 세그먼트 (Heap segment) 힙 세그먼트는 동적 메모리 할당에 사용되는 메모리를 추적한다. C++에서 new 연산자를 사용해서 메모리를 할당하면 이 메모리는 응용 프로그램의 힙 세그먼트에 할당된다. int* ptr = new int; // ptr은 힙에서 4바..

[ C++ ] 07. 함수 포인터

함수 포인터 (function pointer) 포인터가 다른 변수의 주소를 저장하는 변수라는 것을 배웠다. 이와 유사하게 함수 포인터(function pointer)는 함수를 가리키는 변수다. 즉, 함수의 주소를 저장하는 변수다. int foo() { return 5; } 식별자 foo는 함수의 이름이다. 그러나 함수의 타입은 무엇일까? 함수는 고유한 l-value 함수 타입이다. 위 예제의 경우 정수(int)를 반환하고 매개 변수를 받지 않는 함수 타입이다. 변수와 마찬가지로 함수는 메모리의 할당된 주소에 있다. () 연산자를 통해 함수를 호출하면, 호출되는 함수의 주소로 점프하여 실행한다. int foo() // foo 코드는 메모리 주소 0x002717f0에서 시작한다. { return 5; } i..

[ C++ ] 05. std::vector

std::vector 이전 포스트에서 std::array를 소개했다. std::array는 C++의 내장 고정 배열(fixed array) 기능을 더 안전하고 유용한 형태로 제공한다. 마찬가지로 C++ 표준 라이브러리에는 동적 배열(dynamic array) 작업을 더 안전하고 쉽게 해주는 std::vector를 제공한다. An introduction to std::vector C++ 03에서 소개된 std::vector는 자체 메모리 관리를 처리하는 동적 배열 기능을 제공한다. 즉, new와 delete를 사용하여 메모리를 동적으로 할당∙해제하지 않고도 런타임에 길이가 설정된 배열을 만들 수 있다∙ std :: vector는 헤더에 정의되어 있다. std::vector 변수 선언은 쉽다. #includ..

[ C++ ] 04. std::array

std::array 이전 포스트들에서 고정 배열(fixed array)과 동적 배열(dynamic array)을 배웠다. 두 가지 배열 모두 C++에 내장되어 있지만, 포인터로 형 변환되었을 시 배열 길이 정보가 손실되고, 동적 배열은 지저분한 할당 해제 문제가 있다. 이러한 문제를 해결하기 위해 C++ 표준라이브러리는 배열 관리를 쉽게 해주는 std::array 와 std::vector가 있다. An introduction to std::array in C++11 C++ 11에서 소개된 std::array는 함수에 전달할 때 포인터로 형 변환되지 않는 고정 길이 배열이다. std:: array는 헤더의 std 네임 스페이스 내부에 정의되어 있다. std::array 변수 선언은 쉽다. #include ..

[ C++ ] 03. auto

auto C++ 11에서 타입 추론 (Type inference in C++ 11) C++ 11에서 auto 키워드는 유용하다. double d = 5.0; 5.0이 부동 소수점 숫자 리터럴이라는 것을 이미 알고 있다면, 왜 d의 타입(=자료형)을 double이라고 명시적으로 선언해야 할까? 변수를 초기화할 때 사용하는 값을 기준으로 적절한 타입을 추론하도록 하면 편하지 않을까? auto 키워드는 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시한다. 즉, auto 키워드를 사용하면 초깃값의 형식에 맟춰 선언하는 인스턴스(변수)의 형식이 '자동'으로 결정된다. 이것을 타입 추론(type inference)이라고 한다. auto d = 5.0; // 5.0 is a ..

[ C++ ] 02. 난수 생성

난수 생성 (Random number generation) 랜덤 숫자(=난수)를 생성하는 기능은 특정 종류의 프로그램에서 유용하다. 예를 들어 게임에서 무작위 이벤트가 없다면 몬스터들은 항상 같은 방법으로 공격하고, 항상 같은 아이템을 얻을 것이다. 던전의 레이아웃 또한 절대 바뀌지 않을 것이다. 그러면 어떻게 난수를 생성해야 할까? 현실에서는 동전 뒤집기, 주사위 굴리기, 카드 패 돌리기 등의 방법으로 무작위 결과를 만든다. 이러한 이벤트는 물리적 변수(Ex. 중력, 마찰, 공기 저항, 운동량)를 많이 포함한다. 그러나 컴퓨터는 물리적 변수를 이용하도록 설계되지 않았으므로 컴퓨터는 동전을 던지거나 주사위를 굴릴 수 없다. 컴퓨터는 모든 것이 바이너리이고 제어된 전기 환경에서 살고 있다. 컴퓨터는 본질적..

[ C++ ] 01. 부동 소수점 숫자

부동 소수점 숫자 (floating point numbers) 정수(integer)도 매우 좋지만 때때로 매우 큰 숫자나 소수점이 있는 숫자를 저장해야 하는 경우도 있다. 부동 소수점(floating point) 자료형 변수는 4320.0, -3.33, 0.01226과 같은 실수를 저장하는 변수다. 부동 소수점은 소수점이 "부동(float)" 할 수 있다는 것을 의미한다. 즉, 소수점 앞과 뒤에 있는 자릿수를 지원한다. C++에는 float, double 및 long double 과 같은 부동 소수점 자료형이 있다. 정수와 마찬가지로 C++은 이러한 자료형의 크기를 지정하지 정의하지 않았다. 현대 아키텍처에서 부동 소수점 표현은 거의 항상 IEEE 754 바이너리 형식을 따른다. 이 형식에서 float은..

[ Coding Style Guide ] 06. C언어 - 함수

함수 짧은 함수 짧고 집중된 함수를 작성한다. 함수가 40줄을 넘어가면 포그램의 구조를 해치지 않는 범위에서 함수를 나눌 수 있도록 노력한다. 긴함수가 지금은 잘 동작하더라도, 누군가 나중에 새로운 동작을 넣을 수 있으며, 이로 인채 찾기 힘든 버그가 발생할 수 있다. 함수를 짧고 간단하게 유지하는 것은 다른 사람이 코드를 읽고 고치지 쉽게 만든다.

[ Coding Style Guide ] 05. C언어 - 주석

주석 주석은 코드의 가독성을 유지하는 데 매우 중요하다. 하지만 이와 별개로, 가장 좋은 주석은 코드 자체이다. 즉, 최대한 주석없이도 코드 만으로 이해할 수 있도록 코드를 작성한다. 타입과 변수, 함수 등에 이해할 수 있는 이름을 적용하는 것이 이상한 이름을 짓고 주석으로 설명하는 것보다 낫다. 주석을 작성할 때에는 그 코드를 보고 이해해야 하는 사람을 위해 성실하게 작성한다. 주석스타일 // 또는 / * * /를 사용하되 일관성 있게 사용한다. 되도록 //를 사용한다. 주석의 내용과 위치, 작성 방식에 일관성을 가져야 한다. 파일 주석 모든 파일의 시작 부분에는 라이선스 문구를 작성하고 그 뒤에 내용에 대한 설명을 작성한다. 라이선스 모든 파일은 라이선스 문구를 퐇마한다. 또는 동일 라이선스 범위를 ..

[ Coding Style Guide ] 04. C언어 - 변수범위

변수 범위 변수의 범위를 적절히 조점함으로써 코드의 가독성이나 성능을 높일 수 있다. 지역 변수 함수 내 변수는 가능한 한 좁은 범위에 둔다. C99 이상에서는 함수 어디에서나 변수 선언을 할 수 있지만, 변수를 가능한 한 국한된 범위로 선언하고 최대한 첫 번째 사용처에 가깝게 선언한다. 이는 읽는 사람이 선언을 찾고 변수의 타입과 초기값을 알아내는 것을 쉽게 한다. 되도록 선언과 동시에 초기화 한다. // 나쁨 - 선언과 초기화가 분리되어 있다. int i; i = f(); // 좋음 - 선언과 동시에 초기화 된다. int j = g(); for, if, while 문에서 조건검사에 사용되는 변수는 되도록 해당 라인에서 변수를 선언한다. 이 경우 해당 변수명은 코드의 다른부분에서 재 선언 가능하다. f..

[ Coding Style Guide ] 03. C언어 - 서식

서식 코딩 시 모두가 통일된 스타일을 사용하면 프로젝트를 파악하기 쉬워진다. 각자가 모든 서식 규칙에 동의하기 어렵고, 일부는 익숙해지는데 시간이 걸리지만, 프로젝트 구성원들이 규칙에 따라 코드를 작성함으로써 서로의 코드를 쉽게 이해하도록 하는 것은 중요하다 줄 길이 코드의 각 줄은 120 문자를 넘지 않게 한다. 문자형식 문자는 되도록 ASCII 문자를 사용하고, ASCII가 아닌 문자를 사용할 경우에는 UTF-8 형식을 사용한다. 들여쓰기 단계 당 2개의 스페이스로 들여쓰기(indentation) 하고 탭은 사용하지 않는다. 코드 상의 그 어디에서도 탭을 사용하지 않는다. 중괄호 중괄호로 묶이는 모든 코드블럭에서, 각 중괄호 "{", "}"는 구문에 따라 같은 줄에 작성하거나 줄바꿈하여 작성한다. /..