Search

PYTHON 클래스 사용법 정리

목차

기본개념

객체지향 프로그래밍(OOP)란? : 모든 데이터를 객체(object)로 취급하며, 이러한 객체들의 상태나 동작을 구체화하는 프로그래밍이다.
클래스(class)란? : OOP에서 사용하는 객체를 만들어내기 위한 틀/설계도라고 생각하면 된다.
클래스에 속한 변수는 필드(filed), 클래스에 속한 함수는 메소드(method)라고 하며 이 둘을 합쳐 속성이라고 부른다.
인스턴스(instance)란? : 클래스를 사용하기 위해 클래스 타입의 객체(object)를 선언한다.
이 선언하는 동작을 인스턴스화, 이때 생성된 객체를 인스턴스라고 한다.
메소드(method)란? : 특정한 동작을 수행하기 위한 명령문의 집합

클래스 문법

매직 메소드 : 클래스에서 특별한 목적으로 사용하기 위해 기본적으로 선언되는 메소드
object.__init__(self[,...])
object.__doc__()
object.__dict__()
object.__class__()
object.__str__()
object.__repr__()
self 변수 : 인스턴스 메소드를 정의할 때 사용한다. 인스턴스 자체를 나타낸다.
cls 변수 : 클래스 메소드를 정의할 때 사용한다. 클래스 자체를 나타낸다.

 상속

부모클래스의 필드와 메서드를 그대로 물려받는 개념이다.
예시로 A, B 두 클래스가 있으며, B는 A에게 상속을 받는 클래스일 때 아래와 같이 사용한다.
또한 상속은 다중 상속이 가능하다.
예시

오버라이딩

만약 부모클래스에서 상속받은 메소드를 자식클래스의 메소드에서 재정의하게된다면 덮어씌워지게 되는데, 이를 오버라이딩이라고 한다.
매직메서드도 오버라이딩이 가능하다.
예시

오버로딩

같은 이름의 메소드를 매개 변수의 유형과 갯수로 구분하여 여러개를 사용하는 방식이다.
하지만 파이썬은 정식으로 오버로딩을 지원하지 않기 때문에, 매개 변수의 유형과 갯수로 함수 내부에서 직접 구분해야한다.

super()

만약 부모클래스에서 얻어온 메소드를 오버라이딩하지 않았다면, 상속받은 메서드를 바로 그대로 사용할 수 있다.
하지만, 부모에게 상속받은 메소드를 오버라이딩 하는 경우 등으로 자식 클래스에서 상속받은 부모 클래스의 내용을 사용할 수 없을 때 사용한다.
super()를 사용하면, 기존 부모클래스의 정보를 object로 반환하며 이를 사용하며 기존의 부모클래스의 메소드나 속성을 사용할 수 있다.
예시
사용법

데코레이터

이름 그대로 “장식"처럼 생각하면 편하다. 즉 객체에 추가적인 동작을 동적으로 추가해주는것이다.
아래와 같이 함수를 데코레이터를 사용하여 재정의할 수 있다.
만약 API서버를 만든다고 하면, 권한체크 / 로그 기록 / 테스트 데코레이터를 만들어 사용할 수 있을 것이다.
1.
데코레이터라는 함수에 기존 함수와 인자값을 넘긴다.
2.
새롭게 재정의 후 데코레이터 동작을 알리는 문장을 출력한다.
3.
새롭게 재정의한 함수를 반환한다.
def decorator(func): def new_func(text, *args, **kwargs): text = "input text is " + text func(text, *args, **kwargs) print("do decorator") return new_func @decorator def view(text): print(text) view("TEST")
Python
복사

메소드의 종류

인스턴스 메소드 : 첫번째 매개변수로 클래스의 인스턴스(보통 self)가 넘어오며, self를 통해 클래스 속성이나 다른 인스턴스 메소드에 접근할 수 있다.
클래스 메소드(@classmethod) : 첫번째 매개변수로 인스턴스가 아닌 클래스 자체(보통 cls)를 사용한다.
다른 일반적인 인스턴스 메소드와 달리 인스턴스 속성 접근이나, 다른 인스턴스 메소드 호출이 불가능하다.
예시
정적 메소드(@staticmethod) : 첫번째 매개변수를 할당하지 않으며, 인스턴스/클래스 속성이나 인스턴스/클래스 메소드들의 접근이 불가능하다.
예시

public vs private

파이썬은 별도의 접근 제어자가 존재하지 않고, 변수나 함수의 작명법을 다르게 바꾸어 구분한다.
public : 별도의 접두사가 존재하지 않는다.
self.test = 1
def method(self)
protected : 파이썬은 별도의 protected 기능이 존재하지 않으며, 접두사 1개로 표시만 한다.
self._test=1
def _method(self)
private : 접두사 2개로 표시하며, 실제 접근이 되지 않고 네임스페이스에서도 확인할 수 없다.
self.__test=1
def __method(self)

getter / setter

private로 은닉된 변수를 읽을 때는 getter, 값을 쓰기 위해서는 setter를 사용한다.
보통은 접근, 수정하려는 변수의 이름과 동일한 이름으로 메소드를 만든다.
변수의 값을 사용하여 적절한 값으로 내보내거나, 변수를 검증하고 싶을 때 사용한다.
getter : 메소드를 만든 후, @property 이라는 데코레이터를 추가한다.
setter : 메소드를 만든 후, @<getter메소드명>.setter 데코레이터를 추가한다.
예시

Composition

다른 클래스의 일부 기능을 사용하고 싶지만, 전체 상속 받기는 어려울 때 사용한다.
예시

__slot__

어떤 클래스를 사용하여 객체를 만들면, 각 객체마다 사용가능한 속성을 저장하기 위해 dictionary 형태의 데이터가 메모리에 할당되는데, 이를 __dict__ 라고한다.
이때 __slot__ 을 사용하면, 사용가능한 속성을 제한하고 __dict__ 의 생성을 막을 수 있다.
이 때문에 __dict__ 에 비해서 메모리를 덜 사용하며, 속성의 조회 속도도 크게 향상된다.
class WithSlotClass: __slots__ = ["name", "age"] def __init__(self, name, age): self.name = name self.age = age class WithoutSlotClass: def __init__(self, name, age): self.name = name self.age = age withslot = WithSlotClass("테스트1", "25") withoutslot = WithoutSlotClass("테스트2", "23") # AttributeError: 'WithSlotClass' object has no attribute '__dict__' print(withslot.__dict__) # AttributeError: 'WithSlotClass' object has no attribute 'newdata' withslot.newdata = "new" # {'name': '테스트2', 'age': '23'} print(withoutslot.__dict__)
Python
복사

참고

이름
태그
URL
COUNT2