일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 장고
- java
- js
- 백준
- AWS
- react
- Git
- DRF
- Django
- 파이썬
- django widget
- MAC
- c++
- 알고리즘
- django ORM
- 알고리즘 연습
- 알고리즘 문제
- javascript
- web
- PYTHON
- Baekjoon
- HTML
- API
- 파이썬 알고리즘
- es6
- Algorithm
- django rest framework
- 알고리즘 풀이
- form
- CSS
- Today
- Total
수학과의 좌충우돌 프로그래밍
클래스와 인스턴스란? (3) 메소드 본문
안녕하세요 강민성입니다.
저번 시간에 이어서 클래스와 인스턴스에 대해서 더 알아보도록 하겠습니다.
오늘 알아볼 개념은 바로 메소드라는 개념입니다.
메소드란?
메소드는 그 전까지 들어본 적이 없지만
우리가 흔히 사용하는 함수라고 생각하면 됩니다.
함수는 함수지만 클래스 안에서 정의되어 클래스의 인스턴스에만
적용될 수 있는 함수를 메소드라고 부릅니다.
우선 저번 시간에 배웠던 내용을
다시 살펴보도록 하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Human(): pass def define_Human(job,age): person = Human() person.job = job person.age = age return person Human.define = define_Human person = Human.define('student',23) def get_older(person): person.age += 1 print("{}의 나이가 {}가 되었습니다".format(person.job,person.age)) Human.older = get_older person.older() # student의 나이가 24가 되었습니다 | cs |
Human class를 만들어주고
사람을 정의하는 함수, 나이 먹는 함수를 만든 후,
각각을 Human class의 함수로 만들어주었습니다.
그 후 Human class의 인스턴스인 person을 만들면
older 함수로 호출할 수 있었습니다.
하지만 다음과 같이 빈 클래스를 만들고
함수를 따로 만들고
함수를 클래스의 함수로 대입하는 과정이 번거로워 보입니다.
그래서 클래스 안에 함수를 직접 선언할 수 도 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Human(): def define_Human(job,age): person = Human() person.job = job person.age = age return person def get_older(person): person.age += 1 print("{}의 나이가 {}가 되었습니다".format(person.job,person.age)) person = Human.define_Human('student',23) person.get_older() # student의 나이가 24가 되었습니다 | cs |
다음과 같이 말이죠.
전의 코드에 비해서 짧아지고
더 눈에 잘 들어오는 걸 알 수 있습니다.
파이썬에서는 보통 파이썬의 첫번째 인자는 self 를 사용합니다.
물론 위와 같이 person을 써도 오류가 나지는 않지만
이렇게 쓰자! 라고 정해놓은 약속이라고 보시면 됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Human(): def define_Human(job,age): person = Human() person.job = job person.age = age return person def get_older(self): self.age += 1 print("{}의 나이가 {}가 되었습니다".format(self.job,self.age)) person = Human.define_Human('student',23) person.get_older() # student의 나이가 24가 되었습니다 | cs |
그런데 조금 이상한 점이 있습니다.
get_older 함수는 self 라는 매개변수를 받고 있지만
실제로 함수를 호출 할 때는 아무런 매개변수도 보내지 않고 있습니다.
그 이유는 인스턴스 person이 get_older의 매개변수가 되기 때문입니다.
따라서 인스턴스의 매개변수를 전달 할 때는 self 매개변수는 생략하고 전달을 하면 됩니다.
다음으로는 매개변수를 넘겨줘야 하는 상황을 알아보겠습니다.
Human class에 speak 라는 함수를 하나 더 추가해보았습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Human(): def define_Human(job,age): person = Human() person.job = job person.age = age return person def get_older(self): self.age += 1 print("{}의 나이가 {}가 되었습니다".format(self.job,self.age)) def speak(self, message): print(message) person = Human.define_Human('student',23) person.get_older() # student의 나이가 24가 되었습니다 person.speak("잘 부탁드립니다.") # 잘 부탁드립니다. | cs |
speak라는 메소드는 self와 message 라는 두 개의 매개변수를 받습니다.
따라서 speak를 호출 할 때는 message 에 대한 매개변수 하나만 넘겨주면 됩니다.
다음으로는 이 메소드들 중에서 특수한 메소드를 몇 가지 알아보도록 하겠습니다.
특수한 메소드?
다음으로는 이 메소드들 중에서 특수한 메소드를 몇 가지 알아보도록 하겠습니다.
먼저 첫 번째로 초기화 함수 __init__ 입니다.
언더바 두 개씩 이고 언더바를 두 개씩 붙여주는 이유는
특별한 메소드라는 의미 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Human(): def __init__(self): print("초기화 함수가 실행되었습니다.") def define_Human(job,age): person = Human() person.job = job person.age = age return person def get_older(self): self.age += 1 print("{}의 나이가 {}가 되었습니다".format(self.job,self.age)) person = Human() # 초기화 함수가 실행되었습니다. | cs |
다음과 같이 __init__ 함수를 만든 후
아래서 person이라는 인스턴스를 선언하기만 해도 자동으로
__init__ 함수가 실행이 되는 걸 알 수 있습니다.
즉 __init__ 함수는 인스턴스가 생기는 순간 자동으로 호출이 되는 함수입니다.
그러면 이 __init__ 함수를 사용해서 define_Human 함수를 대체할 수 있을 겁니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Human(): def __init__(self,job,age): print("초기화 함수가 실행되었습니다.") self.job = job self.age = age def get_older(self): self.age += 1 print("{}의 나이가 {}가 되었습니다".format(self.job,self.age)) person = Human("student",23) # 초기화 함수가 실행되었습니다. print("{}은 {}세 입니다.".format(person.job , person.age)) # student은 23세 입니다. | cs |
__init__ 함수에 대하여 매개변수를 넘겨줄 때는
인스턴스를 선언할 때 class의 이름과 같이 넘겨주게 됩니다.
그 결과, job과 age가 잘 초기화 된 걸 볼 수 있습니다.
두 번째로 문자열화 함수 __str__ 입니다.
문자열화 함수란 인스턴스를 string으로 표현할 때 사용합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Human(): def __init__(self,job,age): self.job = job self.age = age def __str__(self): return "현재 {}의 나이는 {}세 입니다.".format(self.job,self.age) def get_older(self): self.age += 1 print("{}의 나이가 {}가 되었습니다".format(self.job,self.age)) person = Human("student",23) print(person) # 현재 student의 나이는 23세 입니다. | cs |
다음과 같이 __str__ 함수를 만들어주고
string을 return 해주면
인스턴스를 print 할 때 return 되는 값이 나오게 됩니다.
단 이 때 return 되는 값은 무조건 string이어야 합니다.
마무리
오늘은 메소드에 대해서 알아보았습니다.
헷갈릴 수는 있지만 차근차근 하다보면
어려운 내용은 없을 겁니다.
오늘도 모두 화이팅 하시구 다음 시간에는 상속에 대해서 알아보겠습니다.
'프로그래밍 언어 > Python' 카테고리의 다른 글
python map() 함수에 대해 알아보자! (0) | 2019.01.01 |
---|---|
문자열 함수 find와 index (2) | 2018.12.30 |
Scoping , LEGB 룰 (0) | 2018.12.01 |
클래스와 인스턴스란? (2) 모델링 (0) | 2018.11.30 |
클래스와 인스턴스란? (1) (0) | 2018.11.30 |