티스토리 뷰

Python

[Python] 클래스

daze1002 2025. 2. 17. 01:58
반응형

01. 클래스 (Class)

01-01. 클래스 개요

01-01-01. Class란

클래스 정의 (Class Definition Syntax)

  • class 키워드와 콜론을 이용해 클래스를 정의한다.

  • 클래스 정의 시에도 클래스의 내용이 될 블록을 "반드시" 들여쓰기 한다.

      class 클래스명:
          <statement-1>
          .
          .
          .
          <statement-N>
  • 클래스 정의 예시

01-02. 클래스 구성 요소

클래스 속성

  • 클래스 자체에 속하는 변수로, 모든 인스턴스가 공유하는 속성이다.

      class Person:
          national = 'korea'
          language = 'korean'

메서드 (method)

  • 클래스 내부에 정의된 함수로, 인스턴스의 데이터를 조작하거나 동작을 정의한다.

  • self

    • 메서드 내에서 쓰이는 self는 필드 및 메소드에 접근하기 위한 객체를 의미한다.

    • 메소드 호출 시 객체의 주소값이 첫 번째 인자로 넘어오기 때문에, 객체를 통한 접근 시 호출되는 메소드의 첫 번째 인자는 항상 self 여야 한다.

      class Person:    
        national = 'korea'
        language = 'korean'
      
        def greeting(self):
            return '안녕하세요'
      
        def information(self):
            return "I'm from " + self.national + " and I use " + self.language
      
        def favorite(self, color):
            return "I love " + color

생성자

  • init 메서드는 객체가 생성될 때 자동으로 호출되는 메서드로, 생성자라고 부른다. 이때 매개변수를 전달받아 인스턴스 속성을 초기화 할 수 있다.

  • 인스턴스 속성이란 각 인스턴스마다 개별적으로 가지는 변수이며, 생성자에서 정의된다.

      class Person:    
          national = 'korea'
          language = 'korean'
    
          def __init__(self, name, age):
              self.name = name
              self.age = age
    
          def greeting(self):
              return '안녕하세요'
    
          def information(self):
              return "I'm from " + self.national + " and I use " + self.language + ". My name is " + self.name + ". I'm " + str(self.age)
    
          def favorite(self, color):
              return "I love " + color

01-03. 클래스 심화

네임 스페이스와 스코프

  • 네임스페이스는 크게 다섯 가지로 나누어 볼 수 있다.
    1. 지역(local) 네임스페이스: 현재 함수나 메서드 내의 네임스페이스
    2. 인스턴스 네임스페이스: 인스턴스 객체의 네임스페이스
    3. 클래스 네임스페이스: 클래스 객체의 네임스페이스
    4. 전역(global) 네임스페이스: 모듈 내의 전역 네임스페이스
    5. 내장(built-in) 네임스페이스: 파이썬 내장 함수와 예외를 포함하는 네임스페이스
  • 네임스페이스 검색 순서는 가장 가까운 (가장 작은) 스코프 순서로 보통 로컬 > 전역 > 빌트인 순이다.
# 전역 네임스페이스
variable = "global variable"
print('전역: ', variable)    # 전역:  global variable

def outer_function():
    # 외부 함수 네임스페이스
    variable = "outer variable"
    print('지역(외부 함수): ', variable)

    def inner_function():
        # 지역 네임스페이스
        variable = "inner variable"
        print('지역(내부 함수): ', variable)

    inner_function()

outer_function()    # 지역(외부 함수):  outer variable
                    # 지역(내부 함수):  inner variable

class TestClass:
    # 클래스 네임스페이스
    variable = "class variable"

    def __init__(self, value):
        self.variable = value  # 인스턴스 네임스페이스

    def class_function(self):
        variable = "local variable"
        print('클래스 지역: ', variable)

# 인스턴스 생성 및 메서드 호출
obj = TestClass("instance variable")
print('인스턴스: ', obj.variable)    # 인스턴스:  instance variable
obj.class_function()                # 클래스 지역:  local variable

global과 nonlocal

  • global

    • 함수 내부에서 전역 변수를 참조하거나 수정할 때 사용하여, 함수 내부에서 전역 변수에 접근할 수 있다.

    • 설정 값을 전역적으로 유지하고 여러 함수에서 이 값을 변경하거나 참조할 때 유용하다.

      g_variable = "global variable"
      
      def modify_global():
        global g_variable
        g_variable = "global modified in function"
      
      print(g_variable)    # global variable
      modify_global()
      print(g_variable)    # global modified in function
  • nonlocal

    • 중첩 함수에서 바깥 함수의 변수(로컬 변수를 포함)를 참조하거나 수정할 때 사용하며, 중첩 함수에서 한 단계 바깥의 함수 변수에 접근할 수 있다.

    • 클로저(closure)나 함수형 프로그래밍 패턴에서 바깥 함수의 상태를 유지하고 수정하는 경우에 유용하다.

      def outer_function():
        variable = "outer variable"
      
        def inner_function():
            nonlocal variable
            variable = "outer modified in inner function"
      
        print(variable)
        inner_function()
        print(variable)
      
      outer_function()    # outer variable
                        # outer modified in inner function

Private Variable

  • 객체 내부에서만 접근할 수 있는 private은 파이썬에 존재하지 않는다.

    단, 대부분의 파이썬 코드에서 따르는 밑줄로 시작하는 네임스페이스를 가진 속성은 private하게 취급된다는 규약을 통해 private 속성을 설정할 수 있다.

      class Character:
          def __init__(self, nickname, type):
              self.nickname = nickname      # Public attribute
              self.__type = type            # Private attribute (직접 접근 불가)
    
          def get_type(self):
              return self.__type            # Private attribute에 접근하는 public method
    
          def set_type(self, type):         # public method로 private attribute 수정
              character_types = ['전사', '법사', '치유사']
              for given_type in character_types:
                  if(type == given_type):
                      self.__type = type
                      return
    
              raise ValueError("잘못된 캐릭터 타입을 선택하였습니다.")

02. 인스턴스 (Instance)

02-01. 인스턴스 개요

인스턴스란

인스턴스 생성

  • 클래스명 뒤에 소괄호(())를 붙여 객체를 생성한다.

    • 클래스 내에 생성자(init 메서드)가 정의되어 있는 경우, 생성자에서 사용하는 매개변수를 전달하면서 객체를 생성할 수 있다.

      person1 = People('mike', 20)

02-02. 인스턴스 속성

클래스 속성과 인스턴스 속성

  • 인스턴스 변수는 인스턴스별 데이터를 위한 것이고, 클래스 변수는 그 클래스의 모든 인스턴스에서 공유되는 어트리뷰트와 메서드를 위해 사용한다.

  • 클래스 속성은 공유되는 속성으로 변경이 발생하면, 전체 객체에서 변경될 수 있다.

  • 따라서 객체마다 다른 데이터를 관리해야 하는 경우에는 인스턴스 속성으로 설정해야 한다.

      class Character:
          tribe = 'human'  # 공통되는 속성은 클래스 속성으로
    
          def __init__(self, name, sex): # 객체마다 다른 속성은 인스턴스 속성으로
              self.name = name
              self.sex = sex
  • 인스턴스 속성과 클래스 속성으로 같은 이름을 사용하면, 인스턴스 속성을 우선한다.

      class Character:        
          nickname = '땅파먹는개미핥기'
    
          def __init__(self, nickname, type):
              self.nickname = nickname
              self.type = type
    
      my_character = Character('산골짜기다람쥐', '전사')
    
      print(my_character.nickname)    # 산골짜기다람쥐

03. 상속 (Inheritance)

03-01. 상속 개요

상속이란

상속 기본 문법

class DerivedClassName(BaseClassName):
    <statement-1>
    .
    .
    .
    <statement-N>

03-02. 상속의 특징

다중 상속 지원

  • 부모를 여러 개 가지는 다중 상속을 지원한다.

      class DerivedClassName(Base1, Base2, Base3):
          <statement-1>
          .
          .
          .
          <statement-N>
    • 다중 상속 시 시 검색 순서는 왼쪽에서 오른쪽으로 탐색한다. (메서드, 변수, 생성자 )

다른 모듈의 클래스 상속 가능

  • 다른 모듈에 포함된 클래스도 상속받을 수 있다.

      class DerivedClassName(module_name.BaseClassName):
          <statement-1>
          .
          .
          .
          <statement-N>

부모 클래스의 속성 오버라이딩 가능

  • 부모 클래스의 속성을 오버라이딩하여 사용할 수 있다.

      class Person:
          national = 'korea'
    
          def greeting(self):
              return 'Hello. This is Python'
    
      class Learner(Person):
          def __init__(self, subject):
              self.subject = subject
    
          def learn(self):
              return 'I am learning ' + self.subject
    
      class Student(Learner):
          def __init__(self, name, subject):
              Learner.__init__(self, subject)
              self.name = name;
    
          def greeting(self):
              return 'Hello. My name is ' + self.name
    
      student = Student('토끼', 'python')
      print(student.greeting())    # Hello. My name is 토끼
      print(student.learn())       # I am learning python

'Python' 카테고리의 다른 글

[Python] 모듈 & 패키지  (0) 2025.02.17
[Python] 함수  (0) 2025.02.17
[Python] 제어문 (조건, 반복, 분기)  (1) 2025.02.17
[Python] Set, Dictionary  (0) 2025.02.17
[Python] 시퀸스 자료형  (1) 2025.02.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함