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. 객체들이 서로 어떻게 소통할지 정한다 

 

 

클래스와 인스턴스 

- 객체와 인스턴스는 약간 다르긴 하지만 거의 같다고해도 무방하다(클래스로 객체를 만든다 = 클래스로 인스턴스를 만든다)