250724 [ Day 14 ] - Python (11)

TaeHyun·2025년 7월 24일

TIL

목록 보기
14/182

시작하며

오늘은 클래스에 대해 자세히 배웠다.
처음 설명을 들었을 때는 모든 내용이 새롭고 개념도 복잡하게 느껴져 잘 따라갈 수 있을지 걱정됐지만, 막상 실습을 통해 직접 사용해보니 정리했던 개념과 코드가 잘 맞아떨어져 의외로 쉽게 적응했다.

클래스 (Class)

OOP (Object - Oriented Programming) 객체 지향 프로그래밍

  • OOP : 객체를 기반으로 프로그램을 설계하는 프로그래밍 패러다임

  • 객체 (Object) or 인스턴스 : 데이터와 기능을 하나로 묶은 독립적인 실행 단위

OOP 이전에는 절차적 프로그래밍이 널리 사용되었음
프로그램을 순차적인 절차와 함수로 구성하는 방식으로 코드가 복잡해지고 유지보수가 어려움

  • OOP의 핵심 개념
  1. 캡슐화 : 객체 내부 데이터를 외부에서 직접 접근하지 못하도록 보호
  2. 상속 : 기존 클래스를 확장하여 새로운 기능을 추가
  3. 다형성 : 같은 함수를 서로 다른 방식으로 실행 가능
  4. 추상화 : 필요한 정보만 보여주고, 복잡한 내부 구현은 숨김

  • OOP가 중요한 이유
  1. 코드 재사용성 증가
  2. 유지보수 및 확장 용이
  3. 현실 세계 모델링 가능

클래스 기본 문법

  • 클래스 : 데이터와 기능을 하나로 묶는 구조
  • 클래스 이름은 파스칼 케이스로 자주 사용
  • 생성자 (Constructor) : __init_ 으로 사용하며, 인스턴스가 생성될 때 호출
    • 인스턴스 변수를 초기화, 기본 상태 설정
    • 하나의 클래스에서 하나만 정의 가능
class ClassName:
    def __init__(self, name):
        # 인스턴스 변수
        # self : 인스턴스 자기 자신을 가리킴
        self.name = name

    # (인스턴스) 메서드
    def method_name(self):
        print(self.name)

# 인스턴스의 생성
my_instance = ClassName("내 인스턴스")
my_instance.method_name()
# 내 인스턴스

another_instance = ClassName("다른 인스턴스")
another_instance.method_name()
# 다른 인스턴스

클래스 변수와 메서드

클래스 변수

  • 클래스가 가지고 있는 변수
  • 모든 인스턴스가 공유할 수 있음
class Dog:
    # 클래스 변수
    kind = "강아지"
    
    def __init__(self, species, name, age):
        self.species = species
        self.name = name
        self.age = age

dog1 = Dog("포메라니안", "리치", 12)
dog2 = Dog("비숑", "구름", 10)

print("인1", dog1.kind)
print("인2", dog2.kind)
print("클래스", Dog.kind)
# 인1 강아지
# 인2 강아지
# 클래스 강아지

클래스 메서드

  • 클래스 자체를 대상으로 동작하는 메서드
  • 클래스의 데이터를 조작하는데 사용
  • 클래스 메서드를 호출할 때는 @classmethod 라는 데코레이터 필요
class Book:
    book_count = 0

    def __init__(self, title, author):
        Book.book_count += 1
        self.title = title
        self.author = author

    @classmethod # 데코레이터
    def get_count(cls):
        print(f"현재 {cls.book_count}권의 책을 가지고 계십니다.")

book1 = Book("제목1", "작가1")
book2 = Book("제목2", "작가2")

Book.get_count()
# 현재 2권의 책을 가지고 계십니다.

정적 메서드

  • 클래스나 인스턴스의 데이터를 조작하지 않는 클래스 함수
  • 클래스나 인스턴스의 상태에 의존하지 않는 일반 함수 ↔ 동적 메서드 (반대로 클래스나 인스턴스 상태에 의존)
  • 개념적으로는 클래스와 연관이 있으나, 클래스나 인스턴스의 데이터를 조작하지 않는 함수를 정의
  • @staticmethod 데코레이터 필요
class OperationTool:
    @staticmethod # 데코레이터
    def add(a, b):
        return a + b

OperationTool.add(10,20)

접근 제어와 정보 은닉

정보 은닉과 캡슐화

  • 정보 은닉
    • 객체의 내부 데이터를 외부에서 직접 접근하지 못하도록 막고, 공개된 메서드를 통해서만 접근하도록 제한
    • 데이터 무결성 보호

  • 캡슐화
    • 객체가 자신의 속성과 메서드를 하나로 묶고, 외부에는 필요한 부분만 공개

파이썬의 접근 수준 구분

  • public (공개) : 어디서나 접근 가능
  • protected (보호) : 클래스 내부 및 자식 클래스에서 사용 권장 (접근 하려면 접근 가능)
  • private (비공개) : 클래스 외부 접근 금지 (네임 맹글링 적용)
class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age
    # getter    
    def get_age(self):
        return self.__age
    # setter
    def add_age(self):
        self.__age += 1

p1 = Person("taehyun", 27)
p1.name = "태현"
p1.name
# '태현'

# 외부에서 private 요소에 접근 시도
p1.__age # 접근시 에러 발생
# 실제로는 내부적으로 네임 맹글링이 이루어져 접근할 수 있지만 권장 X
p1._Person__age # 네임 맹글링, 사용 권장 X

# private 요소를 접근하고 싶으면 getter, setter 를 사용해서 접근
p1.get_age()
p1.add_age()
p1.get_age()

마치며

실습이나 문제를 풀다 보면 점점 작성하는 코드의 양이 많아지고 있다.
그 과정에서 코드 하나하나의 의도와 동작 원리를 이해하며 작성하는 내 모습을 보며, 작은 성취감을 느꼈다.
그러면서도 더 열심히 공부해서 복잡한 알고리즘도 수월하게 해결할 수 있을 정도의 실력을 갖추고 싶다는 생각이 들어, 앞으로도 꾸준히 학습하고 문제를 많이 풀어봐야겠다고 다짐했다.

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글