C++/Chapter4. 클래스와 객체

lullaby ·2026년 1월 6일

C++

목록 보기
4/4

1. 객체 지향 프로그래밍 (OOP)

절차지향 vs 객체지향

절차지향 프로그래밍

  • 함수 중심의 프로그래밍
  • 데이터와 기능이 분리
  • 프로그램 = 함수들의 집합

객체지향 프로그래밍

  • 클래스(설계도)를 사용
  • 데이터와 기능이 하나로 묶임
  • 객체 간 메시지 전달 방식
  • 재사용성 향상 (정보은닉, 상속, 다형성, 캡슐화)

객체의 구성요소

  • 상태(state): 객체의 속성 → 멤버 변수
  • 동작(behavior): 객체가 취할 수 있는 동작 → 멤버 함수

2. 클래스 작성 문법

기본 구조

class 클래스명 {
접근지정자:
    멤버변수;
    멤버함수();
};

접근 지정자

지정자접근 범위
private클래스 내부에서만 접근 가능
protected클래스 내부 + 상속된 클래스에서 접근 가능
public어디서나 접근 가능

3. 핵심 문법 예제

예제 1: 기본 클래스 작성

#include <iostream>
#include <string>
using namespace std;

class Circle {
public:
    int radius;
    string color;

    double calcArea() {
        return 3.14159 * radius * radius;
    }
};

int main() {
    Circle obj;
    obj.radius = 100;
    obj.color = "blue";
    cout << "원의 면적은 " << obj.calcArea() << "입니다." << endl;
    return 0;
}

예제 2: 여러 객체 생성

int main() {
    Circle pizza1, pizza2;

    pizza1.radius = 100;
    pizza1.color = "yellow";
    cout << "피자1의 면적=" << pizza1.calcArea() << "\n";

    pizza2.radius = 200;
    pizza2.color = "white";
    cout << "피자2의 면적=" << pizza2.calcArea() << "\n";

    return 0;
}

중요: 각 객체의 멤버 변수 값은 독립적으로 관리됨!

예제 3: 함수 오버로딩

class PrintData {
public:
    void print(int i) { cout << i << endl; }
    void print(double f) { cout << f << endl; }
    void print(string s = "No Data!") { cout << s << endl; }
};

int main() {
    PrintData obj;
    obj.print(1);           // int 버전 호출
    obj.print(3.14);        // double 버전 호출
    obj.print("C++14");     // string 버전 호출
    obj.print();            // 기본값 사용
    return 0;
}

4. 클래스 선언과 정의 분리

car.h (헤더 파일)

#include <iostream>
#include <string>
using namespace std;

class Car {
    int speed;
    int gear;
    string color;
public:
    int getSpeed();
    void setSpeed(int s);
};

car.cpp (구현 파일)

#include "car.h"

int Car::getSpeed() {
    return speed;
}

void Car::setSpeed(int s) {
    speed = s;
}

main.cpp (사용 파일)

#include "car.h"

int main() {
    Car myCar;
    myCar.setSpeed(80);
    cout << "현재 속도는 " << myCar.getSpeed() << endl;
    return 0;
}

분리의 장점

컴파일 시간 단축: 헤더가 변경되지 않으면 재컴파일 불필요

정보 은닉: 구현 세부사항을 .cpp에 숨김

코드 재사용: .h와 .cpp만 공유하면 됨


5. 이름 공간 (namespace)

// 방법 1: 매번 std:: 사용
std::cout << "Hello" << std::endl;

// 방법 2: using namespace std 선언
using namespace std;
cout << "Hello" << endl;

// 방법 3: 특정 항목만 사용
using std::cout;
using std::endl;

목적: 식별자의 충돌 방지, 논리적 그룹화


6. 객체지향 4대 개념

개념설명
캡슐화데이터와 함수를 하나로 묶음
정보은닉private으로 내부 구현 숨김
상속기존 클래스의 특성을 물려받음
다형성같은 함수명이 객체마다 다르게 동작

0개의 댓글