💻 프로그래밍

Class

클래스

객체의 청사진. 속성(필드)과 행동(메서드) 정의. OOP의 기본 단위.

📖 상세 설명

Class(클래스)는 객체지향 프로그래밍(OOP)에서 객체를 생성하기 위한 설계도 또는 틀입니다. 실세계의 개념이나 사물을 코드로 모델링할 때, 클래스는 해당 객체가 가질 속성(데이터)과 행위(기능)를 정의합니다.

클래스는 속성(필드, 멤버 변수)과 메서드(멤버 함수)로 구성됩니다. 예를 들어 '자동차' 클래스는 색상, 속도, 연료량 같은 속성과 가속, 정지, 주유 같은 메서드를 가질 수 있으며, 이 설계도를 바탕으로 실제 자동차 객체(인스턴스)를 만들어냅니다.

클래스의 핵심 특징은 캡슐화, 상속, 다형성입니다. 캡슐화는 데이터와 기능을 하나로 묶고 외부 접근을 제한하며, 상속은 기존 클래스를 확장해 새 클래스를 만들고, 다형성은 같은 인터페이스로 다른 동작을 수행할 수 있게 합니다.

실무에서 클래스는 코드의 재사용성과 유지보수성을 높이는 핵심 도구입니다. Java, Python, C++, TypeScript 등 대부분의 현대 프로그래밍 언어가 클래스를 지원하며, AI/ML 분야에서도 모델, 데이터셋, 전처리 파이프라인 등을 클래스로 설계하여 체계적인 코드 구조를 만듭니다.

💻 코드 예제

# 1. 기본 클래스 정의
class Animal:
    """동물 클래스 - 기본 설계도"""

    # 클래스 변수 (모든 인스턴스가 공유)
    kingdom = "Animalia"

    # 생성자 메서드
    def __init__(self, name, age):
        # 인스턴스 변수 (각 객체마다 고유)
        self.name = name
        self.age = age
        self._health = 100  # protected 변수 (관례)

    # 인스턴스 메서드
    def speak(self):
        return "소리를 냅니다"

    def info(self):
        return f"{self.name}은(는) {self.age}살입니다."


# 2. 상속 (Inheritance)
class Dog(Animal):
    """개 클래스 - Animal을 상속받아 확장"""

    def __init__(self, name, age, breed):
        # 부모 클래스의 생성자 호출
        super().__init__(name, age)
        self.breed = breed

    # 메서드 오버라이딩 (다형성)
    def speak(self):
        return "멍멍!"

    # 새로운 메서드 추가
    def fetch(self, item):
        return f"{self.name}이(가) {item}을(를) 가져옵니다!"


class Cat(Animal):
    """고양이 클래스"""

    def speak(self):
        return "야옹~"

    def scratch(self):
        return f"{self.name}이(가) 긁습니다!"


# 3. 사용 예시
dog = Dog("바둑이", 3, "진돗개")
cat = Cat("나비", 2)

print(dog.info())       # 바둑이은(는) 3살입니다.
print(dog.speak())      # 멍멍!
print(dog.fetch("공"))  # 바둑이이(가) 공을(를) 가져옵니다!

print(cat.speak())      # 야옹~

# 다형성 활용
animals = [dog, cat]
for animal in animals:
    print(f"{animal.name}: {animal.speak()}")

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"결제 모듈을 Payment 클래스로 추상화하고, CreditCardPayment, BankTransfer 같은 구체 클래스가 상속받는 구조로 설계하면 새로운 결제 수단 추가가 쉬워집니다."
💬 면접에서
"클래스의 핵심은 캡슐화, 상속, 다형성입니다. 캡슐화로 내부 구현을 숨기고, 상속으로 코드를 재사용하며, 다형성으로 동일한 인터페이스에서 다른 동작을 구현합니다. SOLID 원칙에서 단일 책임 원칙을 지키면 클래스가 명확해집니다."
💬 코드 리뷰에서
"이 클래스가 너무 많은 일을 하고 있네요. 데이터 검증과 API 호출이 섞여 있는데, Validator 클래스와 ApiClient 클래스로 분리하면 테스트도 쉬워지고 유지보수도 편해집니다."

⚠️ 흔한 실수 & 주의사항

God Class(신 클래스) 안티패턴

하나의 클래스에 너무 많은 책임을 부여하면 유지보수가 어려워집니다. 단일 책임 원칙(SRP)을 지켜 클래스당 하나의 역할만 담당하도록 설계하세요.

과도한 상속 계층

상속이 3단계 이상 깊어지면 코드 이해가 어렵습니다. "상속보다 합성(Composition)"을 우선 고려하고, 필요할 때만 상속을 사용하세요.

접근 제어자 적절히 사용

public, private, protected를 적절히 사용해 캡슐화를 유지하세요. 내부 구현은 private으로 숨기고, 필요한 인터페이스만 public으로 노출합니다.

🔗 관련 용어

📚 더 배우기