TIL.30 클래스와 메서드 사용하기
## 클래스, 매서드 사용하기
## 클래스란 == 객체를 표현하기 위한 문법으로
예를 들어 게임 상에의 마법수, 궁수, 사제 등 직업별로 클래스를 만들어 표현 할 수 있다.
# 프로그래밍에서의 클래스는 집, 자동차, 나무 우베 브라우저의 스크롤 바, 체크 박스, 버튼 등이 대표적이다.
## 집, 자동차, 스크롤 바, 체크박스 처럼 특정한 개념이나 모양으로 존재하는 것을 객체(object)라고 부른다.
## 프로그래밍의 객체를 만들때 사용하는 것이 클래스이다.
## 게임 케릭터로 예를 들어보자
## 기사 케릭터를 클래스로 표현해보자.
## 기사 케릭터의 직업은 클래스
## 해당 케릭터의 체력, 마나, 공격력 등의 데이터를 클레스의 속성(attribute)
## 이런 기사가 베고 찌르는 등의 기능을 메서드(method)라고 부른다.
## 이러한 프로그래밍 방법을 객체 지향 (object oriented)프로그래밍이라 부르고
파이썬은 객체 지향 프로그래밍 언어이다.
## 객체 지향 프로그래밍은 복잡한 문제를 잘게 나누어 객체로 만들고, 그 객체를 조합해서 문제를 해결한다.
## 이는 현실 세계의 복잡한 문제를 처리하는데 유용하며 기능 개선 및 발전 시에도 해당 클래스만 수정하면 되므로 유지 보수에도 효율적이다.
## 사실 파이썬에서 사용되는 모든 것들은 객체이다.
## 클래스와 메서드 생성하기
# class 클래스이름:
# def 메서드(self):
# 코드
class Person:
def greeting(self):
print('Hello')
## 클래스를 생성할때는 함수를 만드는 방법과 유사하다.
## 여기서 클래스의 이름은 보통 대문자로 시작한다. # () 괄호 없음
## 메서드는 클래스 안에 들어이있는 함수를 말하며 특히, 메서드의 첫 번째 매개변수는 반드시 self로 지정한다.
## 클래스 사용하기
# 인스턴스 = 클래스()
class Person:
def greeting(self):
print('Hello')
james = Person()
## 위와 같이 클래스의 ()를 붙인 뒤 변수에 할당하여 사용할 수 있다.
## 여기서 james 는 Person의 인스턴스(instance)이다.
## 클래스는 특정 개념을 표현만 하기때문에 사용하기 위해선 인스턴스를 생성해야 한다.
## 매서드 호출하기
# 인스턴스.메서드()
class Person:
def greeting(self):
print('Hello')
james = Person()
james.greeting()
::
Hello
## 메서드를 호출 할 경우는 클래스가 아닌 인스턴스를 이용해 호출한다.
## 파이썬에서의 흔히 볼 수 있는 클래스
## 사실 이제껏 사용안 int, list, dict 등도 클래스이다.
(여지껏 클래스, 인스턴스 와 같은 개념을 몰랐을뿐 계속 사용 중 이었다.)
a = int(10)
# 10
b = list(range(10))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
c = dict(x=10, y=20)
# {'x': 10, 'y': 20}
## int 클래스에 10을 넣어 인스턴스 a 를 만듬
## list 클래스에 range(10)을 넣어 인스턴스 b 를 만듬
## dict 클랙스에 x, y 값을 넣어 인스턴스 c 를 만듬
## 리스트 b에 20이라는 값을 추가할때를 생각해보자
b = list(range(10))
b.append(20)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20]
## 즉 파이썬에서는 자료형도 클래스이므로,
여기서는 list 클래스에 range(10)이라는 값을 넣어 인스턴스 b 를 만들고,
이를 통해 메서드를 사용한 것과 같은 방식이다.
### 인스턴스와 객체의 차이점
## 클래스로 만드는 인스턴스는 사실 객체와 같은 뜻을 가지고 있다.
## 보통 "객체만"을 설명할때는 객체로 표현하고, "클래스와 연관지어" 설명할때는 인스턴스라 표현한다.
a = list(range(10))
b = list(range(20))
## 리스트 변수 a, b 는 객체이며// a 와 b 는 list 클래스의 인스턴스이다.
## 빈클래스 만들기
# 빈클래스를 만들때는 코드 부분에 pass를 넣어주면 된다.
class Person:
pass
## 메서드 안에서 메서드 호출하기
class Person:
def greeting(self):
print('Hello'
def hello(self):
self.greeting() # self.메서드() 형식으로 클래스 안의 메서드를 호출
james = Person()
james.hello()
::
Hello
## 메서드 안에서 메서드를 호출할 때는 self.메서드() 형식으로 호출해줘야한다.
## 만약 self 없이 메서드 이름만 사용하면 바깥쪽에 있는 함수를 호출 한다는 뜻이므로 주의하자.
## 특정 클래스의 인스턴스인지 확인하기
## 특정 클래스의 인스턴스가 맞으면 True, 아니면 False를 반환합니다.
# isinstance(인스턴스, 클래스)
class Person:
pass
james = Person()
isinstance(james, Person)
::
True
### isinstance 함수 사용하기
## isinstance는 주로 객체의 자료형을 판단할때 사용하는데, 이를 이용해 if 조건문에 적용시킬수 있다.
def factorial(n):
if not isinstance(n, int) or n < 0: # n이 정수가 아니거나 음수이면 함수를 끝냄
return None
if n == 1:
return 1 # 종료 조건
return n * factorial(n - 1)
a = factorial(3)
print(a)
# 6
## 1부터 n까지 양의 정수를 차례대로 곱하는 팩토리얼 함수를 만들때,
실수와 음의 정수는 계산할 수 없다는 것을 isinstance를 사용하여
정수 일때만 계산하도록 만들 수 있다.