본문 바로가기

공부 일지 #9 | Python Class 기초 정리

@studying:)2025. 7. 25. 17:17

학습 날짜: 2025.07.24 ~ 2025.07.25


🟦 Python Class 기초 정리

 

1. 프로그램 개발 방식

  • 순차 지향 프로그래밍(Sequential Flow): 시간의 흐름에 따라 명령어를 나열. 데이터보다는 작성하는 흐름이 중요.
  • 객체 지향 프로그래밍(OOP, Object-Oriented Programming): 데이터 중심 방식.  
      - 장점: 유지보수가 쉬움, 코드 재사용
      - 단점: 설계가 어려움 (전체 구조를 미리 구상해야 함)  
      - 대규모 시스템 개발 시 주로 사용

 

2. Class 핵심 개념

  • class: 설계도, 틀 (거푸집)
  • object: 클래스 설계도를 바탕으로 실체화된 것

    * component: 독립적이고 재사용 가능한 모듈. 기능 단위 클래스는 컴포넌트로 간주 가능

x = list()
print(type(x))  # <class 'list'>
  • <class 'list'> : list class에서 생성된 object 라는 의미
    • class list에는 member variable을 넣을 수 있는 공간이 있고, append(), pop() 등 member function이 있음
    • 객체를 생성하는 생성자라는 것을 필수로 갖음 ex) list()
    • 객체는 생성될 때 자기만의 데이터 공간을 메모리에 가짐
    • 'self': 자기 자신 객체를 의미함. 즉 x.append()를 하면 self에는 자동으로 x가 전달된다.
    • member function은 class가 공유하는 함수. 즉, 소유자가 class 이고 객체가 이를 호출해 사용할 수 있음

  • 속성(attribute, member variable): 'wing_width', 'age', 'color' 등
  • 행동(method, member function): 'fly()', 'eat()', 'sleep()' 등
  • 객체: 'eagle', 'dove', 'pelican'

 

3. Magic Method

  • python에 내부적으로 built-in된 method. ex) __init__, __str__()
  • 아래의 예시에서는 Python 내부에 이미 존재하던 __str__()을 우리가 덮어쓴 것 → 오버라이딩(overriding)
class bird:
  #생성자 | 생성자는 파라미터를 가질 수 있음.
  def __init__(self, width, height, age, color):
    self._wing_width = width
    self._wing_height = height
    self._age = age
    self._color = color

  #type code here(clone)
  # Magic Method
  def __str__(self):
    #print하면 얘가 호출됨
    return f"{self._wing_width}, {self._wing_height}, {self._age}, {self._color}"

    # __str__은 이미 있는데, 우리가 추가해서 변형시킨 것.
    # 즉, 기존에 있는 것을 변경. 이를 overriding이라고 함.

 

4. Member Variable & Underscore

  • _변수명: "접근하지 말라"는 의미 (완전한 보호는 아님). python은 public하기 때문.
  • .변수명으로 접근은 가능하지만 IDE 자동완성 등에서 숨겨짐
# class 생성자 만들 떄, underscore을 하지 않았더니 eagle. 하면 member variable이 나타남.
eagle2.age = 100
print(eagle2) # 20 -> 100으로 수정됨.

# 따라서, underscore의 의미는 값을 수정 쉽게 못 하게 member variable을 hide함
# _가 있다고 해서 아예 못 바꾸는 것은 아님.

eagle._age = 200
print(eagle)

# . 했을 때 나오지는 않았지만, _age 입력해서 값 수정 가능

 

 

5. Class variable

  • 클래스 변수는 모든 객체가 공유하며, 클래스 이름으로도 접근가능 ex) bird.bird_count 
class bird:
  # class variable
  bird_count = 0

  def __init__(self, width, height, age, color, name):
    self._wing_width = width
    self._wing_height = height
    self._age = age
    self._color = color
    self._name = name
    bird.bird_count += 1

 

6. Class Method

  • 객체가 아닌 클래스가 소유자인 method
  • 클래스가 호출 주체이기 때문에 cls를 첫 번째 인자로 받음
  • @classmethod 데코레이터 사용 필수
class bird:
  # class variable
  distance_thr = 0

  def __init__(self, width, height, color, name, distance):
    self._wing_width = width
    self._wing_height = height
    self._color = color
    self._name = name
    self._distance = distance
    self._age = self.cal_age() 

  def __str__(self):
    return f"객체이름 : {self._name}, 날개길이 : {self._wing_width}, 날개두께 : {self._wing_height}, 나이 : {self._age}, 색 : {self._color}"

  #cal_age() method구현(python 방법)
  def cal_age(self):
    return self._distance//bird.distance_thr

  #class method
  @classmethod # notation
  def set_distance_thr(cls, dist_thr):
    cls.distance_thr = dist_thr

  @classmethod
  def get_distance_thr(cls):
    return cls.distance_thr
    
#클래스변수 접근
bird.set_distance_thr(1000)
print(bird.distance_thr) # 1000

 

7. Inheritance

  • 자식 클래스는 부모 클래스의 속성과 메서드를 그대로 사용하거나 수정(overriding) 가능
class Employee:
  def __init__(self, name, salary):
    ...

class Manager(Employee): #Employee 상속
  def __init__(self, name, salary, bonus):
    super().__init__(name, salary)
    self._bonus = bonus

  def get_salary(self):  # 오버라이딩
    return self._salary + self._bonus

 

8. Property

  • 변수가 hiding되어 있을 때, 값을 가져오거나 변경하기 위해 사용
  • 값을 가져오는 getter와 값을 지정하는 setter가 있음
    • @property: getter
    • @변수명.setter: setter
  • notation 꼭 필요!
class Student:
  def __init__(self, name, age):
    if age < 7:
      raise ValueError("학생의 나이는 7살 이상이어야 합니다.")
    self._name = name
    self._age = age

  @property
  def name(self):
    return self._name

  @name.setter
  def name(self, value):
    self._name = value

 

9. Arbitrary Arguments

  • 개수가 정해지지 않은 인자들을 받아 처리
  • 주로 넘겨야 하는 인자들이 많을 때 사용.
  • print()함수가 arbitrary agruments을 가짐.
    그래서 print("번호", 1, "나이" 29)로 해도 알아서 '번호 1 나이 29' 로 출력됨
  • 함수 정의 시:
    • *args: 튜플 형태로 packing
    •  **args: 딕셔너리 형태로 packing
# *agrs
def sayhello_1(*names):
  print(names)
  for name in names:
    print(f"Hello, {name}")

sayhello_1("홍길동","홍이동","홍삼동")

# **agrs
def sayhello_2(**names):
  print(names.get('y', "out of bound"))
  for key in names.keys():
    print(f"Hello, {names[key]}"

sayhello_2(x="홍길동", y="신사임당")

 

studying:)
@studying:) :: what i studied

studying:) 님의 학습 여정을 기록하는 블로그입니다.

목차