프로그래밍 언어/C++ 15

12) 템플릿

1. 클래스 템플릿 1) 템플릿 함수나 클래스를 정의할 때, 특정 데이터 형을 사용하는 대신 범용형을 사용 여러가지 데이터 형에 대해서 함수 정의나 클래스 정의가 가능 장점 함수 코드의 재사용 단점 포팅에 취약 컴파일러에 따라 지원 X 컴파일 오류 메세지 빈약 → 디버깅에 많은 어려움 2) 클래스 템플릿의 선언 제너릭 클래스 만들기 3) 클래스 템플릿의 인스턴스화 항상 명시적으로 지정 객체를 생성할 때, 템플릿의 파라미터 지정 객체를 생성하지는 않지만, 객체에 대한 포인터나 레퍼런스를 정의하면서 템플릿의 파라미터 지정 4) 템플릿의 특징 실제로 사용되기 전까지는 코드가 생성되지 않음 코드 크기를 최소화 미리 코드를 만드는 것이 아니라 컴파일러가 해당 코드를 컴파일 시 클래스의 코드를 생성 Ex) 2개의 ..

11) 가상 함수와 추상 클래스

1. 가상 함수 1) 가상 함수(virtual function) virtual 키워드로 선언된 멤버 함수 동적 바인딩 지시어 컴파일러에게 함수에 대한 호출 바인딩을 실행 시간까지 미루도록 지시 함수 오버라이딩(function overriding) 파생 클래스에서 기본 클래스의 가상 함수와 동일한 이름의 함수 선언 파생 클래스에서 오버라이딩한 함수가 호출되도록 동적 바인딩 기본 클래스의 가상함수를 실행 X 오버라이딩과 가상 함수 호출 #include using namespace std; class Base { public: virtual void f() { cout

10) 상속

1. 상속 개념 1) C++에서의 상속(Inheritance) 클래스 사이에서의 상속 관계 정의 객체 사이에는 상속 관계 없음 기존의 클래스가 가진 기능을 이어받아서 새로운 클래스를 정의하는 것 기본 클래스: 상속을 해주는 클래스, 일반적인 특징을 제공 파생 클래스: 상속을 받는 클래스, 일반적인 특징 + 구체적인 특징 기본 클래스의 속성과 기능을 물려받고 자신만의 속성과 기능을 추가하여 작성 기본 클래스에서 파생 클래스로 갈수록 클래스의 개념이 구체화 다중 상속을 통한 클래스의 재활용성 높임 다른 클래스를 상속 받아서 새로운 클래스를 정의할 때, 기존의 클래스에 구현되어 있는 기능은 새롭게 정의할 필요 X 2) 상속의 목적 및 장점 간결한 클래스 작성 기본 클래스의 기능을 물려받아 파생 클래스를 간결하..

9) friend와 연산자 중복

1. C++에서의 friend 1) friend 함수 클래스의 멤버 함수가 아닌 외부 함수 전역함수, 다른 클래스의 멤버함수 friend 키워드로 클래스 내에 선언된 함수 : friend 함수라고 부름 클래스 정의 안쪽에 friend 키워드를 쓰고 함수의 선언을 적어줌 클래스의 모든 멤버를 접근할 수 있는 권한 부여 friend 선언의 필요성 클래스의 멤버로 선언하기에는 무리가 있고, 클래스의 모든 멤버를 자유롭게 접근할 수 있는 일부 외부 함수 필요 // 1. 외부함수 equals()를 Rect 클래스에 friend로 선언 class Rect { // Rect 클래스 선언 ... friend bool equals(Rect r, Rect s); }; // 2. RectManager 클래스의 equals(..

8) 함수와 참조, 복사생성자

1. 객체 전달과 참조 1) '값에 의한 호출'로 객체 전달 함수를 호출하는 쪽에서 객체 전달 객체 이름만 사용 함수의 매개 변수 객체 생성 매개 변수 객체의 공간이 스택에 할당 호출하는 쪽의 객체가 매개 변수 객체에 그대로 복사됨 매개 변수 객체의 생성자는 호출되지 않음 함수 종료 매개 변수 객체의 소멸자 호출 ▶값에 의한 호출 기 매개 변수 객체의 생성자가 실행되지 않는 이유? -호출되는 순간의 실인자 객체 상태를 매개 변수 객체에 그대로 전달하기 위해 2) '주소에 의한 호출'로 객체 전달 함수 호출 시 객체의 주소만 전달 함수의 매개 변수는 객체에 대한 포인터 변수로 선언 함수 호출 시 생성자, 소멸자가 실행되지 않는 구조 3) 객체 치환 및 객체 리턴 객체 치환 동일한 클래스 타입의 객체끼리 치..

7) 여러가지 객체의 생성 방법

1. 객체 배열과 객체 포인터 1) 객체 배열 및 포인터의 생성 및 사용 기본 타입 배열 선언과 형식 동일 객체 배열 정의 시 따로 지정하지 않으면 항상 디폴트 생성자로 초기화 Circle circleArray[3];//디폴트 생성자로 초기화 배열의 각 원소 객체 당 생성자를 지정하는 방법 { } 안에 생성자 나열 Circle circleArray[3]={Circle(10), Circle(20), Circle()} // 0번 객체 생성될 때, 생성자 Circle(10) 호출 // 1번 객체 생성될 때, 생성자 Circle(20) 호출 // 2번 객체 생성될 때, 생성자 Circle() 호출 Ex) Circle 클래스의 배열 선언 및 활 #include using namespace std; class Ci..

6) 접근 지정자, static 멤버

1. 접근 지정자 1) 접근 지정자 캡슐화의 목적 객체 보호, 보안 C++에서 객체의 캡슐화 전략 객체의 상태를 나타내는 멤버 변수에 대한 보호 중요한 멤버는 다른 클래스나 객체에서 접근할 수 없도록 보호 외부와의 인터페이스를 위해서 일부 멤버는 외부에 접근 허용 멤버에 대한 3가지 접근 지정자 private (디폴트 값) 동일한 클래스의 멤버 함수에만 제한 클래스 밖에서 직접 접근 불가 멤버 변수는 private으로 지정하는 것이 바람직 protected 클래스 자신과 상속받은 자식 클래스에만 허용 public 모든 다른 클래스에 허용 클래스 밖에서 직접 접근 가능 class Sample { private: // private 멤버 선언 public: // public 멤버 선언 protected: /..

5) 생성자와 소멸자

1. 생성자와 소멸자 1) 생성자와 소멸자 생성자와 소멸자는 자동으로 호출되는 함수 리턴 타입 없음 생성자 객체가 생성되는 시점에서 자동으로 호출되는 멤버 함수 객체가 생성될 때 객체가 필요한 초기화를 위해 "클래스이름()" 형식 디폴트 매개변수 사용 가능 소멸자 객체가 소멸되는 시점에서 자동으로 호출되는 멤버함수 객체가 소멸될 때 객체의 정리를 위해 "~클래스이름()"형식 인자를 가질 수 없기 때문에 오버로딩 불가 2) 생성자 특징 객체 생성 시 오직 한 번만 호출 각 객체마다 생성자 실행 생성자는 중복 가능 생성자는 한 클래스 내에 여러 개 가능 중복된 생성자 중 하나 만 실행 class Circle { int radius; Circle();//클래스 이름과 동일 Circle(int r);//클래스에..

4) 클래스와 객체의 기본

1. 클래스와 객체의 기본 개념 1) 클래스와 객체 클래스(Class) 객체를 만들어 내기 위해 정의된 설계도 사용자 정의 자료형 일종의 데이터 타입 역할을 수행 멤버 변수와 멤버 함수 선언 객체(Object) 클래스에 의해 만들어지는 실제 사용되는 변수 생성 시 클래스의 형태를 가지고 생성 멤버 변수와 멤버 함수로 구성 메모리에 실제로 생성 instance(실체)라고도 부름 하나의 클래스에서 여러 객체 생성 가능 2. string 클래스와 vector 클래스 1) string 클래스 #include 다양한 문자열 연산을 실행하는 연산자와 멤버 함수 포함 문자열 복사, 문자열 비교, 문자열 길이 등 Ex) string 객체 생성 및 입출력 #include #include using namespace st..

3) 개선된 함수 기능

1. 인라인 함수 1) 함수 호출에 따른 시간 오버헤드 함수 호출 시 발생하는 오버헤드를 줄이기 위해서 함수를 호출하는 대신 함수가 호출되는 곳마다 함수의 코드르 복사하여 넣어주는 특별한 함수 작은 크기의 함수를 호출하면, 함수 실행 시간에 비해 호출을 위해 소요되는 시간이 상대적으로 커짐 #include using namespace std; int odd(int x) { return (x%2); } int main() { int sum = 0; // 1에서 10000까지의 홀수의 합 계산 for(int i=1; i