1. 프로그래밍
- 프로그래밍 : 컴퓨터가 처리할 일련의 작업을 묘사하는 것
- 프로그래밍 언어 : 프로그래밍할 때 사용하는 컴퓨터 언어
프로그래밍 언어의 종류
기계어
컴퓨터가 처리할 수 있는 이진수를 사용하는 가장 원시적인 언어 = 저수준 프로그래밍 언어
어셈블리어
사람이 표현하기 쉬운 상징적인 니모닉 기호로 일대일 대응시킨 언어
고급 언어
사람이 이해하고 표현하기 쉬운 언어
- 작성된 프로그램은 컴파일러에 의해 기계어로 변환되어 컴퓨터에서 실행
2. C++ 언어의 역사
➡️ 1972 운영체제를 작성하기 위해 B언어를 개선한 C언어 개발
= 덩치 큰 소프트웨어 개발할 때 프로그램 코드 관리에 어려움
➡️ 1983 C언어에 객체 지향 특성
(object oriented programming) 및 기능을 추가한 C++ 개발
➡️ 1995 C++의 영향을 받은 객체지향언어인 Java 개발
➡️ 2000 C++와 Java의 개념을 섞은 C# 개발
3. C++ 언어의 특징
C++ 언어의 설계 목표
호환성
C언어의 문법적 체계를 그대로 계승하여 C언어로 작성된 프로그램과도 호환 가능
객체 지향 개념 도입
소프트웨어 재사용을 통해 생산성을 높이고, 복잡한 규모의 소프트웨어 작성, 관리, 유지보수를 쉽게 하기 위해 데이터 캡슐화, 상속, 다형성 등 객체 지향 개념을 도입
엄격한 타입 체크
실행 시간 오류의 가능성 줄임
효율성 저하를 최소화
객체 지향 개념의 도입으로 멤버 함수 호출 잦아짐 → 실행 시간이 저하되어 비효율적 → 멤버 함수에 인라인 함수를 도입하는 등 함수 호출로 인한 시간 저하 방지
C언어에 추가한 기능
- 함수 중복(funcion overloading)
: 매개 변수의 개수나 타입이 서로 다른 동일한 이름의 함수들을 선언할 수 있음
- 디폴트 매개 변수(default parameter)
: 매개 변수에 값이 전달되지 않는 경우 디폴트 값이 전달되도록 함수를 선언할 수 있게 함
- 참조(reference)와 참조 변수
: 변수에 별명을 붙여 변수 공간을 같이 사용할 수 있는 참조의 개념을 도입
- new와 delete 연산자
: 동적 메모리 할당, 해제를 위한 연산자 도입
- 연산자 재정의(operator overloaing)
: 기존의 연산자에 새로운 연산을 정의할 수 있게 함
- 제너릭 함수와 클래스(generics)
: 함수나 클래스를 데이터 타입에 의존하지 않고 일반화시킬 수 있게 함
C++의 객체 지향 특성
객체(Instance)와 캡슐화(Encapsulation)
- 캡슐화 : 데이터를 캡슐로 싸서 외부의 접근으로부터 데이터 보호하는 객체 지향 특성
- 캡슐의 역할 : 클래스 (class 키워드 사용해서 작성)
- 클래스
: 객체를 정의하는 틀
- 객체(instance)
: 클래스라는 틀에서 생겨난 실체
- C++클래스 : 멤버 변수 + 멤버 함수의 조합
- 멤버들은 캡슐 외부에 공개하거나(public), 보이지 않게(private) 선언 가능 (공개된 멤버들에게만 외부 객체들이 접근할 수 있음)
멤버 변수들은 private으로 선언하여 외부에 노출시키지 않는 것이 좋음
대신 일부 멤버 함수들을 public으로 선언하여, 이 멤버 함수를 통해서 멤버 변수에 간접적으로 접근하게 하는 걸 추천!
(잘못된 데이터나 상태가 클래스 내부로 들어오는 것을 방지하기 위함)
상속성(Inheritance)
- C++에서 상속 : 자식 클래스 객체가 생성될 때 자식 클래스에 선언된 멤버뿐만 아니라 부모 클래스에 선언된 멤버들도 함께 가지고 탄생
- 목적 : 구현된 코드의 재상용성을 높여 소프트웨어 생산성 높이기 위함
다형성(Polymorphism)
- 다형성 : 하나의 기능이 경우에 따라 서로 다르게 보이거나 다르게 작동하는 현상
연산자 중복(operator overloading)
- 예) '+' 연산자
- 연산1. 정수 덧셈
- 연산2. 문자열 연결
- 연산3. 객체 더하기 (redColor객체 + blueColor객체 --> purpleColor객체)
함수 중복(function overloading)
- 같은 이름의 함수가 매개 변수의 개수나 타입이 다르면 서로 다른 함수로 인식
- 예) 아래 3개의 함수는 서로 다른 함수로 다뤄짐
void add(int a, int b) {...}
void add(int a, int b, int c) {...}
void add(int a, double b) {...}
함수 재정의/함수 오버라이딩(function overriding)
- 부모 클래스에 구현된 함수를 동일한 이름으로 자식 클래스에서 다르게 구현
- 예) 강아지, 고양이, 닭이 동물 클래스의 속성을 상속 받음
-> '소리내기'함수를 강아지, 고양이, 닭에서 모두 서로 다르게 구현(멍멍, 야옹, 꼬꼬댁)
해당 포스팅은 '황기태, 『명품 C++ Programming』, 생능출판사'를 참고하여 작성하였습니다.