ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python: 객체지향언어? 클래스(class)? 기초 공부하기!
    Python 2020. 8. 15. 17:31

    클래스(class)를 공부하기 위해서는 먼저 객체지향언어에 대해서 알아야 합니다.

     

    왜냐하면 파이썬은 순수 객체지향언어이기 때문이죠

     

    우선 객체란 무엇일까요? 

     

    객체는 '속성과 동작'을 가진 어떤 것을 의미합니다. 사실상 세상의 모든 것입니다.

     

    길바닥에 굴러다니는 돌도 객체라고 할 수 있고, 이 블로그도 하나의 객체라고 할 수 있습니다. 

     

    객체는 각각 속성동작을 지니는데 

     

    이러한 객체들간의 소통을 담은 언어가 객체지향언어입니다. 

     

    돌맹이도 객체~

     

     

    예를 들어 기차역에서 승차권을 발매하는 경우, '객체'인 손님과 '객체'인 역무원은 소통을 함으로써

     

    '객체'인 승차권을 얻습니다. 손님은 승차권을 이용해서 '객체'인 기차를 이용합니다. 

     

    이렇게 객체들은 소통합니다. 그리고 이러한 소통을 담은 언어가 객체지향언어입니다. 

     

     

     

    참고로 객체지향 프로그래밍과는 전혀 다른 방식으로 프로그래밍 하는 것을 절차 지향 프로그래밍이라고 합니다.

     

    말 그대로 절차를 중시해서 프로그램을 명령어 순서대로 실행하는 것으로 봅니다. 

     

    만약 데이터와 동작의 연관성이 높고 이걸 객체라는 단위로 묶는 것이 낫다면

     

    객체 지향 프로그래밍을 하는게 좋겠죠? 

     

     

     

    객체지향언어에서는 class라는 개념이 빠질 수 없는데 

     

    class는 쉽게 말하면 객체를 만드는 설계도입니다.

     

    예를 들어 자동차라는 class가 있을 때 자동차가 가지는 속성과 동작을 가지고 있는 설계도이고

     

    이 설계도를 이용해서 다양한 차들을 만들어 냅니다.

     

     

     

     

     

    실습으로 제 블로그의 사용자를 나타내는 클래스 User를 만들어보겠습니다.

     

    우선 User는 블로그의 사용자로 사용자가 갖는 속성, 동작들을 갖고 있어야 합니다. 

     

    User는 이름, 이메일, 비밀번호라는 속성을 갖고 있으며

     

    인사하기, 로그인, 이름 변경이라는 동작을 할 수 있다고 생각해 봅시다.

     

    class User:
    
    
        def __init__(self, name, email, password):
            self.name = name
            self.email = email
            self.password = password
            # 생성시 바로 호출되는 특수 메소드입니다. 생성자라고 합니다.
    
    
    
        def __str__(self):
            return "이름: {}, 이메일: {}, 패스워드: ******".format(self.name, self.email)
            # print(객체명)을 하면 출력되는 특수 메소드입니다. 
    
    
    
        def say_hello(self):
            print("안녕하세요 저는 {}입니다.".format(self.name))
            #인사하기 동작을 담은 메소드입니다. 
    
    
    
        def login(self, email, password):
        
            if self.email == email and self.password == password:
                print("로그인 성공")
    
            else:
                print("로그인 실패")
            # 로그인 동작을 담은 메소드입니다.     
            
    
    
        def change_name(self, name):
            self.name = name
            # 이름을 바꿀 때 쓰는 메소드입니다. 
            

     

    init과 str의 앞 뒤로 언더바가 두개씩 있는데 이는 특수 메소드임을 의미합니다.

     

    특수메소드는 일반 메소드처럼 직접 호출해서 사용할 수도 있지만 말 그대로 '특수'하게

     

    호출되어 사용됩니다.

     

    init은 객체 생성될 때 작동하고

     

    str은 객체를 출력할 때 작동합니다. 

     

     

     

     

     

    user1이라는 객체를 다음과 같이 만들어줍니다.

     

    __init__ 메소드를 만들어주면 __init__ 메소드의 정해진 형식으로 객체를 생성합니다. 

     

    user1 = User("김판다", "panda1234@daum.net", "123456") # 객체생성
    user1.login("panda1234@daum.net", "123456") # 로그인합니다.
    user1.say_hello() # 인사합니다.
    user1.change_name("제갈판다") # 제갈판다로 이름변경을 해줍니다. 
    user1.say_hello() # 인사합니다. 
    print(user1) # 객체의 최종정보를 확인합니다. 

     

    로그인 성공
    안녕하세요 저는 김판다입니다.
    안녕하세요 저는 제갈판다입니다.
    이름: 제갈판다, 이메일: panda1234@daum.net, 패스워드: ******
    
    Process finished with exit code 0

     

     

     

     

     

    참고로 이렇게 클래스 밖에서 직접 클래스에 없는 변수를 만들어줄 수도 있습니다. 

     

    user1.age = 20
    print("user1의 나이: {}".format(user1.age))

     

    user1의 나이: 20

     

     

     

     

     

    이번엔 블로그 사용자의 수를 알아보고 싶습니다. 

     

    객체가 생성될 때마다 사용자수를 증가시키면 됩니다. 

     

    위의 코드에 count라는 변수를 추가해준 후, 

     

    생성자에 User.count += 1를 추가합니다.

     

    class User:
    
        count = 0
      
        def __init__(self, name, email, password):
            self.name = name
            self.email = email
            self.password = password
            User.count += 1
    
    
        def __str__(self):
            return "이름: {}, 이메일: {}, 패스워드: ******".format(self.name, self.email)
    
    
        def say_hello(self):
            print("안녕하세요 저는 {}입니다.".format(self.name))
    
    
        def login(self, email, password):
        
            if self.email == email and self.password == password:
                print("로그인 성공")
    
            else:
                print("로그인 실패")
    
    
        def change_name(self, name):
            self.name = name
    
    
        @classmethod
        def number_of_users(cls):
            print("유저의 수는 {}입니다.".format(cls.count))

     

    마지막에 @classmethod로 데코레이팅되어있는데

     

    이는 number_of_users 메소드가 클래스메소드라는 것을 의미합니다. 

     

    주로 메소드 안에 객체의 속성을 지닌 변수가 없을 때, 클래스메소드로 만들어 사용합니다.

     

    그래서 객체가 아닌 클래스로 접근가능합니다. 

     

    데코레이터에 대한 자세한 설명은 여기있습니다.

     

    Python: 파이썬 데코레이터(Decorator) 공부하기!

    파이썬의 데코레이터 기능에 대해 알아봅시다. Decorate의 사전적 의미는 장식하다, 꾸미다 이러한 의미인데요 그렇다면 파이썬에서 데코레이터(decorator)는 어떠한 역할을 할까요? 데코레이터는 ��

    seungjuitmemo.tistory.com

     

     

     

     

     

    user1 = User("김판다", "panda1234@daum.net", "123456")
    user2 = User("김철수", "abcabc@naver.com", "223232")
    user3 = User("김영희", "abc222@naver.com", "444432")
    
    print(user1)
    print(user2)
    print(user3)
    
    print(user1.count)  
    print(user2.count)
    print(user3.count)
    # user1, 2, 3 모두 count라는 변수를 공유하기 때문에 같은 값을 출력합니다. 
    
    User.number_of_users()  # @classmethod로 데코레이팅하면 클래스로 접근해 사용할 수 있습니다.
    user1.number_of_users() # 물론 객체를 통해서도 접근할 수 있습니다.

     

    이름: 김판다, 이메일: panda1234@daum.net, 패스워드: ******
    이름: 김철수, 이메일: abcabc@naver.com, 패스워드: ******
    이름: 김영희, 이메일: abc222@naver.com, 패스워드: ******
    3
    3
    3
    유저의 수는 3입니다.
    유저의 수는 3입니다.
    
    Process finished with exit code 0
    

     

    count 라는 변수는 객체들이 공유하는 속성이기 때문에 어떤 객체의 count를 조사하던 같은 값을 출력합니다. 

     

    항상 같은 값을 출력하기 때문에 number_of_users를 classmethod로 사용한 이유도 여기있습니다. 

     

    반응형

    댓글

Designed by Tistory.