"9. 클래스"의 두 판 사이의 차이
(→정의) |
|||
(같은 사용자의 중간 판 2개는 보이지 않습니다) | |||
77번째 줄: | 77번째 줄: | ||
===함수사용=== | ===함수사용=== | ||
{| class="wikitable" | {| class="wikitable" | ||
− | ! | + | !의도 |
− | ! | + | !사용법 |
+ | !설명 | ||
|- | |- | ||
+ | |메서드 실행 | ||
|인스턴스명.메서드명() | |인스턴스명.메서드명() | ||
− | | | + | |인스턴스의 메서드를 실행한다. |
|- | |- | ||
+ | |인스턴스별 메서드 실행 | ||
|클래스명.메서드명(인스턴스명) | |클래스명.메서드명(인스턴스명) | ||
|다양한 인스턴스에 대해 반복문 등을 실행할 때 좋을 형태다. | |다양한 인스턴스에 대해 반복문 등을 실행할 때 좋을 형태다. | ||
+ | |- | ||
+ | |클래스 함수 실행 | ||
+ | |클래스명.메서드명() | ||
+ | |인스턴스를 지정하지 않고 바로 클래스 함수를 실행할 수 있다.(이땐 self.변수 사용 불가.) | ||
+ | 다만, 인스턴스 지정 없이 바로 쓰려면 메서드에 @classmethod 라는 데코레이션을 달아주어야 한다. | ||
|- | |- | ||
| | | | ||
| | | | ||
+ | |굳이 지정하고 싶지 않은데 데코레이션 주면 더러워지는 게 싫은 사람은... | ||
+ | 클래스명(변수1, 변수2...).메서드명() 형태로 실행할 수 있다. | ||
|} | |} | ||
=상속= | =상속= | ||
− | 직접 메서드를 구현하긴 귀찮고, 그대로 쓰기에도 곤란한 경우, 기능을 상속받아 메서드를 추가하거나 수정해 사용할 수 있다.<syntaxhighlight lang="python"> | + | 직접 메서드를 구현하긴 귀찮고, 그대로 쓰기에도 곤란한 경우, 기능을 상속받아 메서드를 추가하거나 수정해 사용할 수 있다. |
+ | |||
+ | 혹은 특정 기능을 구현할 때 클래스의 형태를 제한하기 위해 사용한다.<syntaxhighlight lang="python"> | ||
class 클래스명(상속해주는 클래스명): | class 클래스명(상속해주는 클래스명): | ||
명령 | 명령 | ||
105번째 줄: | 117번째 줄: | ||
추가할 내용. | 추가할 내용. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | == 추상 클래스 == | ||
+ | 메서드의 목록, 받아들이는 인수 형태를 제한한 클래스. 특정 틀 안에서 무언가를 정의하게 할 때 쓰인다.<syntaxhighlight lang="python"> | ||
+ | class 추상클래스(metaclass=ABCMeta): | ||
+ | @abstractmethod | ||
+ | def 메서드이름(self, 인수): | ||
+ | 코드 | ||
+ | </syntaxhighlight>ABC는 Abstract Base Class의 약자이다. | ||
+ | |||
+ | @abstractmethod 아래에 정의된 메서드는 이 클래스를 상속받을 하위 클래스에서 반드시 정의되어야 하고, 받아들이는 인수의 형태도 같아야 한다는 제약이 생긴다. | ||
=자주 발생하는 에러= | =자주 발생하는 에러= |
2022년 9월 29일 (목) 23:02 기준 최신판
1 개요[편집 | 원본 편집]
우리가 일상생활에서 생각하는 것과 비슷한 논리로 작성할 수 있게 하며 유지, 보수가 간편해진다. 객체를 만들기 위해 사용하는 것.
같은 형태의 데이터를 여러 번 사용해야 할 때 사용한다. 사용자 정보라든가, 게임 케릭터 스테이터스라든가.
ex) 붕어빵틀?
1.1 정의[편집 | 원본 편집]
class 클래스명:
명령
def 메서드명(self, 이름, 직업, 체력, 마력, ...):
self.체력=체력
self.직업=직업
...
메서드에 사용되는 인수 중 self는 자기자신을 의미한다.
1.2 함수. 메서드.[편집 | 원본 편집]
클래스 내부에 정의된 함수는 메서드라는 이름으로 구분한다.
메서드를 정의할 땐 가장 처음에 self라는 인수를 받아야 한다. 메서드의 첫 번째 인자로 인스턴스가 전달되기 때문에 self를 지정해두지 않으면 한 변수에 2개의 데이터가 담겨 에러가 발생한다.
2 지정메서드[편집 | 원본 편집]
모든 클래스가 공유하는 메서드이다.
특수 | 메서드명 | 설명 | 활용 |
---|---|---|---|
생성자 | __init__ | 인스턴스가 생성되면 실행되는 메서드이다. 일반적으로 인스턴스 변수를 정의하는 데 사용.
들어가야 할 변수를 지정하여, 처음 생성 때 무조건 변수를 받아야 할 경우에 사용한다. (클래스에 입력하는 것은 여기에 정의하여 사용한다.) |
def __init__(self, 변수1, 변수2, ...):
명령
|
소멸자 | __del__ | 인스턴스가 메모리에서 제거될 때 호출된다. | |
2.1 변수[편집 | 원본 편집]
종류 | 설명 | 밖에서 접근할 때 |
---|---|---|
클래스변수 | 클래스 내에 선언된 일반 변수.(해당 클래스를 갖고 있다면 무조건 갖게 된다.)
일반적으로 함수가 시작되기 전에 정의한다.(일반적인 변수를 정의하듯) 전체 계좌수, 전체 계정수 등을 파악할 때 사용. 인스턴스들끼리 공유해야 하는 경우. |
클래스명.변수명
(클래스명 대신 인스턴스명도 됨) |
인스턴스변수 | self.변수명 형태의 변수를 인스턴스 변수라고 한다.(각 인스턴스마다 다르게 지정할 수 있다.)
self.변수명 형태로 정의하고 사용한다. |
인스턴스명.변수명 |
3 사용[편집 | 원본 편집]
인스턴스와 객체는 혼용되어 사용된다.
3.1 객체 지정[편집 | 원본 편집]
인스턴스명 = 클래스명() #인스턴스를 만들어 클래스를 호출하는 형식.
3.2 함수사용[편집 | 원본 편집]
의도 | 사용법 | 설명 |
---|---|---|
메서드 실행 | 인스턴스명.메서드명() | 인스턴스의 메서드를 실행한다. |
인스턴스별 메서드 실행 | 클래스명.메서드명(인스턴스명) | 다양한 인스턴스에 대해 반복문 등을 실행할 때 좋을 형태다. |
클래스 함수 실행 | 클래스명.메서드명() | 인스턴스를 지정하지 않고 바로 클래스 함수를 실행할 수 있다.(이땐 self.변수 사용 불가.)
다만, 인스턴스 지정 없이 바로 쓰려면 메서드에 @classmethod 라는 데코레이션을 달아주어야 한다. |
굳이 지정하고 싶지 않은데 데코레이션 주면 더러워지는 게 싫은 사람은...
클래스명(변수1, 변수2...).메서드명() 형태로 실행할 수 있다. |
4 상속[편집 | 원본 편집]
직접 메서드를 구현하긴 귀찮고, 그대로 쓰기에도 곤란한 경우, 기능을 상속받아 메서드를 추가하거나 수정해 사용할 수 있다.
혹은 특정 기능을 구현할 때 클래스의 형태를 제한하기 위해 사용한다.
class 클래스명(상속해주는 클래스명):
명령
def 메서드명(self, 이름, 직업, 체력, 마력, ...):
self.체력=체력
self.직업=직업
...
만약 상속하는 클래스와 상속받는 클래스의 이름이 같은 경우, 상속하는 클래스를 import할 때 as를 이용하여 별칭을 써서 구분해야 한다.(클래스명이 달라야 한다.)
4.1 오버라이딩[편집 | 원본 편집]
클래스에서 상속받은 메서드와 같은 메서드를 정의하면 덮어쓸 수 있다. 물론, 부모의 메서드 기능을 그대로 써야 할 때도 있는데, 이땐 super()를 이용한다.
def 메서드명(self):
super().메서드명() # 부모의 메서드 기능에 새로운 기능을 추가하고 싶을 때.
추가할 내용.
4.2 추상 클래스[편집 | 원본 편집]
메서드의 목록, 받아들이는 인수 형태를 제한한 클래스. 특정 틀 안에서 무언가를 정의하게 할 때 쓰인다.
class 추상클래스(metaclass=ABCMeta):
@abstractmethod
def 메서드이름(self, 인수):
코드
ABC는 Abstract Base Class의 약자이다.
@abstractmethod 아래에 정의된 메서드는 이 클래스를 상속받을 하위 클래스에서 반드시 정의되어야 하고, 받아들이는 인수의 형태도 같아야 한다는 제약이 생긴다.
5 자주 발생하는 에러[편집 | 원본 편집]
5.1 missing 1 required positional argument: 'self'[편집 | 원본 편집]
TypeError: ... missing 1 required positional argument: 'self'
클래스는 함수를 사용하기 전에 인스턴스를 먼저 생성해야 한다.
인스턴스 = 클래스()
인스턴스.메서드()
위처럼 인스턴스를 만드는 과정이 없으면 생기는 에러이다.
5.2 got multiple values for argument[편집 | 원본 편집]
메서드의 첫 번째 인자가 self가 아닐 때 발생하는 에러. 한 인수에 2개의 데이터가 할당될 때..