수학과의 좌충우돌 프로그래밍

클래스와 인스턴스란? (3) 메소드 본문

프로그래밍 언어/Python

클래스와 인스턴스란? (3) 메소드

ssung.k 2018. 12. 1. 13:47



안녕하세요 강민성입니다.


저번 시간에 이어서 클래스와 인스턴스에 대해서 더 알아보도록 하겠습니다.


오늘 알아볼 개념은 바로 메소드라는 개념입니다.




메소드란?



메소드는 그 전까지 들어본 적이 없지만


우리가 흔히 사용하는 함수라고 생각하면 됩니다.


함수는 함수지만 클래스 안에서 정의되어 클래스의 인스턴스에만


적용될 수 있는 함수를 메소드라고 부릅니다.



우선 저번 시간에 배웠던 내용을


다시 살펴보도록 하겠습니다.


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이어야 합니다.





마무리



오늘은 메소드에 대해서 알아보았습니다.


헷갈릴 수는 있지만 차근차근 하다보면 


어려운 내용은 없을 겁니다.


오늘도 모두 화이팅 하시구 다음 시간에는 상속에 대해서 알아보겠습니다.




Comments