겉바속촉

[PYTHON] 파이썬_객체 지향 프로그래밍 본문

IT 일기 (상반기)/PYTHON

[PYTHON] 파이썬_객체 지향 프로그래밍

겉바속촉 2021. 1. 7. 15:21
728x90
반응형

 

안녕하세요

겉바속촉입니다

!^^!

 

 

!!파이썬 시작하기!!

 

 

 

 

이번에는

객체 지향 프로그래밍에 대해서

알아보도록 하겠습니다

 

 

 

 

 

 


 

객체 지향 프로그래밍

 

 

기본단계

 

  1. 문제 도메인 이해
  2. 필요한 타입 알기
  3. 타입에 필요한 특징 알기
  4. 타입 표현하는 클래스 작성
  5. 코드 테스트

 

 

 

isinstance 함수, class 객체, Book 클래스

 

  • isinstance(obj, class_or_tuple, /) 
  • 객체가 어떤 클래스의 인스턴스 여부를 확인
  • 모든 클래스는 최상위인 object 클래스로부터 상속받음
  • 클래스와 함수도 object의 인스턴스

 

 

 

 

 

object 클래스

 

  • 모든 클래스의 상위 클래스
  • 파이썬 내 모든 클래스는 object 클래스의 속성(attribute)을 자동 상속받음

 

보통 object의 구조는 다음과 같습니다.

 

 

object를 상속받은 book 클래스!!! 설명 달아준 후에

Book 클래스 구조를 살펴봤습니다.

 

그랬더니 구조가 약간 차이가 생겼습니다.

 

 

 

__dict__,  __module__,  __weakref__   <--- 3가지의 속성이 추가되었군요!!

 

 

 

북클래스의 구조에서 오브젝트의 구조를 각각 리스트로 반환하여

set 구조로 바꿨습니다.

차집합 연산을 통해 보니

추가된 속성들에 대해 확인할 수 있네요!!

 

 

 

 

클래스 작성시에는 다음과 같이 작성합니다

class 클래스명: 아무것도 입력안하면 object 상속받았다는 것

class 클래스명: 뭔가를 상속받았다면 (상속 클래스)

 

 

 

 

 

Book 클래스

 

  • Book 객체를 생성해서 객체에 제목과 저자 목록을 설정
  • 스페셜 속성

    __dict__    :    인스턴스 변수와 그 값을 기록하는 딕셔너리, 
                      인스턴스 변수를 새롭게 할당할 때마다 객체의 딕셔너리 내용 바뀜

    __module__   :   객체의 클래스가 정의된 모듈 객체 참조

    __weakref__   :   파이썬이 객체의 메모리를 재사용할 수 있도록 관리하는 용도의 변수

    __name__ ,  __qualname__   :  클래스의 간단한 이름과 전체 이름

    __class__  :  객체의 클래스 객체를 참조


 

 

즉, Book 클래스 구조에 대해서 살펴보겠습니다

 

Book 클래스 = Book

Book 인스턴스 = title, authors  --> 이 변수들은 각각의 객체를 가리킵니다

 

 

 

 

Book 클래스 메서드

 

메서드 호출 방법 

 

(1) 클래스를 통해 메서드에 접근  ---> 권장하지 않음 

>>> str.capitalize('browning')

 

(2) 객체 지향 문법을 사용

>>> 'browning'.capitalize()
  • 인스턴스 생성 후 그 내부의 속성이나 메서드 호출 및 접근 할때는  해당 인스턴스. 메서드 방식활용

 

 

 

메서드 정의

 

  • __init__ 메서드 = 생성자 --> 인스턴스 (보통 초기화 용도로 사용_그래서 초기화 로직들을 넣어줍니다)

 

우선 다음과 같이 코드를 작성했습니다

from typing import List, Any

class Book:
    '''제목, 저자 목록, 출판사, ISBN, 가격을 포함하는 책 정보'''

    def __init__(self, title: str, authors: List[str], publisher: str, isbn: str, price: float) -> None:
        print("init called")

        self.title = title
        self.authors = authors
        self.publisher = publisher
        self.isbn = isbn
        self.price = price


    def print_authors(self) -> None:
        '''저자 목록을 출력'''

        for author in self.authors:
            print(author)
            
  my_book = Book('MyBook', ['aaa', 'bbb', 'ccc'], '한빛출판사', '123-456-789', '30000')

 

실행시켜봤더니 __init__ 메서드가 자동 호출되어 그 메서드 내부의 print값이 출력되었네요

 

 

여기서 알아야할 것은 우리가 별도로 __init__메서드를 호출하지 않아도

book이라는 클래스에 인스턴스만 만들어도 자동호출된다는 것!!!

 

===> 이게 바로 생성자!!!

===> 그리고 이것의 기능은 변수들을 초기화하는 것!!!

 

 

 

그럼 이번에 print_authors를 호출하고 싶다면 다음 코드 입력!

my_book.print_authors()

 

실행시켰더니 다음과 같이 나오네요

 

 

이번에는 살짝 코드를 수정해줄게요

 

__init__ 메서드 내부에서 self.authors = authors 부분을  self.authors = authors[:]로 고치기

 

 

from typing import List, Any

class Book:
    '''제목, 저자 목록, 출판사, ISBN, 가격을 포함하는 책 정보'''

    def __init__(self, title: str, authors: List[str], publisher: str, isbn: str, price: float) -> None:
        print("init called")

        self.title = title
        self.authors = authors[:]
        self.publisher = publisher
        self.isbn = isbn
        self.price = price


    def print_authors(self) -> None:
        '''저자 목록을 출력'''

        for author in self.authors:
            print(author)
            
  my_book = Book('MyBook', ['aaa', 'bbb', 'ccc'], '한빛출판사', '123-456-789', '30000')
  my_book.print_authors()

 

그래도 아까의 결과랑 동일하게 나오네요

 

 

 

 

그럼 도대체 두가지의 차이가 뭘까요?? 결과는 동일한데요!!

아래 출력 내용을 다음과 같이 고칠게요

 

authors = ['aaa', 'bbb', 'ccc']
my_book = Book('Book', authors, '한빛출판사', '123-456-789', '30000')
my_book.print_authors()

authors[0] = 'ddd'
my_book.print_authors()

 

 

1.  self.authors = authors 일때 출력 결과

==> 즉, 주소를 할당하기 때문에 클래스 외부에서 값을 변경하면 저장된 값이 변해버립니다.

 

 

 

2. self.authors = authors[:] 일때 출력 결과

==> 즉, 주소가 아닌 값을 할당하기 때문에 아랫부분에서 값을 변경하더라도 값이 변하지 않습니다

 

 

 


 

 

  • __str__ 메서드  :  데이터를 외부에 문자열로 표현하고자할 때 호출하는 메서드
  • __eq__ 메서드  :  bool 조건에 대해 논리적으로 판단하는 기준을 재정의 하겠다는 메서드

 

 

__eq__ 메서드 연습

 

다음과 같이 설정해준 후에 출력시켜볼게요

 

내용이 동일하게 들어있음에도 my_book과 your_book은 다르다고 출력이 되네요

 

 

__eq__메서드 부분을 고친 후에

other가 Book의 인스턴스면 같다고 할게!! 라고 한것입니다

 

출력해봤더니 다음과 같습니다

 

하지만 이제 문제는 다음과 같이 입력해주어도 New Book 역시 Book의 인스턴스라서

내용이 달라졌음에도 둘이 같다고 출력되버립니다

 

 

그래서 다시 다음과 같이 고친 후에 출력!!

 

self의 title과 other의 title이 같을 때에만 같다고 하겠다는 것

 

 

사실 원래 인스턴스 주소가 다른 경우 같은 플레이스의 객체라도 다르다고 판단합니다

하지만 __eq__ 메서드 사용해서 재정의해주는 것이쥬!!!

 

 

 

728x90
반응형