C++ 40

템플릿과 표준 템플릿 라이브러리

1. 일반화와 템플릿 일반화와 매개 변수의 타입만 다르고 코드가 동일한 함수들을 하나의 틀로 만들고, 이 틀로부터 매개 변수의 타입을 주어 함수를 찍어 내듯이 생산하는 기법을 제네릭(generic)이라고 부른다. template은 c++ 키워드로서 함수나 클래스를 일반화시키는 도구이다. template을 이용하여 작성된 함수를 템플릿 함수 혹은 제네릭 함수라고 부른다. 템플릿 함수나 클래스의 제네릭 타입에 구체적인 타입을 주어, 구체화된 버전의 함수나 클래스 코드를 생성하는 작업을 구체화(specificaion)라고 한다. 2. 제네릭 클래스 클래스도 template 키워드를 이용하여 일반화시킬 수 있다. 제네릭 클래스의 모든 멤버 함수 역시 템플릿 함수로 작성되어야 한다.

C++/C++ 기본 2019.06.30

가상 함수와 추상 클래스

가상 함수와 추상 클래스 1. 상속 관계에서의 함수 중복 파생 클래스에 기본 클래스와 동일한 형식의 함수가 중복 작성된 경우, 기본 클래스에 대한 포인터로는 기본 클래스에 선언된 함수를 호출하고, 파생 클래스에 대한 포인터로는 파생 클래스에 선언된 함수를 호출한다. 2. 가상 함수와 오버라이딩 - 가상 함수(virtual function)란 virtual 키워드로 선언된 멤버 함수 컴파일러에게 자신에 대한 호출을 실행 시간까지 미루도록 지시한다. - 파생 클래스에서 기본 클래스에 선언된 가상 함수와 완전히 동일한 타입의 함수를 재정의하는 것을 함수 오버라이딩 혹은 함수 재정의라고 한다. - 파생 클래스에서 가상 함수를 오버라이딩하고 기본 클래스의 포인터로 파생 클래스의 객체를 가리킬 때, 가상 함수를 호..

C++/C++ 기본 2019.01.21

c++ 상속

상속 1. 상속의 개념 - 객체 지향 언어에서 말하는 상속은 부모의 유전자가 자식에게 물려지는 것과 같다 - 중복된 기능을 가진 여러 클래스들을 상속 관계로 설정하면 클래스를 간소화할 수 있다 - 상속은 클래스들을 계층적으로 분류하여 관리를 용이하게 한다 - 자식 클래스는 부모 클래스의 메소드와 멤버 변수들(private 접근 지정자 제외)을 상속 받는다. - 상속은 부모 클래스의 재사용을 통해 소프트웨어 생산성을 향상시킨다 - 부모 클래스를 기본 클래스 (base class), 자식 클래스를 (derived class)라고 한다 2. 클래스 상속과 객체 - c++에서 파생 클래스(자식 클래스)는 다음과 같이 선언한다. class Derived : public Base {// Base 클래스를 상속받는 ..

C++/C++ 기본 2019.01.09

연산자 함수는 멤버 함수나 프렌드 함수 중 어떤 것이 바람직한가?

연산자 함수는 멤버 함수나 프렌드 함수 중 어떤 것이 바람직한가? 알다시피, c++에서는 연산자를 오버라이딩(overriding)할 수가 있다. 이 때, 오버라이딩을 하는 방법에는 다음과 같은 2가지 방법이 존재한다: 1) 멤버 함수로서 오버라이딩한다.2) friend 키워드를 이용해서 외부 함수를 통해서 오버라이딩한다. 최선의 방법은 역시 멤버 함수로서 오버라이딩하는 것이다. 새로운 연산자는 클래스와 연계하여 작동하기 때문에 클래스의 멤버로 선언하면 외부의 연산자 함수를 friend로 취할 필요도 없고, 프로그램의 가독성도 높아지기 때문이다. 물론, 가끔씩 연산자를 외부 함수로 밖에 만들 수 없는 경우들이 있는데, 이러한 경우에만 예외적으로 friend 키워드를 이용해서 오버라이딩 하는 것이 좋다.

C++/C++ 기본 2019.01.01

C++ 프렌드 개념

C++ 프렌드 1. 프렌드 함수 C++에서는 클래스 외부에 작성된 함수를 클래스 내에 friend 키워드로 선언하여, 클래스의 멤버 함수와 동일한 접근 자격을 부여할 수 있다. 물론, 멤버가 아니기 때문에 상속되지는 않는다. 클래스 내에 friend 키워드로 선언된 외부 함수를 프렌드 함수(friend function)라고 부른다. 프렌드 함수는 마치 클래스의 멤버인 것처럼 멤버 변수와 멤버 함수에 접근할 수 있다. 그렇다면, 프렌드 함수는 왜 필요할까? 프렌드 함수를 클래스의 멤버 함수로 작성하면 되지 않을까? 프로그램을 작성하다보면, 클래스 멤버 함수로는 적합하지 않지만, 클래스의 private, protected 멤버에 접근해야 하는 함수가 생기게 된다. 이러한 함수를 프렌드 함수로 사용하는 것이다..

C++/C++ 기본 2018.08.02

static 멤버

static 멤버 1. static의 특성 static은 변수와 함수의 생명 주기(life cycle)와 사용 범위(scope)를 지정하는 4가지 방식(storage class) 중 하나로서, static으로 선언된 변수와 함수의 생명 주기와 사용 범위는 다음과 같은 특징을 가진다. - 생명 주기: 프로그램이 시작할 때 생성되고 프로그램이 종료할 때 소멸- 사용 범위: 변수나 함수가 선언된 범위 내에서 사용. 전역(global) 혹은 지역(local)으로 구분 C++에서 클래스 멤버 변수와 멤버 함수를 포함하여 모든 변수와 함수는 static 지정자로 선언 가능하다. non-static 멤버는 각 객체마다 별도로 생성되므로 인스턴스(instance) 멤버라고 부르며, static 멤버는 클래스 당 하나만..

C++/C++ 기본 2018.07.31

디폴트 매개 변수

디폴트 매개 변수 함수가 호출될 때 매개 변수에 값이 넘어오지 않는다면, 미리 정해진 디폴트 값을 받도록 선언된 매개 변수를 디폴트 매개 변수(default parameter) 혹은 기본 매개 변수라고 부른다. 1. 디폴트 매개 변수 선언 디폴트 매개 변수는 '매개 변수 = 디폴트 값' 형태로 선언된다. 다음은 디폴트 매개 변수를 가진 star() 함수 사례이다. i.e.void star(int a=5); //매개 변수 a의 기본 값은 5가 된다. int a는 디폴트 매개 변수로서 디폴트 값으로 5를 가지도록 선언되었다. 디폴트 매개 변수를 가진 함수를 호출할 때는 디폴트 매개 변수에 값을 넘겨주어도 되고 생략해도 된다. 생략하는 경우 자동으로 디폴트 값이 매개 변수에 전달된다. star() 함수는 다음..

C++/C++ 기본 2018.07.30

함수 중복

함수 중복 C++에서는 C 언어와 달리 같은 이름의 함수를 여러 개 만들 수 있으며 이것을 함수 중복(function overloading)이라고 부른다. 함수 중복은 다형성의 한 사례이다. 함수 중복은 전역 함수와 멤버 함수에 모두 적용되며, 상속 관계에 있는 기본 클래스와 파생 클래스 사이에도 가능하다. 1. 중복 함수 조건 함수 중복이 가능하려면 다음 조건이 동시에 만족되어야 한다. 1) 중복된 함수들의 이름이 동일하여야 한다.2) 중복된 함수들은 매개 변수 타입이나 매개 변수의 개수가 달라야 한다.3) 함수 중복에 리턴 타입은 고려되지 않는다. - 함수 중복의 성공 사례 다음은 매개 변수의 타입이나 매개 변수의 개수를 다르게 함으로써 함수 중복을 가능하게 만든 예시이다. i.e.int sum(in..

C++/C++ 기본 2018.07.28

대입 연산자

대입 연산자 대입 연산자는 연산자 오버로딩의 결과로서 실행된다. 복사 생성자와 비슷하게 값에 복사를 수행한다. 생성자와 마찬가지로 따로 선언하지 않을 경우 default로 얕은 복사를 하는 대입 연산자를 컴파일러가 자동으로 만들어서 삽입한다. 다음은 예제를 통해서 대입 연산자를 구현하는 방식에 대해서 알아보도록 하자. i.e.class TClass{public:TClass& operator = (const TClass& target) {if (this != &target) {//복사 수행}return *this;}} 대입 연산자는 TClass& 로 reference 형을 return 한다. 이는 cls = cls2 = cls3; 처럼 연속으로 대입 연산자를 수행가능 하도록 만들기 위해서 그렇게 한 것이다..

C++/C++ 기본 2018.07.28

묵시적 복사 생성

묵시적 복사 생성 C++의 복사 생성자가 묵시적으로 호출되며 객체가 복사되는 경우를 묵시적 복사 생성이라고 한다. 묵시적인 복사 생성의 경우는 다음 3가지로서, 컴파일러가 복사 생성자를 자동으로 호출하는 경우이다. 1. 객체로 초기화하여 객체가 생성될 때 다음은 son 객체를 생성할 때 father 객체로 초기화하도록 하는 선언문이다. ==> Person son = father; //복사 생성자 자동 호출 컴파일러는 위의 문장을 다음과 같이 변환하여 복사 생성자를 호출한다. ==> Person son(father); 위의 과정을 다음의 치환문과 혼돈하지 마라. i.e.Person son;son = father; //복사 생성자 호출되지 않음 위의 경우는 복사 생성자가 아니라 대입 연산자(혹은 대입 함수)..

C++/C++ 기본 2018.07.28