class.py

Jaehyeok·2026년 1월 30일

py.TIL

목록 보기
5/12
post-thumbnail

지금까지의 프로그래밍은 함수(절차);동작 중심이었다. 하지만, 세상은 객체 중심이다. 객체 중심의 프로그래밍은 클래스(class)를 통해 구현할 수 있다.

Person 클래스(class) 안에 다음의 '틀'을 정의 # 클래스의 이름은 관례상 대문자
    - 이름 : 이름 정보 담는 '속성' # '속성'을 변수로 선언
    - 집주소 : 주소 정보 담는 '속성'
    - goHome() : 집으로 가는 '동작' 수행 # '동작'은 함수로 선언 → '메소드(method)'

사람 객체(object) 생성
lee = Person("이길자", "논현동 188") # 이름, 집주소 등에 대한 정보가 객체에 담김 → '인스턴스(instance)'

lee.goHome() # 객체 사용

🟩 클래스 정의 & 인스턴스 생성

클래스의 정의는 새로운 '타입'을 정의하는 것이다.

class Cookie:
	pass

a = Cookie()
type(a)
→ __main__.Cookie # Cookie type

클래스가 가져야 하는 변수를 객체 변수(instance variable)라 하고 객체가 생성될 때 자동으로 호출되는 특별한 메소드를 생성자(constructor)라고 한다.
※ 생성자는 주로 객체 변수를 정의하고 초기화하는 역할을 수행 ※

# 사각형 클래스를 정의
class Rectangle:
	def __init__(self): # 생성자: 기본적으로 첫번째 매개변수가 self이다.
		print('Rectangle() 객체 생성, 생성자 호출')
        self.width = 0 # 객체 변수: width 선언, 초깃값: 0
    	self.height = 0 # 객체 변수: height 선언, 초깃값: 0

r1 = Rectangle() # 인스턴스
→ Rectangle() 객체 생성, 생성자 호출

r1.width
→ 0

r2.height
→ 0

r1.width, r1.height = 100, 200
print(r1.width, r1.height)100, 200

인스턴스의 동작은 객체 메소드(함수)로 정의하여 수행한다.

class Rectangle:
  def __init__(self):
    print("Rectangle() 생성자 생성")
    self.width = 0
    self.height = 0

  # 사각형의 넓이 구하기
  def get_area(self):
    area = self.width * self.height
    return area

  # 사각형의 둘레 구하기
  def get_perimeter(self):
    return 2 * (self.width + self.height)

r1 = Rectangle()
r1.height, r1.width = 10, 20

r1.get_area()200

r1.get_perimeter()60

매개변수 self
객체 자기 자신을 참조하는 함수이다.

r1.get_area → Rectangle.get_area(r1) # 이와 같이 동작

생성자 매개변수
객체가 생성될 때 초기 설정에 사용되는 변수이다.

class Rectangle:
  def __init__(self, width = 1, height = 1): # 생성자 매개변수 설정;디폴트값 설정
    print(f"Rectangle({width}, {height}) 생성자 생성")
    self.width = width 
    self.height = height
    
  # 사각형의 넓이 구하기
  def get_area(self):
    area = self.width * self.height
    return area

  # 사각형의 둘레 구하기
  def get_perimeter(self):
    return 2 * (self.width + self.height)

  # 매개변수가 있는 매소드
  def set_size(self, w, h):
    self.width = w
    self.height = h

r1 = Rectangle(30, 20)
→ Rectangle(30, 20) 생성자 생성
r2 = Rectangle()
→ Rectangle(1, 1) 생성자 생성

r1.set_size(100, 500)
r1.get_area()50000
r2.get_perimeter
→ 1200

is 연산자를 통해 특정 갹채(인스턴스)가 주어진 타입의 객체인지 확인할 수 있다.

type(r1) is Rectangle
→ True

클래스 변수 vs. 인스턴스 변수
클래스 변수는 모든 인스턴스가 공유하는 값이고, 인스턴스 변수는 각 객체마다 독립적으로 저장되는 값이다.

class Account:
  num_accounts = 0  # 클래스 변수

  def __init__(self, name):
    print(f"Account({name}) 생성")
    self.name = name   # 인스턴스 변수.
    Account.num_accounts += 1

acc1 = Account('회사')
acc2 = Account('개인')

Account.num_account
→ 2

🟩 상속(inheritance)

기존의 클래스를 상속받아 새로운 클래스 정의 가능하다.
※ 상속받아 만들어진 클래스는 기존의 클래스의 메소드, 객체변수를 그대로 가짐 ※

class 새 클래스명(기존의 클래스명):
class 새 클래스명(기존 클래스1, 기존 클래스2,):  # 다중상속 허용

기존의 코드를 다시 재작성할 필요 없이, 새로이 변경 추가 되는 코드에만 집중할 수 있기 때문에 생산성이 향상된다.

새로운 객체변수와 메소드 추가할 수 있고, 상속받은 메소드를 재정의하는 것이 가능하다(오버라이딩).

class BasicTV:
  def __init__(self):
    self.power = False  # 전원
    self.channel = 0    # 채널
    self.volume = 0     # 볼륨

  def display_info(self):
    print("전원:", self.power)
    print("채널:", self.channel)
    print("볼륨:", self.volume)

class SmartTV(BasicTV):
  def __init__(self):
    super().__init__()   # super().: 부모클래스(기존 클래스)의 생성자 호출
    self.IP = "192.168.0.1"  # 자식클래스(새 클래스)에서 추가된 속성

  def display_info(self):
    super().display_info()  # 부모클래스의 메소드 먼저 호출
    print("IP:", self.IP)

tv = SmartTV()
tv.display_info()'전원:' False
  '채널:' 0
  '볼륨:' 0
  'IP:' 192.168.0.1

0개의 댓글