TIL (Today I Learned) - 클래스와 메서드 


값 비교

  1. == (값 비교): 두 리스트의 값이 동일한지를 확인합니다.
    • 리스트 안의 값이 같으면 True.
    • 예를 들어, [1, 2, 3]과 [1, 2, 3]은 값이 동일하므로 True.
  2. is (참조 비교): 두 변수가 같은 메모리 주소를 참조하고 있는지 확인합니다.
    • 같은 객체를 참조하고 있으면 True.
    • 예를 들어, list_02 = list_01로 복사했을 때 두 변수는 같은 메모리를 가리키므로 is는 True.
list_01 = [1, 2, 3]
list_02 = list_01

# 값 비교
print(list_01 == list_02)  # True: 두 리스트의 값이 동일

# 메모리 참조 비교
print(list_01 is list_02)  # True: 같은 객체를 참조

클래스와 인스턴스

  • 클래스(Class): 특정 객체를 만들기 위한 설계도.
  • 인스턴스(Instance): 클래스를 기반으로 생성된 구체적인 객체.
    • 예: class Person -> p1 = Person()로 객체 생성.

클래스 변수와 인스턴스 변수

  1. 클래스 변수
    • 클래스 내에서 선언된 변수로, 모든 인스턴스가 공유.
    • 클래스명으로 접근하거나 수정 가능.
  2. 인스턴스 변수
    • 인스턴스마다 독립적으로 가지고 있는 변수.
    • 생성자 메서드(__init__)에서 self.<name> 형태로 정의.
class Person:
    blood_color = 'red'  # 클래스 변수

    def __init__(self, name):
        self.name = name  # 인스턴스 변수

p1 = Person('우재')  # 인스턴스 생성
print(p1.name)         # '우재': 인스턴스 변수를 직접 출력
print(p1.blood_color)  # 'red': 클래스 변수가 인스턴스를 통해 참조 가능
  • 클래스와 인스턴스 변수 접근 흐름
    1. 인스턴스에서 접근: 인스턴스 변수 탐색 → 없으면 클래스 변수 탐색.
    2. 클래스에서 접근: 클래스 변수만 직접 접근 가능.

클래스 변수와 공유 특성

클래스 변수는 모든 인스턴스가 공유합니다. 따라서 클래스 변수의 값을 변경하면, 모든 인스턴스에서 공유된 값이 반영됩니다.

class Circle:
    pi = 3.14  # 클래스 변수

    def __init__(self, r):
        self.r = r  # 인스턴스 변수

    def area(self):
        return self.pi * self.r * self.r  # 클래스 변수 사용

c1 = Circle(10)
print(c1.area())  # 314.0: 클래스 변수 pi를 참조

Circle.pi = 5  # 클래스 변수 변경
print(Circle.pi)  # 5
print(c1.pi)      # 5: 변경된 클래스 변수 값이 반영

클래스 변수와 인스턴스 변수의 혼용

클래스 변수는 여러 인스턴스 간 데이터를 공유할 때 유용합니다. 반면, 인스턴스 변수는 각 객체마다 독립적인 데이터를 저장합니다.

class User:
    count = 0  # 클래스 변수

    def __init__(self, name):
        self.name = name  # 인스턴스 변수
        User.count += 1   # 클래스 변수 증가

p1 = User('Aiden')
p2 = User('Haley')

print(User.count)  # 2: 모든 인스턴스가 클래스 변수를 공유
print(p1.count)    # 2
print(p2.count)    # 2

메서드 종류

  1. 인스턴스 메서드
    • self를 통해 인스턴스에 접근 가능.
    • 인스턴스 속성을 할당하거나 사용할 때 활용.
class Person:
    def talk(self):  # 인스턴스 메서드
        print('안녕')

    def eat(self, food):  # 인스턴스 메서드
        print(f'{food} 냠냠')

p1 = Person()
p1.talk()         # '안녕'
p1.eat('피자')    # '피자 냠냠'
p1.eat('황올')    # '황올 냠냠'

종합 코드 분석

  • 클래스와 인스턴스의 기본 원리.
  • 클래스 변수와 인스턴스 변수의 차이점.
  • 인스턴스 메서드를 통한 객체 조작.
class Circle:
    pi = 3.14  # 클래스 변수

    def __init__(self, r):
        self.r = r  # 인스턴스 변수

    def area(self):  # 인스턴스 메서드
        return self.pi * self.r * self.r

# Circle 클래스 인스턴스 생성
c1 = Circle(10)

# 메서드 호출을 통해 결과 확인
print(c1.area())  # 314.0

# 클래스 변수 수정 후, 모든 인스턴스에서 반영됨
Circle.pi = 5
print(Circle.pi)  # 5
print(c1.pi)      # 5

정리

  1. 클래스와 인스턴스의 역할과 속성을 명확히 이해.
  2. 클래스 변수는 데이터 공유, 인스턴스 변수는 독립적 데이터에 활용.
  3. 메서드의 종류와 역할 (특히 인스턴스 메서드)을 정확히 익힘.
  4. 객체지향 프로그래밍의 핵심 원리를 구체적으로 학습함.

다음 목표

  • 클래스 메서드(@classmethod)와 정적 메서드(@staticmethod)를 학습하고 활용법을 익힐 예정.
  • 객체지향 설계 패턴에 대한 이해를 심화.

+ Recent posts