본문 바로가기

C++

(32)
C++ 배우기 23(생성자, 소멸자) 생성자 우리가 평소에 사용하던 class에서 사용할 수 있는 것으로, 해당 클래스를 가지고 객체를 생성됨과 동시에 자동으로 호출되는 함수라고 할 수 있다. 보통 class의 멤버 변수는 private의 접근 제한을 기본으로 두고 있어서 외부에서 직접 접근하여 초기화하기 힘들다. 만약 초기화를 하려면 getter와 setter를 이용해 하는 방법을 배웠었는데, 또 다른 방법으로 바로 이 생성자를 사용하는 것이다. class Exam { private : int a; int b; public: Exam(); //생성자 }; int main() { //exam 객체 생성과 동시에 Exam()생성자 호출 Exam exam; return 0; } 지금까지 class를 사용하면서 생성자를 사용하지 않았었지만, 사실..
C++ 배우기 22(static) 변수에 총 3가지의 주기가 존재한다. 여기서 주기란, 생성과 소멸이 되는 부분들을 말한다. 자동 주기 : 일반 지역 변수 등등 생성과 소멸을 사용자 맘대로 할 수 없다. 동적 주기 : 동적 할당된 변수(new) 등등 생성과 소멸(delete)을 사용자 맘대로 할 수 있다. 정적 주기 : 전역 변수, 정적 변수 등등 프로그램이 시작과 동시에 생성이 되고, 프로그램 종료 시에 소멸이 된다. 여기서 우리가 볼 것은 정적 주기이다. 우리가 앞서 메모리 구조에서 데이터 영역은 자세히 알아보기 않았었다. 데이터 영역은 프로그램 시작 시 생성되고, 종료 시 소멸되는 메모리로, 정적 / 전역 변수들이 저장되는 곳이다. 이러한 데이터 영역의 특징 덕분에 메모리 누수의 걱정없이 사용할 수도 있지만, 프로그램이 종료되기 전..
C++ 배우기 21(템플릿) 템플릿(template) 함수나 클래스를 여러 번 다시 작성하지 않도록, 어떤 자료형이던 받아서 사용할 수 있도록 만들어 놓은 틀이다. 오버로딩되서 사용되는 함수를 템플릿화 시켜서 사용할 수도 있다. template //템플릿 사용법 static void Shuffle(T* deck) { . . . } template의 typename을 T로 하겠다는 뜻이며, typename은 본인이 원하는 typename으로 바꿔서 사용할 수 있다. 그리고 위의 예시로 Shuffle() 함수를 템플릿화 시킬 건데, 여기서 중요한 건 매개변수이다. 매개변수의 자료형이 T인 것을 볼 수 있다. 이렇게 템플릿의 typename T로 자료형을 해두면, Shuffle() 함수를 호출할 때 받아오는 어떠한 값의 자료형이던 알아서..
C++ 배우기 20(헤더 / 소스 파일 나누기) 지금까지 하나의 .cpp 소스파일에 모두 코딩을 했다면, 이제는 여러 개로 나누어서 해야 한다. 새 항목 추가를 통해 C++파일을 만들어왔었는데, 이번엔 C++ 클래스를 생성해보자. 추가를 하면 클래스 추가 화면이 뜨면서 클래스 이름을 정하는데, 이름에 따라서 .h 과 .cpp 파일의 이름도 같이 바뀐다. 이제 솔루션 탐색기에 .h(헤더 파일)와 .cpp(소스 파일)가 생성된 것을 볼 수 있다. 이렇게 생성을 하면 클래스로 두 파일이 묶여있어서 관리하기가 편해진다. stdafx.h 이제부터 stdafx.h 헤더 파일을 자주 생성하게 될 텐데, 이 헤더 파일은 자주 쓰는 헤더 파일 여러 개를 stdafx.h 파일 안에 미리 넣어두고 컴파일을 해두어서 여러 번 불러오지 않아도 되는 편함이 있다. 위 방식처럼..
C++ 배우기 19(객체지향프로그래밍, class) 객체지향 프로그래밍(OOP) object-oriented programming의 줄임말이다. 프로그램 설계 방법 중 하나로, 명령형 프로그래밍에 속한다. 여기서 객체란, 함수(메서드)와 변수(데이터)의 묶음을 말하며, 이 객체들의 역할을 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것이라고 한다. 아래와 같이 만들었던 구조체 Card 같은 것들이 객체지향 프로그래밍이라 할 수 있다. struct Card { int num; string shape; void Print() { switch (num) { case A: cout
C++ 배우기 18(STL, vector) STL(Standard Template Library) 표준 템플릿 라이브러리라고 부르며, C++ 표준 라이브러리의 많은 부분에 영향을 끼쳤다고 한다. 프로그램에 필요한 자료구조와 알고리즘을 제공해준다. 우리가 자주 쓰던 std namespace의 안에 있다. 이 STL안에는 알고리즘, 컨테이너, 함수자, 반복자라는 4가지의 구성요소가 있다. 컨테이너(container) 특정 타입의 원소들을 담아 다루기 위한 객체, 자료를 저장하는 클래스 템플릿의 집합이다. 구현하려는 동작에서 가장 오버헤드가 걸릴 것을 고려하여 컨테이너를 선택하면 성능 향상에 도움이 된다. 순차 컨테이너와 연관 컨테이너로 나뉘게 되는데, 순차 컨테이너에는 array, vector, list, deque가 있고, 연관 컨테이너에는 set..
C++ 배우기 17(SAL, 표준 라이브러리) SAL(Standard Annotation Language) Microsoft 소스 코드 주석 언어라고 부르며, 이는 함수의 매개변수를 어떻게 사용하는지 설명해줄 수 있는 주석이다. 헤더 파일 안에 정의되어 있다. 위와 같이 함수의 매개변수 앞(__inout)에 사용할 수 있다. 코드를 보았을 때, 이 매개변수가 어떻게 작동하는지 설명할 수 있어 규모가 큰 팀 단위 개발일 때 사용하기도 한다고 한다. __inout뿐만 아니라 다양한 주석 또한 존재한다. _In_호출된 함수에 대한 입력 _Inout_호출된 함수에 대한 입력 및 호출자에게 출력 _Out_호출자에게 출력 _Outptr_호출자에 대한 포인터의 출력 이처럼 각 SAL마다 의미가 있어서 상황에 맞게 잘 쓰면 개발자가 함수를 사용하는 방법을 더 잘 ..
C++ 배우기 16(함수 오버로딩) 함수 오버로딩 함수의 이름은 같지만 매개변수에서의 차이(자료형, 개수)를 두고 사용하는 것을 말한다. 위 사진처럼 함수의 이름이 모두 같지만, 매개변수의 차이를 두고 있다. 따라서 이름은 같지만 서로 다른 함수처럼 작동할 수 있는데, main() 함수에서 호출할 때 매개변수를 어떻게 호출하냐에 따라서 호출되는 Func() 함수가 달라진다. 그런데 여기 이름은 같지만 매개변수가 다른 두 개의 Func() 함수가 있다. 대충 봐서는 함수 오버로딩이 되어 작동할 수 있을 것 같지만, 실제로는 작동하지 않는다. 바로 매개변수에 a = 10이라는 디폴트 값을 대입해버렸기 때문이다. 이런 걸 디폴트 매개변수라고 부르는데, 이런 매개변수는 같은 개수의 매개변수를 가진 함수와 겹치거나, 사실상 아예 존재하지 않는 것과..