-
객체Python/OOP 2022. 9. 17. 13:29
객체?!
- 속성(변수)과 행동(메서드)으로 이루어진 존재
ex) 인스타그램 유저 객체 속성: 이메일 주소, 비밀번호, 친구목록 행동: 좋아요를 누르는 행동, 친구를 추가/삭제 하는 행동
변수
1. 인스턴스변수
- 인스턴스가 개인적으로 가지고 있는 속성
2. 클래스 변수
- 여러 인스턴스들이 공유하는 속성
# 인스턴스 변수 #
# 클래스 이름의 첫번째 글자는 무조건 대문자로! class User: pass # 3개의 인스턴스는 다르다 user1 = User() user2 = User() user3 = User() # 인스턴스 변수 정의하기 ''' 인스턴스이름.속성이름(인스턴스변수) = "속성에 넣을 값" ''' user1.name = "yuna1" user1.email = "yunajoe@gmail.com" user1.password = "1234" user2.name = "yuna2" user2.email = "yunajoe2@gmail.com" user2.password = "4321" user3.name = "yuna3" user3.email = "yunajoe3@gmail.com" user3.password = "1432" # 인스턴스 변수 사용하기 ''' 인스턴스이름.인스턴스변수이름 ''' print(user1.name) # yuna1 print(user1.email) # yunajoe@gmail.com print(user1.password) # 1234 # 만약 정의되어 있지 않은 변수를 사용하면은, 오류가 난다 # 따라서 인스턴스 변수를 사용하기 전에는 정의를 해 줘야 한다 print(user1.coffee) # AttributeError: 'User' object has no attribute 'coffee'
2. 클래스 변수
메소드(method)
1. 인스턴스 메소드
- 인스턴스 변수를 사용하거나, 인스턴스 변수에 값을 설정하는 메소드
2. 클래스 메소드
3. 정적 메소드
# 인스턴스 메소드 #
# 클래스 이름의 첫번째 글자는 무조건 대문자로! class User: def say_hello(user): print("안녕하세요 저는 {}입니다".format(user.name)) user1 = User() user2 = User() user3 = User() user1.name = "yuna1" user1.email = "yunajoe@gmail.com" user1.password = "1234" user2.name = "yuna2" user2.email = "yunajoe2@gmail.com" user2.password = "4321" user3.name = "yuna3" user3.email = "yunajoe3@gmail.com" user3.password = "1432" # 인스턴스 메서드 사용하기1 - 클래스를 사용 # 클래스이름.메소드이름(인스턴스) User.say_hello(user1) # 안녕하세요 저는 yuna1입니다 # 인스턴스 메소드 사용하기2 - 인스턴스를 사용 # 인스턴스이름.메소드이름() user1.say_hello() # 안녕하세요 저는 yuna1입니다 # user1이라는 인스턴스가 say_hello(user1)로 자동으로 전달. 따라서 parameter를 써줄 필요 없다 # 만약 user1.say_hello(user1)를 전달하면은 오류가 난다 ==> TypeError: say_hello() takes 1 positional argument but 2 were given # user1.say_hello(user1) == User.say_hello(user1,user1)
규칙 1 => 첫번재 parameter 이름을 self라고 하자
# 인스턴스 메서드는 첫번째 parameter로 인스턴스를 받는다 class User: def say_hello(some_user): 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 = "yuna" user1.email = "yunajoe@gmail.com" user1.password = "1234" user1.login("yunajoe@gmail.com", "1234") # 로그인 성공 user1.login(user1,"yunajoe@gmail.com", "1234") # TypeError: login() takes 3 positional arguments but 4 were given # 첫번쨰 parameter를 이름을 self 라고 변경하자(규칙) class User: def say_hello(self): print("안녕하세요 저는 {}입니다".format(self.name)) def login(self, my_email, my_password): # 로그인 메소드 if (self.email == my_email and self.password == my_password): print("로그인 성공, 환영합니다") else: print("로그인 실패, 없는 아이디거나 잘못된 비밀번호입니다")
규칙 2 => 인스턴스변수와 같은 이름을 갖는 parameter
class User: def say_hello(self): print("안녕하세요 저는 {}입니다".format(self.name)) def check_name(self, name): return self.name == name user1 = User() user1.name = "yuna" user1.email = "yunajoe@gmail.com" user1.password = "1234" print(user1.check_name('yuna')) # True
실습
# 인스턴스 변수들의 초기값 설정하기 class User: def initialize(self, name, email, password): self.name = name self.email = email self.password = password user1 = User() user1.initialize("Young", "young@codeit.kr", "123456") user2 = User() user2.initialize("Yoonsoo", "yoonsoo@codeit.kr", "abcdef") # 위에것을 __init__메서드로 class User: def __init__(self, name, email, password): self.name = name self.email = email self.password = password user1 = User("yuna", "yunajoe@gmail.com", "1234") ''' 인스턴스를 생성한 순간!(user1) __init__메소드가 자동 호출된다 user인스턴스, user1이 self로 들어가고 'yuna', 'yunajoe@gmail.com", "1234"가 차례대로 name, email, passwor로 들어간다 ''' print(user1.name) # yuna print(user1.email) # yunajoe@gmail.com print(user1.password) # 1234
객체 지향 프로그래밍?!
- 프로그램을 여러 개의 독립된 객체들과 그 객체들 간의 상호작용으로 파악하는 프로그래밍 접근법. 즉, 프로그램을 객체들과 객체들 간의 소통으로 바라보는 것
객체지향으로 설계하기(Modeling)
1. 프로그램에 어떤 객체들이 필요하지 정한다
2. 객체들의 속성과 행동을 정한다
3. 객체들이 서로 어떻게 소통할지 정한다
클래스와 인스턴스
- 객체와 인스턴스는 약간 다르긴 하지만 거의 같다고해도 무방하다(클래스로 객체를 만든다 = 클래스로 인스턴스를 만든다)
'Python > OOP' 카테고리의 다른 글
객체지향프로그래밍의 4가지 기둥 - 다형성(polymorphism) (0) 2022.12.11 객체지향프로그래밍의 4가지 기둥 - 상속(inheritance) (0) 2022.12.11 객체지향프로그래밍의 4가지 기둥 - 캡슐화(Encapsulation) (0) 2022.12.11 객체지향프로그래밍의 4가지 기둥 - 추상화(Abstraction) (0) 2022.12.11 __str__ vs __repr__ (0) 2022.11.27