C++ 이론 기초
C++ 언어 설계 목표 4가지
- C언어로 작성된 프로그램과의 호환성
- 객체 지향 개념 도입으로 소프트웨어 재사용 가능
- 엄격한 타입 체크. 실행 시간 오류 가능성 ↓, 디버깅을 도움.
- 실행 시간 효율성 저하 최소화
C 언어에서 더 추가된 기능
- 함수 중복(fucntion overloading) - 매개 변수 개수나 타입이 서로 다른 동일한 이름 함수들을 선언할 수 있게 함
- 디폴트 매개 변수(default parameter) - 매개 변수에 값이 전달되지 않은 경우 디폴트 값이 전달되도록 함수 선언 가능
- 참조(reference)와 참조 변수 - 변수에 별명을 붙여 변수 공간을 같이 사용할 수 있는 참조 개념 도입
- 참조에 의한 호출(call-by-reference) - 함수 호출 시 참조를 전달할 수 있게 함
- new와 delete 연산자 - 동적 메모리 할당, 해제를 위한 연산자
- 연산자 재정의(operator overloading) - 기존 연산자에 새로운 연산을 정의할 수 있게 함
- 제네릭 함수와 클래스(generics) - 함수나 클래스를 데이터 타입에 의존하지 않고 일반화시킬 수 있게 함.
C++ 객체 지향 특성
- 객체와 캡슐화(Encapsulation)
- 캡슐화란? 데이터를 캡슐로 싸 외부 접근으로부터 데이터를 보호하는 객체 지향 특성.
C++에서의 캡슐 - 클래스
클래스는 객체를 정의하는 틀이며, 객체는 클래스를 통해 생겨난 실체(instance)
클래스는 멤버 변수들과 멤버 함수들로 이뤄짐. public / private으로 공개할 지 안 할지 결정 가능.
프로그램 개발 시, 멤버 변수들은 private, 일부 멤버 함수들은 public으로 하여 간접적으로 멤버 변수에 접근하게끔 하는 방식이 좋다. - 예시
class Circle { private: int radius; public: Circle(int r) { radius = r; } double getArea() { return 3.14*radius*radius; } };
- 캡슐화란? 데이터를 캡슐로 싸 외부 접근으로부터 데이터를 보호하는 객체 지향 특성.
- 상속성(Inheritance)
- 상속이란? 자식 클래스의 객체가 생성될 때 자식 클래스에 선언된 멤버뿐 아니라 부모 클래스에 선언된 멤버들도 함께 가지게 되는 특성. 코드의 재사용성을 높여준다.
- 예시
class Figure { void getLength(); void getArea(); };
Circle이 Figure 클래스로부터 상속을 받아 getLength()와 getArea() 기능을 사용 가능하게 된다.class Circle : public Figure { void painting(); };
- 다형성(Polymorphism)
- 다형성이란? 하나의 기능이 경우에 따라 서로 다르게 보이거나 다르게 작동하는 현상.
- 예시
(+) 연산자
- 정수 덧셈 ( 3 + 5 -> 8 )
- 문자열 연결 ( "Friend" + "ship" -> "Friendship" )
- Square 객체 + Square 객체 -> Rectangle 객체
- void getInfo(int age) { ... }
void getInfo(int age, string name) { ... }
void getInfo(int age, string name, string phone) { ... }
위와 같은 예시들을 연산자 중복(operator overloading)이라고 부른다.
함수와 같은 경우는 함수 중복(function overloading)이라고 한다. 모든 함수가 각각 서로 다른 함수로 다뤄진다. - 다형성은 상속 관계에서도 나타난다. 이는 부모 클래스에 구현된 함수를 동일한 이름으로 자식 클래스에서 다르게 구현하는 함수 재정의 혹은 함수 오버라이딩(function overriding)으로 불린다.
C++ 언어와 제네릭 프로그래밍
제네릭 프로그래밍(generic programming) : 동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있도록 함수와 클래스를 일반화시킨 제네릭 함수(generic function)와 제네릭 클래스(generic class)를 만들고, 개발자가 원하는 데이터 타입을 적용시켜 프로그램 코드를 틀에서 찍어내듯 생산하는 기법이다.
C++ 프로그램 개발 과정
- C++ 소스 프로그램 작성(source program)
- 컴파일(compile) : C++ 소스 프로그램이 문법에 맞게 작성되었는지 검사 후, 기계어 코드로 변환해 목적 파일(object file)을 생성하는 과정.
- 링킹(linking) : 어떤 목적 파일이 참조하는 C++ 표준 라이브러리나 다른 목적 파일 속에 있는 함수, 객체, 데이터를 포함해 실행에 필요한 모든 기계어 코드를 확보해 하나의 실행 파일로 만드는 과정.
※ DLL - 실행 중 필요한 순간에 결합하도록 만들어진 라이브러리. 실행 파일 크기를 줄이며, 여러 응용프로그램이 실행 중에 공유한다. - 하나의 실행 파일(executable file) 완성!
C++ 표준 라이브러리
C++ 표준 라이브러리는 개발자들이 불러 쓸 수 있는 다양한 종류의 함수와 클래스가 컴파일된 목적 파일들. 다음의 세 그룹과 기타 기능으로 나뉜다.
- C 라이브러리 : 기존 C 표준 라이브러리를 수용해 C++에서 사용할 수 있게 한 함수들. 이름이 c로 시작하는 헤더 파일에 선언됨.
- C++ 입출력 라이브러리 : 콘솔 및 파일 입출력을 위한 함수와 클래스들로서, 제네릭 프로그래밍을 지원하기 위해 템플릿으로 작성.
- C++ STL 라이브러리 : 제네릭 프로그래밍을 지원하기 위해 템플릿으로 작성된 유용한 함수와 클래스를 포함하는 라이브러리.
-
C 라이브러리 C++ 입출력 라이브러리 C++ STL 라이브러리 - csetjmp
- cassert
- csignal
- cctype
- cstdarg
- cerrno
- cstddef
- cfloat
- cstdio
- ciso646
- cstdlib
- climits
- cstring
- clocale
- ctime
- cmath- fstream
- strstream
- iomanip
- streambuf
- ios
- iosfwd
- iostream
- ostream
- istream
- sstream- exception
- list
- stack
- locale
- stdexcept
- functional
- map
- memory
- string
- numeric
- typeinfo
- utility
- queue
- valarray
- iterator
- set
- vector
- deque
- limits
- new
※ <new> 헤더 파일은 STL에 포함되지 않는 기타 기능을 구현했음.