Notice
Recent Posts
Recent Comments
Link
Love Every Moment
〔파이썬〕클래스란? 클래스, 인스턴스, 속성, 메서드 사용법 본문
반응형
1. 클래스와 객체
- 객체 = 인스턴스, 객체를 클래스와 연관지어 설명할 때에 인스턴스라고 부른다
- 객체(Object)는 특정한 개념이나 모양으로 존재하는 것을 의미
- 게임 캐릭터를 예로 들자면 기사, 마법사, 궁수, 웹 브라우저에서는 스크롤 바, 체크박스 등이 각각의 객체가 된다
- 클래스(Class) 는 프로그래밍으로 객체를 만들 때에 사용하는 것으로, '속성(Attribute)'과 '메서드(Method)'를 가진다
- 기사라는 클래스는 체력, 마나 등의 속성과 찌르기, 베기 등의 메서드를 가진다
- 복잡한 문제를 잘게 나누어 객체로 만들고, 객체를 조합해서 문제를 해결하는 방식을 '객체 지향 프로그래밍'이라고 한다
2. 클래스 사용법
(1) 클래스 생성
class 클래스이름:
def 메서드(self):
코드
- 클래스의 이름은 항상 대문자로 시작한다
- 메서드의 첫 번째 매개변수는 반드시 self 를 지정해야 한다
- self 는 인스턴스 자기 자신을 의미한다
- self 는 파이썬이 함수 호출을 어떤 객체에 적용해주어야 하는지 알려주는 역할을 한다
(2) __init__()
def __init__(self):
self.속성 = 값
# 인스턴스 생성 시에 받는 값을 속성에 넣기
def __init__(self, 매개변수1, 매개변수2):
self.속성1 = 매개변수1
self.속성2 = 매개변수2
- 모든 클래스는 __init__() 이라는 특별한 함수를 가진다
- __init__() 함수를 이용해서 객체의 처음 상태를 직접 정의할 수 있다
__메서드명__() 처럼 앞뒤로 밑줄이 두 개씩 붙은 메서드는 파이썬이 자동으로 호출해주는 메서드로, 스페셜 메서드(special method) 또는 매직 메서드(magic method)라고 부른다
3. 속성과 메서드 사용하기
# Person 이라는 클래스 생성
class Person:
def __init__(self, name, age = None):
self.name = name
self.age = age
def greeting(self):
print('Hello, my name is ' + self.name)
if self.age:
print('I\'m ' + str(self.age) + ' years old')
# james 라는 인스턴스 생성
rachel = Person('Rachel', 25)
# 메서드 호출
rachel.greeting()
# >>> Hello, my name is Rachel
# >>> I'm 25 years old
- 클래스는 특정 개념을 표현만 할뿐 실제로 사용하려면 인스턴스를 생성해야한다
- 인스턴스를 생성할 때에 인자로 넘겨준 'Rachel' 과 25 이 각각 self.name, self.age 속성에 저장된다
- 메서드를 호출하는 방법은 인스턴스.메서드() 의 형식으로 사용한다
- rachel.greeting() 처럼 사용
rachel = Person()
rachel.name = 'Rachel'
rachel.age = 25
- 위에서는 rachel 인스턴스 생성 시에 이름과 나이를 알려주었지만,
- 지금처럼 먼저 인스턴스를 생성하고서 속성을 추가하는 방법도 있다
4. 파이썬 내장 함수도 사실 클래스다
(1) type() 으로 확인
a = int(10)
print(a)
print(type(a))
# >>> 10
# >>> <class 'int'>
b = list(range(10))
print(b)
print(type(b))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# <class 'list'>
c = dict(x=10, y=20)
print(c)
print(type(c))
# {'x': 10, 'y': 20}
# <class 'dict'>
maria = Person('Maria')
print(type(maria))
# <class '__main__.Person'>
- 위와 같이 int(), list(), dict() 등도 클래스이다
- 따라서 아래와 같이 인스턴스를 생성하여 메서드를 호출할 수 있는 것이다
(2) 인스턴스 생성하여 메서드 호출
# b라는 인스턴스 생성
b = list(range(10))
# list 클래스 내부에 정의된 append() 메서드 호출
b.append(20)
5. 기타 클래스 사용 팁
(1) 메서드 안에서 메서드 호출하기
class Person:
def greeting(self):
print('Hello')
def hello(self):
self.greeting() # self.메서드() 형식으로 클래스 안의 메서드를 호출
james = Person()
james.hello() # Hello
- self.메서드() 의 형식으로 메서드 안에서 클래스 안의 다른 메서드를 호출할 수 있다
(2) 특정 클래스의 인스턴스인지 확인하기
class Person:
pass
james = Person()
isinstance(james, Person)
>>> True
- isinstance(인스턴스이름, 클래스이름) 으로 확인 가능하다
def factorial(n):
if not isinstance(n, int) or n < 0: # n이 정수가 아니거나 음수이면 함수를 끝냄
return None
if n == 1:
return 1
return n * factorial(n - 1)
- 이와 같이 n이 정수가 아니면 리턴하는 코드에서 유용하게 쓰일 수 있다
6. 위치 인수와 키워드 인수 사용하기
(1) 위치 인수와 리스트 언패킹
class Person:
def __init__(self, *args):
self.name = args[0]
self.age = args[1]
self.address = args[2]
maria = Person(*['마리아', 20, '서울시 서초구 반포동'])
- *args 처럼 리스트나 튜플 앞에 * 을 붙여서 매개변수로 사용한다
- 매개변수에서 값을 가져오려면 args[0] 처럼 사용
(2) 키워드 인수와 딕셔너리 언패킹
class Person:
def __init__(self, **kwargs): # 키워드 인수
self.name = kwargs['name']
self.age = kwargs['age']
self.address = kwargs['address']
maria1 = Person(name='마리아', age=20, address='서울시 서초구 반포동')
maria2 = Person(**{'name': '마리아', 'age': 20, 'address': '서울시 서초구 반포동'})
- **kargs 처럼 딕셔너리 앞에 ** 을 붙여서 사용한다
- 매개변수에서 값을 가져오려면 kargs['name'] 처럼 사용
7. 비공개 속성 사용하기
class Person:
def __init__(self, name, age, address, wallet):
self.name = name
self.age = age
self.address = address
self.__wallet = wallet # 변수 앞에 __를 붙여서 비공개 속성으로 만듦
def pay(self, amount):
self.__wallet -= amount # 비공개 속성은 클래스 안의 메서드에서만 접근할 수 있음
print('이제 {0}원 남았네요.'.format(self.__wallet))
maria = Person('마리아', 20, '서울시 서초구 반포동', 10000)
maria.__wallet -= 10000 # 클래스 바깥에서 비공개 속성에 접근하면 에러가 발생함
maria.pay(3000) # 클래스 안의 메서드로 비공개 속성에 접근
- __속성 과 같은 형식으로 비공개 속성의 이름 앞에 밑줄 두 개를 붙여 사용한다
- 단, __속성__ 처럼 뒤에도 밑줄 두 개가 붙으면 비공개 속성이 아니라는 것을 주의
- 클래스 밖에서 비공개 속성에 접근하면 에러가 발생한다
class Person:
def __greeting(self):
print('Hello')
def hello(self):
self.__greeting() # 클래스 안에서는 비공개 메서드를 호출할 수 있음
james = Person()
james.__greeting() # 에러: 클래스 바깥에서는 비공개 메서드를 호출할 수 없음
- 속성과 마찬가지로 메서드도 비공개 메서드로 만들어 사용할 수 있다
- 이것 역시 클래스 밖에서는 사용할 수 없기 때문에, james.hello() 를 사용해야한다
참고
반응형
'PROGRAMMING::LANGUAGE > Python' 카테고리의 다른 글
〔백준/파이썬〕11651번 좌표 정렬하기2 (0) | 2022.07.31 |
---|---|
〔프로그래머스/파이썬〕신고 결과 받기 (+딕셔너리 컴프리헨션 사용법) (0) | 2022.07.01 |
〔백준/파이썬〕13305번 주유소 (0) | 2022.06.29 |
〔백준/파이썬〕1931번 회의실 배정 (0) | 2022.06.26 |
〔백준/파이썬〕1157번 단어 공부 (0) | 2022.06.25 |
Comments