CodeGym /행동 /Python SELF KO /클래스와 객체 생성

클래스와 객체 생성

Python SELF KO
레벨 15 , 레슨 3
사용 가능

3.1 클래스 생성

Python에서 클래스 생성은 객체 지향 프로그래밍 (OOP)의 중요한 부분이야. 클래스는 새로운 데이터 타입을 만들 수 있게 해주고, 이 데이터 타입은 고유한 속성과 메소드를 가질 수 있어. Python에서 클래스를 생성하는 기본 개념과 예제를 살펴보자.

기본 개념

  • 클래스: 객체를 생성하기 위한 템플릿. 클래스는 해당 클래스의 객체들이 가질 속성과 메소드를 정의해.
  • 객체: 클래스의 인스턴스. 객체는 클래스에서 정의된 모든 속성과 메소드를 가지고 있어.
  • 속성: 클래스나 객체에 연결된 변수야.
  • 메소드: 클래스나 객체에 연결된 함수야.

속성은 기본적으로 객체나 클래스 내부에 있는 변수야. 메소드는 클래스 내부에 정의된 함수야. 이 용어들은 OOP에서 온 거고, 함수나 변수와 같이 사용돼.

새로운 클래스를 선언(생성)하려면 class 키워드를 사용해야 해. 이 작업의 일반적인 문법은 다음과 같아:


class 클래스이름:
    변수1 = 값1
    변수N = 값N
          
    def 함수1(self):
        함수 코드
            
    def 함수M(self):
        함수 코드

기본적으로 클래스는 변수와 함수로 이루어진 작은 프로그램이고, 클래스 이름이라는 별도의 공간에 놓인다고 할 수 있어.

클래스를 만든 후에는 해당 클래스의 객체(인스턴스)를 생성할 수 있어. 이 코드는 더 간단하게 보일거야:


변수X = 클래스이름()

중요! Python에서 변수와 메소드 이름은 소문자로 쓰는 게 일반적이야. 클래스 이름은 대문자로 시작해야 해. 또한 클래스 이름에는 밑줄을 사용하지 않아. 클래스 이름이 여러 단어로 이루어져야 한다면, 각 단어를 대문자로 시작해.

클래스/객체의 변수에 접근하려면 일반적으로 다음과 같이 작성해:


변수X.변수1 = 10
변수X.함수M()       

하지만 아래 설명할 다른 사항도 있어…

3.2 객체 다루기

클래스와 클래스의 인스턴스(객체)는 둘 다 객체야. 그래서 두 가지 모두 변수와 메소드를 가질 수 있어.

변수는 두 가지 유형이 있어:

  • 클래스 속성/변수/필드 (class property)
  • 객체 속성/변수/필드 (object property)

그리고 세 가지 유형의 메소드가 있어:

  • 클래스 메소드/함수 (class method)
  • 인스턴스 메소드/함수 (instance method)
  • 정적 메소드 (static method)

메소드들은 선언 방식과 호출 방식에서 서로 달라.

인스턴스 메소드

인스턴스 메소드를 선언하면 첫 번째 필수 매개변수로 self를 전달해야 해. 메소드를 호출할 때 이 매개변수에는 객체(인스턴스)에 대한 참조가 전달돼.


class MyClass:

    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
                   

my_object = MyClass()
my_object.instance_method()
        

위 예제에서 instance_method() 함수가 실행되기 시작했을 때, 매개변수 selfmy_object 객체에 대한 참조가 전달됐어.

클래스 메소드

클래스 메소드를 선언할 때도 첫 번째 필수 매개변수로 cls를 전달해야 해. 메소드를 호출할 때 클래스 (class object)에 대한 참조가 전달돼. 또한, 클래스 메소드는 아래 예제처럼 classmethod 데코레이터를 붙여야 해:


class MyClass:
    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
        
    @classmethod
    def class_method(cls):
        print(type(cls))  # <class 'type'>
                   

my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
        

위 예제에서 class_method() 함수가 실행되기 시작했을 때, 매개변수 clsMyClass 클래스에 대한 참조가 전달됐어.

정적 메소드

정적 메소드를 선언할 때는 아무것도 전달하지 않아도 돼, 하지만 클래스의 내부 데이터에 접근할 수 없어. 아래 예제처럼 메소드에 staticmethod 데코레이터를 붙여야 해:


class MyClass:
    def instance_method(self):
        print(type(self))  # <class 'MyClass'>
        
    @classmethod
    def class_method(cls):
        print(type(cls))  # <class 'type'>
        
    @staticmethod
    def static_method():
        return "이 메소드는 인스턴스나 클래스에 의존하지 않아"
                   
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method() 
        

정적 메소드는 클래스 메소드와 비슷하게 호출되지만, 객체나 클래스에 대한 참조가 전달되지 않아.

3.3 클래스 변수

클래스 변수

클래스 변수(속성)를 선언하려면 클래스 내부 어디에서든 그냥 선언하면 돼. 보통 클래스 메소드를 선언하기 전에 가장 처음에 선언해. 예제:


class MyClass:
    attribute = "나는 클래스 속성이다"
        
    @classmethod
    def class_method(cls):
        print(cls.attribute)  # 나는 클래스 속성이다
                  
my_object = MyClass()
MyClass.class_method()

클래스 변수의 값을 읽거나 쓰고 싶다면 객체 cls를 사용해.

사실, 클래스 변수에 클래스 이름을 통해 직접 접근해도 돼:


class MyClass:
    attribute = "나는 클래스 속성이다"
        
    @classmethod
    def class_method(cls):
        print(MyClass.attribute)  # 나는 클래스 속성이다
                  
my_object = MyClass()

print(MyClass.attribute)  # 나는 클래스 속성이다

객체 변수/필드

객체 변수 (instance)self의 필드야. self.name을 통해 접근할 수 있어. self 객체는 바로 이 작업을 위해 메소드에 전달돼.

예제:


class MyClass:
    attribute = "나는 클래스 속성이다"
        
    def set_name(self, name):
        self.name = name
        
    def print_name(self):
        print(self.name)    
                 
my_object = MyClass()
my_object.set_name("name이라는 객체 필드") 
my_object.print_name()  # "name이라는 객체 필드"
        

객체의 메소드를 호출할 때마다 (self) 매개변수로 메소드가 호출된 객체에 대한 참조가 전달돼. 다른 객체 메소드들도 self 객체를 통해 공통 데이터를 접근할 수 있어.

2
과제
Python SELF KO, 레벨 15, 레슨 3
잠금
객체를 생성합니다.
객체를 생성합니다.
2
과제
Python SELF KO, 레벨 15, 레슨 3
잠금
클래스를 만듭니다.
클래스를 만듭니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION