객체지향 프로그래밍(OOP) 핵심 개념 총정리

STEP 1 . OOP 등장배경

OOP 등장 배경

프로그램 규모가 커지면서 코드 관리와 유지보수가 어려워졌고 이를 해결하기 위해 객체 단위로 프로그램을 관리하는 OOP(객체지향 프로그래밍)가 등장했다.

기존 절차지향 방식의 한계

  • 코드 재사용 어려움
  • 유지보수 어려움
  • 데이터 관리 문제

핵심 정리

  • 절차지향 → 순서 중심 프로그래밍
  • 객체지향 → 객체 중심 프로그래밍
  • OOP는 유지보수와 재사용성을 높이기 위해 등장

-정보 은닉이 필요한 이유

중요한 데이터를 외부에서 직접 수정하지 못하게 하기 위해 사용한다.

예시:

  • 은행 계좌 정보
  • 비밀번호
  • 게임 캐릭터 체력

캡슐화(Encapsulation)

캡슐화는 데이터(변수)와 기능(함수)을 하나로 묶고 외부에서 직접 접근하지 못하게 보호하는 객체지향 특징 중 하나이다.

캡슐화를 사용하는 이유

  • 데이터 보호
  • 잘못된 수정 방지
  • 안정성 향상

예제 코드

class Character:

    def __init__(self):
        self.__hp = 100

    def show_hp(self):
        print("현재 체력:", self.__hp)


player = Character()
player.show_hp()

실행 결과

현재 체력: 100

STEP 2 . 클래스와 추상화

클래스(Class)란?

클래스는 객체를 만들기 위한 설계도이다. 객체가 가져야 하는 변수(데이터)와 함수(기능)를 하나로 묶어서 정의한다.

예시

  • 이름
  • 체력
  • 공격 기능

예제 코드

class Warrior:

    def attack(self):
        print("검으로 공격!")

객체(Object)란?

객체는 클래스를 기반으로 실제 생성된 것이다.

예제 코드

class Warrior:

    def attack(self):
        print("검으로 공격!")

player1 = Warrior()

player1.attack()

실행 결과

검으로 공격!
  • Warrior → 클래스(설계도)
  • player1 → 객체(실제 생성된 캐릭터)

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

객체지향 프로그래밍은 프로그램을 객체 단위로 나누어 구성하는 방식이다.

관련된 데이터와 기능을 하나의 객체 안에 묶어 관리하기 때문에 유지보수가 쉽고 코드 재사용이 편하다.


추상화(Abstraction)

추상화는 필요한 기능만 보여주고 복잡한 내부 구조는 숨기는 것이다.

예를 들어 자동차를 운전할 때:

  • 핸들
  • 브레이크
  • 엑셀

만 사용하면 되고 엔진 구조는 몰라도 된다.

예제 코드

class CoffeeMachine:

    def make_coffee(self):
        print("커피가 나옵니다.")

machine = CoffeeMachine()
machine.make_coffee()

실행 결과

커피가 나옵니다.

현실대상을 클래스로 변환 개념

1. 디지털화

현실의 정보를 컴퓨터 안에서 사용할 수 있도록 데이터로 변환한다.

현실 정보 디지털화
이름 문자열(String)
나이 숫자(int)

예제 코드

name = "민수"
age = 20

2. 코드화

class Student:

    def __init__(self, name, age):
        self.name = name
        self.age = age

3. 추상화

현실의 모든 정보를 다 만드는 것이 아니라 필요한 핵심 기능만 표현하는 것이다.

예제 코드

class Car:

    def start(self):
        print("시동 켜기")

    def move(self):
        print("자동차 이동")

self 개념

self는 현재 생성된 객체 자기 자신을 의미한다.

"현재 이 객체"

객체마다 서로 다른 데이터를 저장하기 위해 사용한다.


생성자(Constructor)

생성자는 객체가 생성될 때 자동으로 실행되는 함수이다.

예제 코드

class Character:

    def __init__(self, name):
        self.name = name


player = Character("전사")

__init__() 메서드를 사용한다.


super 개념

super()는 부모 클래스의 기능을 가져와 사용하는 함수이다.

예제 코드

class Animal:

    def __init__(self):
        print("동물 생성")


class Dog(Animal):

    def __init__(self):
        super().__init__()
        print("강아지 생성")


dog = Dog()

실행 결과

동물 생성
강아지 생성

얕은 복사(Shallow Copy)

겉 객체만 복사하고 내부 데이터는 공유하는 방식이다.

예제 코드

import copy

a = [[1, 2], [3, 4]]

b = copy.copy(a)

b[0][0] = 100

print(a)
print(b)

실행 결과

[[100, 2], [3, 4]]
[[100, 2], [3, 4]]

깊은 복사(Deep Copy)

내부 객체까지 전부 새롭게 복사하는 방식이다.

예제 코드

import copy

a = [[1, 2], [3, 4]]

b = copy.deepcopy(a)

b[0][0] = 100

print(a)
print(b)

실행 결과

[[1, 2], [3, 4]]
[[100, 2], [3, 4]]

STEP 3 . 다형성과 일반화

상속(Inheritance)

기존 클래스의 기능을 새로운 클래스가 물려받는 개념이다.

예제 코드

class Animal:

    def eat(self):
        print("먹이를 먹는다")


class Dog(Animal):

    def bark(self):
        print("멍멍!")


dog = Dog()

dog.eat()
dog.bark()

실행 결과

먹이를 먹는다
멍멍!

다형성(Polymorphism)

같은 이름의 함수라도 객체에 따라 다르게 동작하는 개념이다.

예제 코드

class Cat:
    def sound(self):
        print("야옹")

class Dog:
    def sound(self):
        print("멍멍")

animals = [Cat(), Dog()]

for animal in animals:
    animal.sound()

실행 결과

야옹
멍멍

일반화(Generalization)

여러 클래스의 공통 특징을 하나의 상위 클래스로 묶는 개념이다.

예제 코드

class Animal:

    def move(self):
        print("움직인다")


class Dog(Animal):
    pass


class Cat(Animal):
    pass

최종 핵심 정리

개념 설명
클래스 객체를 만들기 위한 설계도
객체 클래스를 기반으로 실제 생성된 것
객체지향 프로그래밍 객체 단위로 프로그램을 구성하는 방식
추상화 필요한 기능만 보여주고 내부는 숨김
캡슐화 데이터 보호 및 기능 묶기
상속 부모 클래스 기능 물려받기
다형성 같은 기능이 객체마다 다르게 동작
일반화 공통 특징을 상위 클래스로 묶는 것
self 현재 객체 자기 자신
super() 부모 클래스 기능 호출
얕은 복사 내부 객체 공유
깊은 복사 내부 객체까지 새롭게 복사

'개발일지 > python' 카테고리의 다른 글

Model/View 로그인 구조 구현 정리  (0) 2026.06.01
Model/View  (0) 2026.05.29
[Python] QScrollArea  (0) 2026.05.27
[Python] PySide6 QTabWidget 실습 / 파일 분리  (0) 2026.05.22
[숙제] 상속 예제 정리  (0) 2026.05.17