[C++ 기초부터 심화까지 Chapter 06. 객체지향과 클래스]

2025. 5. 8. 00:30·개발 언어/C++

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장에서 다룸.
  • 상속: 엔진{ 내연기관 엔진(가솔린 엔진, 디젤 엔진, 가스 엔진), 전기 엔진}

객체 지향 프로그래밍의 특징

  1. 추상화 (abstraction)
  2. 캡슐화 (encapsulation)
  3. 상속성 (inheritance)
  4. 다형성 (polymorphism)

 

  1. 추상화 (abstraction)
  • 현실 세계의 사물을 모델링하여 객체로 만들 때, 어떤 부류에서 불필요한 요소는 배제하고 공통된 특징만 추출하는 것.
  1. 캡슐화 (encapsulation)
  • 복잡한 내부 기능을 묶어 외부에서 불필요한 정보를 감추는 것
  • Ex) 객체 외부 시선 --> 가속 페달 --> 출력 조절(내연기관 엔진)
  • 객체 내부 시선 --> 가속 페달 --> 출력 조절(출력 조절기 --> 피스톤)
  1. 상속성 (inheritance)
  • 가솔린 엔진은 내연기관 엔진의 속성을 그대로 상속받아 가솔린 연료를 사용하는 특성
  • 부모 객체의 특성을 이어받는 것을 상속
  1. 다형성 (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 키워드.
  • 클래스 이름: 클래스를 나타내는 이름. 객체를 만들 때 사용하는 데이터 형식으로 볼 수 있음.
  • 부모 클래스(선택): 클래스가 다른 클래스를 상속받을 때, 쌍점(:) 다음에 접근 지정자와 부모 클래스를 지정. 상속 받지 않으면 생략.
  • 접근 지정자: 멤버 변수와 함수가 외부에서 접근할 수 있는지를 표시.
  • 생성자와 소멸자(선택): 객체가 생성되거나 소멸할 때 호출되는 함수. 선택적으로 사용 가능
  • 멤버 함수 선언과 정의: 객체에 포함할 멤버 함수를 선언. 간단한 함수는 클래스 선언부에서 중괄호{}를 이용해 정의하기도 함.
  • 멤버 함수 네임스페이스: 멤버 함수 정의부에서는 해당 함수가 어떤 클래스에 속하는지 알 수 있도록 클래스 이름을 네임스페이스로 사용.

객체 선언

  • 앞에서는 클래스 정의하는 방법을 알아봄.
  • 정의한 클래스를 사용하려면 객체를 선언해야함.
  • 클래스의 객체를 선언하는 방법은 데이터 형식으로 변수를 선언하는 것과 같음.
  • 클래스의 객체를 선언하는 두가지 방법
  1. 클래스를 데이터 형식으로 삼고, 객체를 선언.
  2. 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
'개발 언어/C++' 카테고리의 다른 글
  • [C++ 기초부터 심화까지 Chapter 05. 예외 처리 구문]
  • [C++ 기초부터 심화까지 Chapter 04. 실행 흐름 제어]
  • [C++ 기초부터 심화까지 Chapter 03. Pointer and memory]
  • C++ 공부에 관하여
lidarmansiwon
lidarmansiwon
lidarmansiwon 님의 블로그 입니다.
  • lidarmansiwon
    라이다맨 시원의 연구개발 라이프
    lidarmansiwon
  • 전체
    오늘
    어제
    • 분류 전체보기 (12)
      • 이론 정리 (2)
        • Thor I. Fossen 리뷰 (1)
      • Ubuntu 및 Linux (0)
        • Trouble shooting (0)
      • 개발 언어 (5)
        • C++ (5)
        • Python (0)
      • 논문 리뷰 (3)
      • ROS2 (2)
  • 블로그 메뉴

    • Github
    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    maritimerobotics
    c++ 기초부터 심화까지
    singlethreadedexecutor
    Sliding mode control
    C++
    cpp
    해양공학
    usv formation path planning based on behavior trees and fast marching method
    usv formation
    navigationcontrol
    multithreadedexecutor
    marinecraft
    fossen
    자율선박
    슬라이딩 모드 컨트롤
    motioncontrol
    이접안
    ROS2
    do it! c++ 완전 정복
    실행 흐름 제어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
lidarmansiwon
[C++ 기초부터 심화까지 Chapter 06. 객체지향과 클래스]
상단으로

티스토리툴바