ABOUT ME

-

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

     

     

    클래스와 인스턴스 

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

     

     

     

     

    댓글

Designed by Tistory.