241001 TIL 클래스와 객체, OOP의 핵심 개념, 클래스 메서드와 정적 메서드

윤수용·2024년 10월 1일
0

TIL

목록 보기
22/89

클래스와 객체의 개념

1. 클래스(Class)

  • 객체(Object)를 만들기 위한 설계도
  • 속성(Attributes)과 메서드(Methods)로 구성
  • 속성: 클래스에 정의된 변수. 객체의 상태나 특징을 나타냄
  • 메서드: 클래스에 정의된 함수. 객체가 수행할 수 있는 행동을 나타냄

2. 객체(Object)

  • 클래스로부터 실제로 생성된 구체적인 데이터와 기능을 갖는 실체(Instance)
  • 객체는 클래스에 정의된 속성과 메서드를 가짐
class footballer:  # 클래스 정의
	def __init__(self, name):  # 초기화 메서드
		self.name = name  # 속성 정의

	def introduce(self):  # 메서드 정의
		return f"{self.name} is a legend player in Korea."

ji = footballer("Jisung_Park")  # 객체 생성
son = footballer("Heungmin_Son")  # 객체 생성

print(ji.introduce())  # Jisung_Park is a legend player in Korea.

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

1. 캡슐화(Encapsulation)

  • 객체의 속성과 메서드를 외부에서 직접 접근하지 못하도록 보호하는 개념
  • 객체 내부의 데이터 변경을 제한하고, 안전하게 다룰 수 있음
  • 보통 private, protected 접근 제어자를 사용해 구현
class Person:
    def __init__(self, name, age):
        self.name = name  # public attribute
        self.__age = age  # private attribute. __로 속성을 숨김 (캡슐화)
    
    def get_age(self):  # private attribute 접근을 위한 메서드
        return self.__age
    
    def set_age(self, age):
        if age > 0:
            self.__age = age

# 객체 생성
p = Person("Alice", 30)
print(p.name)       # public 속성 접근 가능
print(p.get_age())  # private 속성은 메서드를 통해 접근

2. 상속(Inheritance)

  • 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받아 사용하는 개념
  • 코드 재사용성을 높이고, 계층적인 관계(부모 클래스, 자식 클래스)를 표현
  • 자식 클래스는 부모 클래스의 기능을 확장하거나 수정 가능
class Animal:
    def sound(self):
        print("Some generic sound")

class Dog(Animal):  # Animal 클래스를 상속
    def sound(self):  # 메서드 오버라이딩 (Method Overriding)
        print("Bark")

# 객체 생성 및 메서드 호출
dog = Dog()
dog.sound()  # Dog 클래스에서 재정의된 메서드 호출

3. 다형성(Polymorphism)

  • 같은 메서드가 다른 객체에서 다르게 동작할 수 있는 특성을 의미
  • 하나의 인터페이스나 부모 클래스를 통해 다양한 객체를 처리 가능
  • 메서드 오버라이팅과 인터페이스 구현을 통해 다형성을 달성
class Bird:
    def fly(self):
        print("Bird is flying")

class Airplane:
    def fly(self):
        print("Airplane is flying")

def let_fly(obj):  # 다형성을 사용하는 함수
    obj.fly()

# 객체 생성 및 다형성 적용
bird = Bird()
airplane = Airplane()

let_fly(bird)      # Bird의 fly() 호출
let_fly(airplane)  # Airplane의 fly() 호출

4. 추상화(Abstraction)

  • 불필요한 세부 사항을 숨기고, 객체의 중요한 특징만을 노출하는 개념
  • 복잡한 시스템을 단순하게 표현하고, 사용자에게 필요한 부분만 제공 가능
  • 추상 클래스와 인터페이스를 통해 구현
from abc import ABC, abstractmethod

class Vehicle(ABC):  # 추상 클래스
    @abstractmethod
    def start_engine(self):
        pass

class Car(Vehicle):  # 추상 클래스 구현
    def start_engine(self):
        print("Car engine started")

class Motorcycle(Vehicle):  # 또 다른 구현 클래스
    def start_engine(self):
        print("Motorcycle engine started")

# 객체 생성 및 메서드 호출
car = Car()
motorcycle = Motorcycle()

car.start_engine()
motorcycle.start_engine()

클래스 메서드와 정적 메서드

1. 클래스 메서드(Class method)

  • 클래스 자체에 속하는 메서드로, 객체가 아닌 클래스에서 호출 가능
  • 첫 번째 인자로 cls를 받아 클래스 자체에 접근. 클래스 변수를 수정하거나 사용할 때 사용
  • @classmethod 데코레이터로 정의
class MyClass:
    class_variable = 0
    
    @classmethod
    def increment_class_variable(cls):
        cls.class_variable += 1
        return cls.class_variable

# 클래스 메서드 호출
print(MyClass.increment_class_variable())  # 출력: 1

2. 정적 메서드(Static Method)

  • 클래스나 인스턴스와 관계없는 기능을 수행하는 메서드
  • 첫 번째 인자로 selfcls를 받지 않으며, 상태를 변경하지 않는 유틸리티 함수처럼 사용
  • @staticmethod 데코레이터로 정의
class MyClass:
    
    @staticmethod
    def add(a, b):
        return a + b

# 정적 메서드 호출
print(MyClass.add(5, 10))  # 출력: 15
profile
잘 먹고 잘 살자

0개의 댓글