안녕하세요, 지난주에는 객체의 속성을 나타내는 변수에 대해 정리하였는데요,
오늘은 객체의 행동을 나타내는 함수(메소드)에 대해 알아보겠습니다!
(메소드에는 인스턴스 메소드, 클래스 메소드, 정적 메소드 3가지가 있습니다. 오늘은 인스턴스 메소드에 대해 알아보겠습니다.)
인스턴스 메소드 : 인스턴스 변수를 사용하거나, 인스턴스 변수에 값을 설정하는 메소드.
class Unit(): def say_hello(some_user): # 인스턴스 메소드 #인사 메시지 출력 (some_user에는 marine1/marine2 등을 넣는다) print("안녕하세요! 저는 {}입니다!".format(some_user.name)) #3개의 marine 객체를 만든다 -> !! marine1/2/3 은 서로 다른 객체이다 marine1 = Unit() marine2 = Unit() marine3 = Unit() #marine1의 속성 추가 marine1.name = "짱구" marine1.email = "JJangu@naver.com" marine1.password = "12345" #marine2의 속성 추가 marine2.name = "철수" marine2.email = "Ironwater@naver.com" marine2.password = "123" #marine3의 속성 추가 marine3.name = "훈이" marine3.email = "hooni@naver.com" marine3.password = "12" Unit.say_hello(marine1) Unit.say_hello(marine2)
위와 같이 Class 이름.메소드 이름(인스턴스) 으로 인스턴스 메소드를 실행할 수 있습니다!
marine1/2가 각각 say_hello 함수에서 some_user로 사용되고, marine1.name / marine2.name이 출력이 됩니다!
여기에 인스턴스 메소드를 사용하는 또 다른 방법이 있습니다.
인스턴스.메소드 이름()
처음 것은 클래스에서 메소드를 호출한 것이고, 두 번째 보여드린 것은 인스턴스에서 메소드를 호출한 것입니다.
여기서 차이점이 보이시나요?
바로 인스턴스에서 메소드를 호출할 때는 메소드의 첫 번째 파라미터로 인스턴스가 자동 반영됩니다!
즉, 파라미터를 따로 써줄 필요가 없습니다. (파라미터를 하나 더 쓰게 된다면 say_hello 함수에 파라미터가 2개가 되어 에러가 발생합니다!)
예제를 보며 설명해 드리겠습니다.
User라는 새로운 클래스를 만들어 say_hello 와 login이라는 인스턴스 메소드를 만들어 보겠습니다.
class User(): def say_hello(some_user): # 인스턴스 메소드 #인사 메시지 출력 (some_user에는 marine1/marine2 등을 넣는다) print("안녕하세요! 저는 {}입니다!".format(some_user.name)) def login(some_user, my_email, my_password): if (some_user.email == my_email and some_user.password == my_password): print("로그인 성공, 환영합니다") else: print("로그인 실패, 없는 아이디이거나 잘못된 비밀번호입니다.") user1 = User() user1.name = "신동훈" user1.email = "hoon@naver.com" user1.password = "1235"
만약 login 인스턴스 함수를 쓸 때 아래처럼 user1 파라미터를 넣어준다면? → 4개를 받았다면서 에러가 발생했습니다!
그럼 user1 파라미터를 빼준다면? → 로그인 성공!
인스턴스.메소드 이름() 이 형식으로 쓴다면 메소드에 파라미터로 인스턴스가 자동 반영되는 것을 잊으시면 안 됩니다!
위에 예제 코드에서는 인스턴스 메소드들의 첫번째 파라미터들은 some_user로 되어있습니다.
인스턴스 자기 자신이 첫 파라미터로 들어가게 되어 앞으로 인스턴스 메소드의 첫 파라미터로는 self를 사용하겠습니다!
(self가 아니더라도 동작하는데 지장은 없지만 개발자들끼리의 커뮤니케이션을 위해 지키는 것이 좋을 것 같습니다!)
추가로 인스턴스 변수에 대해 더 알아 보겠습니다.
class User(): def say_hello(self): # 인스턴스 메소드 #인사 메시지 출력 (some_user에는 marine1/marine2 등을 넣는다) print("안녕하세요! 저는 {}입니다!".format(self.name)) def check_name(self, name): # 파라미터로 받는 name이 유저의 이름과 같은지 불린으로 리턴하는 메소드 return self.name == name user1 = User() user2 = User() user1.name = "짱구" user1.email = "Jangu@naver.com" user1.pw = "1234" user2.name = "철수" user2.email = "Ironwater@naver.com" user2.pw = "123"
위에 내용에서 check_name 메소드의 return 값으로 self.name == name 이 있는데요,
이 두 개는 서로 다른 name이므로 상기 식은 틀린 것이 아닙니다.
앞의 self.name의 name은 인스턴스의 name 값이고 뒤에 name은 함수 안에서 사용하는 값이기 때문입니다!
코드를 보여드리며 추가 설명하겠습니다.
첫 번째를 먼저 보면 self는 user1이 되고 self.name은 "짱구"가 됩니다. 뒤에 함수 파라미터로 받은 "짱구"와 같다! True!
두 번째를 보면 self는 user2가 되고 self.name은 user2의 name이므로 "철수"이고 파라미터로 받은 "짱구"와 달라 False!
'Python > 객체지향 및 자료구조' 카테고리의 다른 글
가변 타입 / 불변 타입 (0) | 2021.07.04 |
---|---|
클래스 메소드 (0) | 2021.07.03 |
__str__ 메소드 (0) | 2021.05.10 |
__init__ 메소드 (0) | 2021.05.08 |
객체(인스턴스)/객체 지향 프로그래밍 (0) | 2021.05.06 |
댓글