본문 바로가기
Python/객체지향 및 자료구조

인스턴스 메소드 / 변수

by hooni40 2021. 5. 7.
728x90
반응형

안녕하세요, 지난주에는 객체의 속성을 나타내는 변수에 대해 정리하였는데요,

오늘은 객체의 행동을 나타내는 함수(메소드)에 대해 알아보겠습니다!

(메소드에는 인스턴스 메소드, 클래스 메소드, 정적 메소드 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)

 

 

Replit 에서 실행 결과

 

위와 같이 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!

 

728x90
반응형

'Python > 객체지향 및 자료구조' 카테고리의 다른 글

가변 타입 / 불변 타입  (0) 2021.07.04
클래스 메소드  (0) 2021.07.03
__str__ 메소드  (0) 2021.05.10
__init__ 메소드  (0) 2021.05.08
객체(인스턴스)/객체 지향 프로그래밍  (0) 2021.05.06

댓글