클래스와 인스턴스란? (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이어야 합니다.
마무리
오늘은 메소드에 대해서 알아보았습니다.
헷갈릴 수는 있지만 차근차근 하다보면
어려운 내용은 없을 겁니다.
오늘도 모두 화이팅 하시구 다음 시간에는 상속에 대해서 알아보겠습니다.