Python/OOP
객체
yunajoe
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. 객체들이 서로 어떻게 소통할지 정한다
클래스와 인스턴스
- 객체와 인스턴스는 약간 다르긴 하지만 거의 같다고해도 무방하다(클래스로 객체를 만든다 = 클래스로 인스턴스를 만든다)