6장 소개
- 프로그래밍 패러다임: 프로그램을 어떤 절차와 구조로 만들 것인지에 대한 스타일이나 접근 방법
- 이절에서는 여러 패러다임 중 비구조적 프로그래밍과 절차적 프로그래밍에 대하여 알아봄
06-1 객체지향 이전의 프로그래밍 패러다임
비구조적 프로그래밍
- 비구조적 프로그래밍: 코드를 구조화하지 않고 작성하는 방법
- 첫번째 줄부터 마지막 줄까지 차례대로 실행되며, 코드의 흐름을 이동하는 goto문을 사용하는 특징이 있음.
- 대표적 비구조적 프로그래밍 언어: 어셈블리어, 초창기 fortran
절차적 프로그래밍
- 소스 코드를 여러 부분으로 나눠서 활용하는 패러다임
- 프로시저를 이용해 구조화하는 방식
- 프로시저: 일련의 코드 묶음, 함수
- 대표적 절차적 프로그래밍 언어: C, cobol, fortran
- 절차적 프로그래밍에서는 코드의 논리 구조를 --> 모듈화할 수 있다.
- 모듈화를 하면 같은 기능을 수행하는 코드를 다시 작성하지 않아서 재사용할 수 있음.
- 라이브러리처럼 누군가가 만들어 놓은 기능을 사용하면 프로그램을 더 쉽게 개발할 수 있음.
- 코드 가독성이 좋아짐.
- 절차적 프로그래밍으로 작성한 코드는 프로그램의 중심 흐름을 당담하는 코드와 프로시저를 구현하는 코드로 나뉨.
절차적 프로그래밍의 한계
- 프로시저가 가진 논리적 다층 구조를 프로그래밍 내부에서 표현하는데 한계가 있음.
- 불필요한 프로시저를 호출하거나 전역 변수를 수정할 수 있다. --> 프로그램 동작에 치명적인 영향을 줄 수 있음.
06-2 객체지향 프로그래밍
- 객체지향 프로그래밍의 4가지 특징 이해하기.
객체지향 프로그래밍 개념
- 객체지향 프로그래밍(object oriented programming, OOP): 객체라는 논리적인 개념으로 코드를 구성
- "사물을 객체로 인식하고 표현하는 것은 사람에게 매우 자연스럽고 이해하기 쉬운 방식"
- 이전의 패러다임은 모두 하향식(top-down) 방법이지만, 객체지향 프로그래밍은 논리적인 단위를 먼저 정의한 후에 이를 조합해 프로그램이 수행할 기능을 만드는 상향식(bottom-up) 방법이다.
- 객체지향 프로그래밍에서는 데이터(속성)와 함수(기능)을 가진 객체를 먼저 정의하고, 객체를 기초로 원하는 실행 흐름을 소스 코드로 작성.
- 상향식 == 레고
- has-a 관계: 동력장치 (내부: 가솔린 엔진, 가속페달, 동력 전달 장치(미션, 바퀴), 제동 장치(브레이크)) --> 이러한 포함 관계. 상호 교환 X
- is-a 관계: 엔진(가솔린 엔진, 디젤 엔진, 가스 엔진, 전기 엔진) --> 상호 교환 O, 하위 객체가 상위 객체를 대신할 수 있음. --> Generalization(일반화)라고 표현.
- is-a 관계에서는 상위 객체의 속성을 그대로 물려받아 새로운 객체의 특성을 추가하는 상속(inheritance)이 가능함. 상속은 07장에서 다룸.
- 상속: 엔진{ 내연기관 엔진(가솔린 엔진, 디젤 엔진, 가스 엔진), 전기 엔진}
객체 지향 프로그래밍의 특징
- 추상화 (abstraction)
- 캡슐화 (encapsulation)
- 상속성 (inheritance)
- 다형성 (polymorphism)
- 추상화 (abstraction)
- 현실 세계의 사물을 모델링하여 객체로 만들 때, 어떤 부류에서 불필요한 요소는 배제하고 공통된 특징만 추출하는 것.
- 캡슐화 (encapsulation)
- 복잡한 내부 기능을 묶어 외부에서 불필요한 정보를 감추는 것
- Ex) 객체 외부 시선 --> 가속 페달 --> 출력 조절(내연기관 엔진)
- 객체 내부 시선 --> 가속 페달 --> 출력 조절(출력 조절기 --> 피스톤)
- 상속성 (inheritance)
- 가솔린 엔진은 내연기관 엔진의 속성을 그대로 상속받아 가솔린 연료를 사용하는 특성
- 부모 객체의 특성을 이어받는 것을 상속
- 다형성 (polymorphism)
- 상속받은 객체는 부모 객체의 역할을 대신할 수 있음.
- Ex) 내연 기관 엔진이 사용되는 자리에 가솔린, 디젤, 가스 엔진을 사용할 수 있음.
- 완전히 똑같으면 대체할 이유가 없음. 상속받은 객체는 자신만의 특성을 반영하여 다르게 동작해야함.
- --> 이처럼 상속 관계의 객체에서 같은 기능(함수)이 다르게 동작하는 특성을 다형성이라고 함.
06-3 클래스와 인스턴스
- 클래스 개념 이해
- C++ 클래스와 인스턴스를 선언하는 문법 이해
클래스란?
- 객체와 클래스는 비슷함: 데이터와 함수를 포함하는 논리 단위
- 변수: 값을 저장할 수 있는 공간, 어떤 형식의 값이 저장되는지 데이터 형식으로 컴파일러에게 알려줌.
- 클래스는 데이터 형식, 객체는 변수
- 클래스는 객체가 포함하는 데이터와 함수를 정의하는 문법적인 요소.
- 객체는 특정 클래스를 사용할 수 있도록 만든 변수
- 클래스를 정의할 때는 객체가 가질 데이터와 함수를 작성
- 이때, 클래스가 포함하는 데이터를 '멤버 변수', 함수를 '멤버 함수'라고 함.
- 멤버 변수는 클래스의 속성을, 멤버 함수는 클래스의 행동을 나타냄.
- 생성자와 소멸자라는 특별함 함수도 포함할 수 있음
- 멤버 변수와 멤버 함수를 정의할 때는 public, private와 같은 접근 지정자가 필요함.
- 접근 지정자: 접근 범위를 통제 --> 캡슐화와 관련
클래스 정의 문법
- 클래스 선언부: 멤버 변수, 멤버 함수, 생성자, 소멸자
- 멤버 함수 정의부: 멤버 함수 정의
// 클래스 선언 키워드 + 클래스 이름 + 접근 지정자 + 부모 클래스(선택)
// (class) + (gs_engine) + (public) + (ic_engine)
// class 선언부
class gs_engine : public ic_engine {
public:
gs_engine(); // 생성자와
~gs_engine(); // 소멸자(선택)
int get_current_fuel() {return current_fuel;}; // 멤버 함수 선언과 구현
private:
void acceleration_output() override; // ""
void increasing_fuel() { increasing_piston_speed(); }; // ""
void increasing_psiton_speed() {}; // ""
int current_fuel; //멤버 변수 선언
int piston_speed; // ""
};
// ---
// 멤버 함수 정의부
// 멤버 함수 네임스페이스 -> gs_engine
void gs_engine::acceleration_output() {
increasing_fuel();
current_fuel++;
}
// --
- 클래스 선언부: 클래스 선언하는 곳, 멤버 함수 정의를 제외한 클래스와 관련된 모든 것들을 이곳에서 선언.
- 멤버 함수 정의부: 클래스에 선언한 멤버 함수를 정의.
- 클래스 선언 키워드: 클래스를 선언하는 class 키워드.
- 클래스 이름: 클래스를 나타내는 이름. 객체를 만들 때 사용하는 데이터 형식으로 볼 수 있음.
- 부모 클래스(선택): 클래스가 다른 클래스를 상속받을 때, 쌍점(:) 다음에 접근 지정자와 부모 클래스를 지정. 상속 받지 않으면 생략.
- 접근 지정자: 멤버 변수와 함수가 외부에서 접근할 수 있는지를 표시.
- 생성자와 소멸자(선택): 객체가 생성되거나 소멸할 때 호출되는 함수. 선택적으로 사용 가능
- 멤버 함수 선언과 정의: 객체에 포함할 멤버 함수를 선언. 간단한 함수는 클래스 선언부에서 중괄호{}를 이용해 정의하기도 함.
- 멤버 함수 네임스페이스: 멤버 함수 정의부에서는 해당 함수가 어떤 클래스에 속하는지 알 수 있도록 클래스 이름을 네임스페이스로 사용.
객체 선언
- 앞에서는 클래스 정의하는 방법을 알아봄.
- 정의한 클래스를 사용하려면 객체를 선언해야함.
- 클래스의 객체를 선언하는 방법은 데이터 형식으로 변수를 선언하는 것과 같음.
- 클래스의 객체를 선언하는 두가지 방법
- 클래스를 데이터 형식으로 삼고, 객체를 선언.
- new 키워드를 사용하여 동적으로 메모리를 할당. --> 이 경우 반드시 delete 키워드로 메모리를 해제 해야함.
// 클래스 정의
class engine {...(생략)...};
// 클래스를 데이터 형식처럼 사용하는 방법
engine my_engine;
// 클래스 형식으로 동적 메모리 할당과 해제 방법
engine *my_engine_pointer = new engine();
delete my_engine_pointer;
- 객체로 클래스의 멤버에 접근
my_engine.current_fuel; // 멤버 변수에 접근
my_engine.inceasing_piston_speed(); // 멤버 함수 호출
- adative_cruise_modeling.cpp 참고
※ 이 글은 직접 구매한『Do it! C++ 완전 정복』(문종채, 조규남 저, 성안당)을 참고하여 개인적으로 학습한 내용을 정리한 것입니다. 본문에 사용된 내용 및 예제 코드는 책의 내용을 기반으로 하되, 이해를 돕기 위한 개인적인 해석과 실습 결과를 포함하고 있습니다.
참고한 예제 코드: [GitHub - mystous/DoItCPP]([https://github.com/mystous/DoItCPP)](https://github.com/mystous/DoItCPP))
예제 코드의 일부는 위 오픈소스 저장소를 참고하거나 수정하여 활용했으며, 해당 저장소는 학습용으로 공개되어 있습니다.
'개발 언어 > C++' 카테고리의 다른 글
| [C++ 기초부터 심화까지 Chapter 05. 예외 처리 구문] (0) | 2025.05.07 |
|---|---|
| [C++ 기초부터 심화까지 Chapter 04. 실행 흐름 제어] (0) | 2025.05.07 |
| [C++ 기초부터 심화까지 Chapter 03. Pointer and memory] (2) | 2025.05.07 |
| C++ 공부에 관하여 (0) | 2025.05.07 |