제가 대학교 1학년 때 [명품 C++ Programming] 교재로 진행되는 C++ 수업에서 배운 내용을 교재와 ppt를 중심으로 정리한 내용입니다.
(2022.9 ~ 2022.12)
당시에 공부를 위해서 HWP 파일로 정리해 놓은 것을 그대로 올립니다.
🍑C++ 언어의 특징
C++ 언어의 주요한 설계 목적
1. C 언어와의 호환성
▶ C 언어의 문법 체계 계승
▶ 소스 레벨 호환성 → 기존에 작성된 C 프로그램을 그대로 가져다 사용.
▶ 링크 레벨 호환성 → C 목적 파일과 라이브러리를 C++ 프로그램에서 링크.
2. 객체 지향 개념 도입
▶ 객체 지향 개념 → 캡슐화, 상속, 다형성
▶ 소프트웨어의 재사용을 통해 생산성 향상
▶ 복잡하고 큰 규모의 소프트웨어의 작성, 관리, 유지보수 용이.
3. 엄격한 타입 체크
▶ 실행 시간 오류의 가능성 저하
▶ 디버깅 편리
4. 실행 시간의 효율성 저하 최소화
▶ 작은 크기의 멤버 함수의 잦은 호출 가능성이 존재 → 인라인 함수 도입 등으로 방지.
C 언어에 추가한 기능
- 인라인 함수
→ 함수 호출 대신 함수 코드의 확장 삽입
- 함수 중복
→ 매개 변수의 개수나 타입이 다른 동일한 이름의 함수들 선언 가능
- 디폴트 매개 변수
→ 매개 변수에 값이 전달되지 않는 경우 디폴트 값이 전달되도록 함수 선언
- 참조와 참조 변수
→ 하나의 변수에 별명을 사용하여 변수 공간을 함께 사용할수 있게 하는 참조 변수 도입
- 참조에 의한 호출
→ 함수 호출 시 참조 전달 가능
new/delete 연산자
→ 동적 메모리 할당/해제를 위해 new 와 delete 연산자 도입
- 연산자 재정의
→ 기존 C++ 연산자에 새로운 연산 정의
- 제네릭 함수와 클래스
→ 데이터 타입에 의존하지 않고 일반화시킨 함수나 클래스 작성 가능
C++ 객체 지향 특성
캡슐화 : 데이터를 캡슐로 싸서 외부의 접근으로부터 데이터를 보호 → 클래스와 객체
- 클래스
▶ C++에서 캡슐의 역할을 함.
▶ 객체를 정의하는 틀
▶ class 키워드를 통해 작성.
▶ 멤버 변수들과 멤버 함수들로 구성 → 멤버들은 private 와 public으로 캡슐외부에 공개여부를 결정할 수 있음. 변수는 노출시키지 않고, 함수는 공개하여 함수를 통해 멤버 변수에 간접적으로 접근하게 하는 것이 좋음.
- 객체 = 실체
▶ 클래스라는 틀에서 생겨난 실체
상속성
- 자식 클래스의 객체가 자식 클래스의 멤버와 부모 클래스에 선언된 모양 그대로 멤버들을 가지고 탄생 → 자식이 부모의 유전자를 물려 받는 것과 유사함.
다형성
- 하나의 기능이 경우에 따라 서로 다르게 보이거나 다르게 작동하는 현상
- 연산자 중복 : 피연산자에 따라 다르게 연산.
- 함수 중복 : 같은 이름의 함수가 매개 변수의 개수나 타입이 다르면 서로 다른 함수로 인식됨.
- 함수 오버라이딩 : 부모 클래스에 구현된 함수를 동일한 이름으로 자식 클래스에서 다르게 구현.
C++ 언어에서 객체 지향을 도입한 목적
1. 소프트웨어의 생산성 향상
▶ 소프트웨어의 생명 주기 단축(빠른 발전으로 인한)으로 인한 빠른 제작 필요
▶ 기 작성된 코드와 소프트웨어의 재사용 필요
→ C++ 클래스 상속 및 객체 재사용으로 해결(객체 지향적 특성들이 재사용을 위한 장치 내장) → 소프트웨어 작성 부담이 감소.
2. 실세계에 대한 쉬운 모델링
▶ 과거의 소프트웨어 → 수학 계산이나 통계 처리에 편리한 절차 지향 언어가 적합
▶ 현재의 소프트웨어 → 컴퓨터가 산업 전반에 다양하게 이용되면서 응용 소프트웨어를 하나의 절차로 모델링하기 어려움. (하나의 흐름도로 진행되지 않음)
절차나 과정보다는 물체 혹은 객체의 상호 작용에 대한 묘사가 적합
객체로 구성된 세계인 실세계의 현상을 보다 쉽게 프로그래밍하기 위함
절차 지향 프로그래밍과 객체 지향 프로그래밍
절차 지향 프로그래밍 : 실행하고자 하는 절차대로 일련의 명령어를 나열하여 프로그래밍하는 방법
- 작업을 실행하고자 하는 절차로 표현하며, 일련의 명령어 나열. 이때, 명령들의 순서나 흐름에 중점을 둠.
- 흐름도를 설계하여 흐름도에 따라 프로그램 작성 → 동작을 함수로 작성하여 순서에 맞추어 실행되도록함.
- 실제 응용의 세계는 훨씬 복잡하게 구성되어 있기에 한계가 있음.
객체 지향 프로그래밍 : 절차 지향의 단점을 보완하여 실제 세상의 물체를 객체로 표현하며 프로그램을 보다 실제 세상에 가깝게 모델링
C++와 제네릭 프로그래밍
- 제네릭 함수(템플릿 함수) : 동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있게 일반화 시킨 함수 →
template 키워드로 선언
- 제네릭 클래스(템플릿 클래스) ; 동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있게 일반화 시킨 클래스 →
template 키워드로 선언
- 제네릭 프로그래밍 : 제네릭 함수와 제네릭 클래스를 활용하여 프로그램을 작성하는 새로운 프로그래밍 패러다임.
▶ 다른 객체 지향 언어에서도 이미 도입해서 사용중 → 중요성 높아지고 있음.
▶ 프로그램 코드를 틀에서 찍어내는 듯이 생산하는 기법
▶ STL : 응용 프로그램 개발에 필요한 대부분의 자료구조를 제네릭 함수와 클래스로 구현한 것 → 표준화하여 제네릭 프로그래밍 시대 출범.
C++ 언어의 아킬레스
- C 언어와의 호환성을 추구하며 발생한 문제점이 존재
- 캡슐화의 원칙이 무너짐
▶ 캡슐화에서는 변수와 함수를 클래스 안에 선언하도록 하는 강력한 원칙이 존재하지만, 함수 바깥에 전역 변수를 선언할 수 있는 C 언어의 특성을 받아들임. 또한 main() 함수 역시 클래스 외부에 단독으로 존재함.
- 캡슐화의 원칙이 무너짐에 따라오는 부작용
▶ 코드와 데이터를 외부의 접근으로부터 보호하기가 어려움.
유익한 글이었습니다.