[TIL: 0130] 객체지향 프로그래밍1

ryun·2023년 1월 30일
0

TIL

목록 보기
10/34

📍 객체 지향 프로그래밍

OOP(Object-Oriented Programming)은 컴퓨터 프로그래밍의 패러다임 중 하나
각 객체는 메시지를 주고받고, 데이터를 처리할 수 있다

절차 지향 프로그래밍

하나의 프로그래밍 전체가 유기적으로 연결되어 있는 것
data > function 1 > function 2 > function 3 > function 4

  • 기능 중심의 프로그램
  • 순서가 정해져 있으므로 실행이 빠르다
  • But, 단점으로 중간 부분이 망가지거나 고쳐야 하면 연관된 모든 부분을 고쳐야 한다
  • 점차 복자한 설계가 요구되면서, 하드웨어의 발전 속도를 소프트웨어가 따라가지 못하는 시기가 온다
    즉, 소프트웨어 위기 (Software Crisis)
  • 절차지향 방법론은 생산성이 낮으므로 핵심이 되는 데이터 중심으로 개발하자
    데이터 중심으로 절차를 도입해서 현실의 사물을 나타내고 조립하는 방식으로 개발하자는 것이 OOP

객체 지향 프로그래밍

프로그램을 여러 개의 독립된 객체들과 그 객체 간 상호작용으로 파악하는 프로그래밍 방법

  • 객체 지향은 절차 지향을 포함하면서 객체 중심으로 개발하는 것
    하나의 객체 안에는데이터가 있고 데이터를 활용하는 함수들이 있다
  • 데이터와 기능(메서드) 분리, 추상화된 구조(인터페이스)
  • 예시) 가수 객체
    가수라는 개념을 추상화해서 프로그래밍 안으로 가져온 것
    • 노래, 춤이라는 메소드를 가진다

객체 지향 프로그래밍이 필요한 이유

  • 현실 세계를 프로그램 설계에 반영 (추상화)
장점단점
객체는 잘 만들면 계속해서 재사용이 가능설계시 많은 노력과 시간이 필요
그 자체로 데이터와 행동이 정의됨(독립적)실행 속도가 상대적으로 느림
객체 단위로 모듈화시켜 개발할 수 있으므로 많은 인원이 참여하는 대규모 소프트웨어 개발 가능
개발 용이성, 유지보수 편의성, 신뢰성을 바탕으로 생산성이 대폭 증가!

📍 OOP 기초

객체(컴퓨터 과학)

객체 또는 오브젝트클래스에서 정의한 것을 토대로 메모리(실제 저장공간)에 할당된 것

하나의 객체 안에는 데이터와 메서드들이 있다. 즉, 하나의 객체 안에는 속성(Data / 변수)과 행동(Method / 함수)가 있다

클래스와 객체

  • 클래스(설계도)와 객체(실제 사례)
  • 클래스로 만든 객체를 인스턴스 라고도 한다
    클래스로 인스턴스를 만드는 것
  • 우리가 사용하는 데이터 타입이라는 것은 사실 모두 클래스였다
name = 'abc'
type(name)

> class <str>

클래스를 이용해서 abc라는 인스턴스를 만든 것
붕어빵 틀은 클래스! 만들어진 객체는 붕어빵!

  • 파이썬의 모든 것은 객체다
    즉, 파이썬의 모든 것엔 속성과 행동이 존재한다
    [1, 2, 3], [1], [], ['hi']
    위 모두 리스트 타입이라틑 클래스의 객체
    'hi', '파이썬'
    모두 문자열 타입(클래스)의 객체
    결국 하나의 객체는 특정 타입의 인스턴스이다

함수와 클래스의 차이로 함수는 기능만 하고 끝나지만, 클래스는 데이터와 함수를 같이 가지고 있다


📍 OOP 문법

기본 문법

  • 클래스 정의
    class Myclass:
    나만의 붕어빵 틀을 만드는 것
  • 인스턴스 생성
    my_instance = myClass()
  • 메서드 호출
    my_instance.my_method()
  • 속성 접근
    my_instance.my_attribute
class Person:
	pass
    
print(type(Person)) # <class 'type'>

person1 = Person()

print(isinstance(person1, Person)) # True
print(type(person1()) # <class '__main__.Person'

객체 비교하기

  • ==
    동등한(equal)
    변수가 참조하는 객체가 동등한(내용이 같은) 경우 True
    실제로 동일한 대상을 가리킨다고 하는 것은 아니다
  • is
    동일한(identical)
    두 변수가 동일한 객체를 가리키는 경우 True

속성

  • 특정 데이터 타입/클래스의 객체들이 가지게 될 상태/데이터를 의미
  • 클래스 변수 / 인스턴스 변수가 존재
    클래스 변수는 클래스에 바로 정의하는 변수
    인스턴스 변수는 self.~ 로 만드는 변수

인스턴스와 클래스 간의 이름 공간(namespace)

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

인스턴스 변수

인스턴스가 개인적으로 가지고 있는 속성
각 인스턴스들의 고유한 변수

  • 생성자 메서드 (init)에서 self<name>으로 정의
  • 인스턴스가 생성된 이후 <instance>.<name>으로 접근 및 할당

  • __ (던더)

    생성자 (클래스를 생성할 때 부르는 함수)

던더로된 init은 함수 내에 뭔가를 만들었으면
클래스를 생성할 때 실행해라 라는 의미가 된다
: Person이라는 클래스를 생성할 때 'john'을 name이라는 변수에 넣어줘, 그 클래스를 john 이라는 변수에 할당해줘

클래스 변수 활용(사용자 수 계산하기)

  • 사용자가 몇 명인지 확인하고 싶다면?
    인스턴스가 생성될 때마다 클래스 변수가 늘어나도록 설정할 수 있음

클래스 변수와 인스턴스 변수

클래스 변수를 변경할 때는 항상 클래스.클래스변수 형식으로 변경
클래스.클래스 변수 = 변경할 데이터
Person.count += 1

self

인스턴스 자기 자신
인스턴스 메서드는 호출 시 첫번째 인자로 인스턴스 자신이 전달되게 설계

  • self를 첫 번째 인자로 정의
  • 암묵적인 규칙

📍 OOP 메서드

*인스턴스 메서드는 인스턴스가 사용하는 함수, 클래스 메서드는 클래스에서 사용
인스턴스 입장에서는 인스턴스 메서드와 클래스 메서드를 다 쓸 수 있다
클래스 입장에서는 클래스 메서드만 쓸 수 있다

메서드

  • 특정 데이터 타입 / 클래스의 객체에 공통적으로 적용 가능한 행위 (함수)
class Person:
	def talk(self): # 인스턴스 메서드
    	print('안녕')
    def eat(self, food): # 인스턴스 메서드
    	print(f'{food}를 냠냠')

인자 자체로 인스턴스가 들어간다면 모두 인스턴스 메서드
꼭 던더 없어도 나만의 방식으로 함수를 정의할 수 있다

메서드의 종류

  • 인스턴트 메서드
    • 인스턴스 변수를 사용하는 함수
    • 90% 이상 쓴다
  • 클래스 메서드
    • 인스턴스가 뭐가 되든 클래스 변수를 사용하는 것
    • 10% 정도 쓴다
  • 정적 메서드
    • 인스턴스, 클래스 변수 필요 없을 때 쓰는 것
    • 거의 필요 없다

인스턴스 메서드

우리가 대부분 사용하는 메서드

  • 인스턴스 변수를 사용하거나, 인스턴스 변수에 값을 설정하는 메서드
  • 클래스 내부에 정의되는 메서드의 기본
  • 호출 시, 첫번째 인자로 인스턴스 자기자신(self)이 자동으로 전달됨

매직 메서드

특별한 인스턴스 메서드

  • Double underscore(__)가 있는 메서드는 특정 상황에서 자동으로 불린다

  • 내가 만든 클래스를 문자열처럼 취급하려면 어떻게 불려야 할까?

  • 예시
    str(self), len(self), It(self, other), le(self, other), eq(self, other)
    gt(self, other),ge(self, other),ne(self, other)

class Person:
	def __str__(self): # Person 클래스를 문자열로 만든다면 어떤거야?
    	pass
        
    def __str__(self):
    	return # 이 클래스를 하나의 문자열로 표현하면 이겁니다
        
aiden = Person('aiden', 23)
print(aiden)

생성자 메서드

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

클래스 메서드

  • 클래스가 사용할 메서드
  • @classmethod 데코레이터를 사용하여 정의
  • 호출 시, 첫번째 인자로 클래스(cls)가 정의됨
    출력하면 '인구수는 2입니다'가 세 번 출력

@classmethod (데코레이터)

코드가 있어보이고, 공식문서에서는 데코레이터를 많이 사용하기 때문에 읽을 때 이해가 잘 되게 만든다

  • classmethod라는 데코레이터가 함수 내부적으로 정의되어 있다
  • 함수를 어떤 함수로 꾸며서 새로운 기능을 부여
  • 데코레이터(함수명) 형태로 함수 위에 작성
  • 순서대로 적용 되기 때문에 작성 순서가 중요

클래스 메서드와 인스턴스 메서드

  • 클래스 메서드 > 클래스 변수 사용
  • 인스턴스 메서드 > 인스턴스 변수 사용 (self가 넘어옴)
  • 인스턴스 변수 / 클래스 변수 모두 사용하고 싶다면?
    클래스는 인스턴스 변수 사용이 불가능 하고
    인스턴스 메서드는 클래스 변수, 인스턴스 변수 둘 다 사용이 가능 (인스턴스 변수 찾았는데 없으면 클래스 변수에서 찾는다)

함수에서 인스턴스 변수를 사용 안할거면 클래스 메서드를 쓰기, 클래스 메서드 안쓸거면 인스턴스 메서드로도 사용이 가능 (하지만 분리해서 써주면 다른 사람이 봤을 때 이해하기가 쉽다)

스태틱 메서드

  • 인스턴스 변수, 클래스 변수를 전혀 다루지 않지만 클래스와 연관이 있는 메서드
  • 언제 사용?
    속성을 다루지 않고 단지 기능(행동)만을 하는 메서드를 정의할 때 사용
  • 인스턴스 변수, 클래스 변수 아무것도 사용하지 않을 때 사용
    즉, 객체 상태나 클래스 상태를 수정할 수 없음
  • @staticmethod 데코레이터를 사용해서 정의
  • 일반 함수처럼 동작하지만, 클래스 이름공간에 귀속됨
    주로 해당 클래스로 한정하는 용도로 사용
    스태틱은 클래스와 인스턴스로 둘 다 접근이 가능
    클래스.스태틱(인자)
    인스턴스.스태틱(인자)

메서드 정리

  • 인스턴스 메서드
    메서드 호출한 인스턴스를 의미하는 self 매개 변수를 통해 인스턴스를 조작
  • 클래스 메서드
    클래스를 의미하는 cls 매개 변수를 통해 클래스를 조작
  • 스태틱 메서드
    클래스 변수나 인스턴스 변수를 사용하지 않는 경우에 사용(단지 기능)

0개의 댓글