0126_TIL

이종현·2022년 1월 26일
0

TIL

목록 보기
9/20
post-thumbnail

객체 지향 프로그래밍 (OOP)

파이썬은 모든 것이 객체
객체 =>"어떤 것 "

  • 객체 : 클래스에서 정의한 것을 토대로 메모리 (실제 저장공간) 에 할당 된 것
  • 컴퓨터 프로그래밍의 패러다임 중 하나, 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립 된 "객체"들의 모임으로 파악

인스턴스 : 클래스로 만들어진 객체 (개념)
ex) 클래스 => 붕어빵 틀 (설계도)
인스턴스 => 붕어빵 (만들어 진 것)

클래스 = 타입


객체를 생성하는 방법


인스턴스를 만드는 방법

  • 리터럴 ( literal ) 방식
#리터럴 방식
#별도의 클래스를 호출하지 않고 객체를 생성하는 방법
a = 123
b = True
  • 직접 클래스를 인스턴스를 만드는 방법
# 클래스 정의하기 ( = Type 정의하기 )
class Person:
    name = 'Jonghyun'

person_1=Person()

##=> Person 이라는 클래스(타입)이 생기게 된다.

print(type(person_1))
>>>
<class '__main__.Person'>
## isinstance(a,b) a 가 b의 클래스로 이루어져 있니?
print(isinstance(person_1,Person))
>>>
True
# 클래스 정의하기 ( = Type 정의하기 )
class Person:
    name = 'Jonghyun'
    # 클래스 안에 정의된 함수 -> 메소드
    def run(self):
        print('헥헥')

person_1=Person()
person_1.run()

##=> Person 이라는 타입이 생기게 된다.

print(type(person_1))
print(isinstance(person_1,Person))

OOP 기초

기본 문법

  • 클래스 정의 : class Myclass:
  • 인스턴스 생성 : my_instance = Myclass()
  • 메소드 호출 : my_instance.my_method()
  • 속성 : my_instance.my_attribute

클래스 와 인스턴스

  • 클래스 (타입) : 객체들의 분류
  • 인스턴스 : 하나하나의 실체 / 예 (instance)

속성

  • 특정 데이터 타입/클래스의 객체들이 가지게 될 상태/데이터를 의미
    - ex) init ,gt

메소드

  • 특정 데이터 타입/클래스의 객체에 공통적으로 적용 가능한 행위
    -ex) .sort()

객체 비교하기

  • ==
    - 동등한
    • 클래스 간의 비교는 구현을 해줘야 한다.(속성을 줘야한다.)
  • is
    - 동일한
    • **메모리 주소값이 동일 한 지 확인

생성자 (constructor) 메소드

  • 인스턴스 객체가 생성 될 때 자동으로 호출되는 메소드
  • 인스턴스변수의 초기값을 설정
    - 인스턴스 생성
    • _ _ init _ _ 메소드 자동 호출
#생성자 메서드

class Person :
    def __init__(self):
        print('생성 되었습니다.')

p1=Person()
p2=Person()

######################################################

#생성자 메서드

class Person :
    def __init__(self , name , age):
        #인스턴스 변수를 정의하기 위해 사용!
        self.name = name
        self.age = age

p1 = Person('이종현','27')
print(p1.name,p1.age)
>>>
이종현 27

#######################################################

class Person :
    def __init__(self , name , age = 1):
        #인스턴스 변수를 정의하기 위해 사용!
        self.name = name
        self.age = age

p1 = Person('이종현')
print(p1.name,p1.age)
>>>
이종현 1

소멸자 메소드

  • 인스턴스 객체가 소멸 (파괴) 되기 직전에 호출되는 메소드
# 소멸자 메서드
class Person:
    def __init__(self):
        print('안녕하세요')
    def __del__(self):
        print('bye bye')

p1 = Person()
del p1

매직 메소드

  • ( _ _ )가 있는 메소드는 특수한 동작을 위해 만들어진 메소드로,
    스폐셜 메소드 혹은 매직 메소드 라고 불린다.
  • 특정한 상황에서 자동적으로 불리는 메소드
##매직 메서드 활용
class Person:
    def __init__(self , name , age , height):
        self.name = name
        self.age = age
        self.height = height
    def __lt__(self,other):
        print(f'{self.name} : {self.age}살 / {other.name} : {other.age}살')
        return self.age > other.age
    
    def __len__(self):
        return self.height
    
    def __str__(self):
        return f'<{self.name}> : {self.age}살'

p1 = Person('종현',27,181)
p2 = Person('수정',22,160)
p1 > p2
print(len(p1))
p3 = Person('종수',20,170)
print(p3)

클래스 메소드

  • 클래스가 사용하는 메소드
  • @classmethod 데코레이터를 사용하여 정의
    - 데코레이터 : 함수를 어떤 함수로 꾸며서 새로운 기능을 부여
  • 호출 시, 첫번째 인자로 클래스가 (cls)가 전달 됨.
class MyClass:
    var ='Class 변수'
    @classmethod
    def class_method(cls):
        print(cls.var)
        return cls
MyClass.class_method()
MyClass

>>>
Class 변수

인스턴스와 클래스 간의 이름 공간

  • 클래스를 정의하면, 이름 공간 생성
  • 인스턴스를 만들면, 객체가 생성되고 이름 공간 생성
  • 인스턴스에서 특정 속성에 접근하면, 인스턴스 - 클래스 순으로 탐색

스태틱 메소드

  • 클래스가 사용할 메소드
  • @staticmethod 데코레이터를 사용하여 정의
  • 호출 시, 어떠한 인자도 전달되지 않음
    ( 클래스 정보에 접근/수정 불가 )
#스태택 메서드
class MyClass:
    var ='Class 변수'
    @staticmethod
    def static_method(static):
        return static

MyClass.static_method()
>>>
TypeError: static_method() missing 1 required positional argument: 'static'
# 스태틱은 한 개의 위치 인자가 필요하다


#####################################################

#스태택 메서드
class MyClass:
    var ='Class 변수'
    @staticmethod
    def static_method():
        return 'static'

print(MyClass.static_method())
>>>>
'static'

객체지향의 핵심 4가지

  1. 추상화 - 프로그램 상에서의 클래스에 행동을 정의

  2. 상속

  • 두 클래스 사이 부모-자식 관계를 정립
  • 클래스는 상속이 가능함
    - 모든 파이썬 클래스는 object 를 상속 받음
    • 하위 클래스의 상위 클래스에 정의된 속성, 행동, 관계 제약을 모두 상속 받음
    • 부모 클래스의 속성, 메소드가 자식 클래스에 상속
      코드의 재 사용성이 높아진다.
class Person:

    def __init__(self , name , age):
        self.name =name
        self.age = age
    def talk(self):
        print(f'반갑습니다! {self.name} 입니다.')

p1 = Person('이종현','27')
p1.talk()


class Professor(Person) :
    			#상속받고싶은 클래스를 넣어준다.
    def __init__(self, name, age, department):
        self.name = name
        self.age =age
        self.department = department

pro1 = Professor('김교수',50,'컴공')
pro1.talk()
>>>
반갑습니다! 이종현 입니다.
반갑습니다! 김교수 입니다.

class Student(Person):
    def __init__(self, name,age,gpa):
        self.name = name
        self.age = age
        self.gpa = gpa
    def talk(self):
        print(f'충성충성! {self.name}입니다. 교수님')

s1 = Student('수정',21,4.5)
s1.talk()

>>>
충성충성! 수정입니다. 교수님

상속 관련 함수와 메소드

  • isinstance(object , classinfo ) #상속 받았을 때,
    => classinfo 의 인스턴스 이거나 subclass 인 경우 True
  • issubclass(class,classinfo)
    => class 가 classinfu의 subclass 면 True
    class의 모든 항목을 검사
  • super ()
    => 자식 클래스에서 부모의 클래스를 사용하고 싶은 경우
class Person:

    def __init__(self , name , age):
        self.name =name
        self.age = age
    def talk(self):
        print(f'반갑습니다! {self.name} 입니다.')


class Child(Person):
    def __init__(self, name, age , height):
        super().__init__(name, age)
        self.height = height

c1=Child('종수',25,'181')
print(c1.height)
c1.talk()

>>>
181
반갑습니다! 종수 입니다.
  • 다중 상속
class FirstChild ( Dad , Mom):
    #다중 상속
    #다중 상속 일 때, 먼저 영향을 받는 클래스의 인스턴스를 받음
    #mro 메소드
          
  • MRO 메소드 (Method Resolution Order)
    =>해당 인스턴스의 클래스가 어떤 부모의 클래스를 가지는 지 확인
    =>기존 인스턴스 -> 클래스 순으로 이름 공간을 탐색하는 과정에서 상속 관계에 있을 시, 인스턴스 -> 자식클래스 -> 부모클래스로 확장
#다중 상속

class A:
    name ='A'

class B:
    name ='B'

class C(A):
    name  ='C'

class D(B,C):
    pass

d = D()
print(d.name)
profile
개발 일기

0개의 댓글