ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [python] 객체 지향 프로그래밍, 간단한 클래스의 정의와 활용, 내장 함수 isinstance, 매직 메소드(magic method)
    Languages/python 2021. 6. 5. 17:15
    반응형

     

     

     

     

     

     

     

     

    객체 지향 프로그래밍

     

    속성(attribute)과 행위(behaviors)로 구성된 객체를 만든 후 객체 간의 상호 작용으로 프로그래밍을 구현하는 방식

     

     

    객체(object)는 무엇일까?

     

    예를 들어 학사정보관리 시스템을 구현

    학사정보관리 시스템과 관련된 현실 세계의 모든 것(thing)

    - 즉, 사물과 개념이 바로 객체

    즉, 학생과 교수, 교과목, 강의실 등이 모두 객체

     

     

     

     

    클래스와 객체

     

    클래스(class)

     

    객체를 만들어 내기 위한 틀(template) 또는 설계도(blueprint)

    클래스 내부는 객체들이 가져야 할 속성(attributes)과 행위(behaviors)로 구성

    속성

    객체의 상태를 정의

    행위

    객체가 취할 수 있는 행동인 절차

    실제 코딩에서 속성은 변수, 행위는 클래스 내부의 함수인 메소드로 구현

     

    객체

    클래스로부터 만들어진 구체적 실체, 자신만의 고유한 속성과 메소드로 구성

    객체를 클래스의 실례인 인스턴스라고도 부름

     

    만일 자동차를 표현한 클래스 Car

    실제 구체적인 차량이 바로 객체

    ex)

    객체1 -> car1

    객체2 -> car2

       ...

     

     

     

     

    간단한 클래스 정의와 확인

     

     

    사람의 정보를 담을 클래스 person을 정의

    class person:

         pass

         ...

     

     

     

    클래스의 다양한 정보

     

    클래스 person을 정의

    삼중 따옴표로 클래스를 설명하는 문자열을 기술

     

    클래스 person을 내장 함수dir로 확인

    위 내용 중 _dict_ 는 객체나 클래스의 속성을 저장하는데 사용되는 사전(dictionary)

     

    클래스 person으로 살펴보면 문서화로 지정한 문자열이 키 값 '_doc_'로 지정

     

     

     

    생성된 객체에 속성 지정

     

    사람의 이름을 저장할 속성 name에 '홍길동'을 저장하고 출력

    마침표(.)를 사용

    객체의 소속된 변수나 메소드를 참조

     

    he = person()
    he.name = '홍길동'
    print(he.name)
    
    >>> 홍길동
    

     

     

    내장 함수 isinstance

     

    객체의 클래스 여부를 확인

    instance(객체, 클래스)는 객체가 클래스의 인스턴스 여부를 알 수 있음

     

     

    print(isinstance(he,Person))
    >>> True
    print(isinstance(she,Person))
    >>> False
    

     

     

     

    예제) 간단한 클래스의 정의와 활용

     

    class Person:
        pass
    
    def hello(p):
        print("%s이 인사하네요." % p.name)
    
    Person.hello = hello
    
    he = Person()
    he.name = '홍길동'
    he.age = 26
    print(he.name, he.age)
    he.hello()
    print(isinstance(he, Person))
    
    she = Person()
    she.name = '김옥순'
    she.age = 23
    print(she.name, she.age)
    she.hello()
    print(isinstance(she, Person))
    
    
    =================== RESTART: C:/Users/파이썬 연습과제/sagdasfg.py ==================
    홍길동 26
    홍길동이 인사하네요.
    True
    김옥순 23
    김옥순이 인사하네요.
    True
    >>> 

     

     

     

     

     

    클래스 singer

     

    메소드 introduce()

    반드시 클래스 내부에서 들여쓰기가 필요

    첫 인자는 반드시 self를 사용

    self는 클래스 내부에서 각각의 인스턴스인 객체를 표현하는 키워드

    메소드 구현에서 self.name은 객체에 지정된 속성 name을 참조

     

    class singer:
    	''' 가수를 표현하는 클래스 '''
        def introduce(self):
        	print('안녕하세요: 가수 %s입니다' % self.name)

     

     

    클래스 singer의 객체 iyou를 생성

     

    메소드 구현의 첫 인자인 self는 메소드 호출 시 기술할 필요가 없는 인자

    객체 자체가 self에 전달되기 때문

    iyou = Singer()
    iyou.name = '아이유'
    iyou.introduce()
    
    >>> 안녕하세요! 가수 아이유입니다.

     

     

     

     

     

     

    초기화 메소드 구현

     

    초기화 메소드 __init__(self, ...)

    객체를 만들 때 호출되는 특별한 메소드로, 주로 속성 값을 저장하는 초기화를 수행

     

    class Singer:
    
        def __init__(self, name, debut):
            self.name = name
            self.debut = debut
    
        def introduce(self):
            print('안녕하세요! 가수%s입니다.' % self.name)
        def age(self):
            print('데뷔한지 %d년이에요!' % (2020 - self.debut + 1))
    
    iyou = Singer('아이유',2008)
    iyou.introduce()
    iyou.age()
    
    
    =================== RESTART: C:/Users/파이썬 연습과제/sagdasfg.py ==================
    안녕하세요! 가수아이유입니다.
    데뷔한지 13년이에요!
    >>> 

     

     

     

     

    매직 메소드(magic method)

     

    초기화 메소드 __init__() 와 같이 더블 언더스코어로 불리는 밑줄 두개인 _로 시작하고

    종료하는 특수 메소드

    매직 메소드인 초기화 메소드에서도 필요하면 인자에 기본값 지정 가능

     

     

     

    예제) 더블 언더스코어가 붙은 특수 메소드

     

     

    class Circle:
    
        def __init__(self,radius = 1):
            self.radius = radius
    
        def __str__(self):
            return '원 반지름: {}'.format(self.radius)
    
        def __eq__(self,other):
            if self.radius == other.radius:
                return True
            else:
                return False
    
        def setradius(self, radius):
            self.radius = radius
    
        def getradius(self):
            return self.radius
    
        def area(self):
            return self.radius * self.radius * 3.14
    
        def perimeter(self):
            return 2 * self.radius * 3.14
    
    c1 = Circle(10)
    print('원 반지름:%.2f' % c1.getradius())
    print('원 면적:%.2f' % c1.area())
    print('원 둘레:%.2f' % c1.perimeter())
    print(c1)
    
    c2 = Circle()
    c2.setradius(20)
    c3 = Circle(10)
    print(c1 == c2)
    print(c1 == c3)
        
    
    =================== RESTART: C:/Users/파이썬 연습과제/sagdasfg.py ==================
    원 반지름:10.00
    원 면적:314.00
    원 둘레:62.80
    원 반지름: 10
    False
    True
    >>> 

     

     

     

     

     

    외부에서 참조할 수 없는 속성과 메소드

     

    __속성, __메소드

     

    더블 언더스코어를 붙이면 클래스 외부에서 참조 불가능

    외부 참조를 제한하는 비공개 속성과 메소드

    이름에 __와 같은 제한이 없다면 public개념으로 외부에서 모두 참조 가능

     

    속성 __GPA는 외부에서 참조할 수 없으며, 속성 name은 참조 가능

     

     

    데커레이터(decorator)

     

    정적 메소드는 메소드 헤드 문장 위에 @staticmethod를 기술

    정적 메소드는 객체 뿐 아니라 클래스에서도 직접 접근

    인자는 첫 번째 인자로 self 없이 실제로 필요한 인자를 기술

     

     

    데커레이터 @classmethod로 정의하는 클래스 메소드

     

     

    class Shape:
        PI = 3.141592
    
        @classmethod
        def circlearea(cls, r):
            return r * r * cls.PI
    
        @staticmethod
        def circleperimeter(r):
            return 2 * r * Shape.PI
    
    print('%.2f' % Shape.circlearea(3.2))
    print('%.2f' % Shape.circleperimeter(3.2))
    
    s = Shape()
    print('%.2f' % s.circlearea(2.8))
    print('%.2f' % s.circleperimeter(2.8))
    
    
    =================== RESTART: C:/Users/파이썬 연습과제/sagdasfg.py ==================
    32.17
    20.11
    24.63
    17.59
    >>> 

     

    반응형

    댓글

Designed by Tistory.