OOP-객체와 메서드
OOP에 대해 알아보기 전에 PP에 대해 먼저 알아보겠다.
절차 지향 프로그래밍
: Procedural Programming
프로그램을 '데이터'와 '절차'로 구성하는 방식의 프로그래밍 패러다임
데이터와 함수(절차)가 분리되어 있으며, 함수 호출의 흐름이 중요함
실제로 실행되는 내용이 무엇인지가 중요함
형식 : 함수(데이터)
단점 : 하드웨어의 발전으로 실행되는 프로그램이 많아져 소프트웨어에 충격이 발생
만약 중간에 프로그램의 함수가 중단되면, 프로그램의 전체가 문제가 생겨 다시 프로그램을 실행해야함
ex. 공격(전사)
객체 지향 프로그래밍
: Object Oriented Programming
데이터와 해당 데이터를 조작하는 메서드를 하나의 객체로 묶어 관리하는 방식의 프로그래밍 패러다임
즉, 데이터와 함수를 객체로 묶음
ex. 전사가 베기를 한다. ('클래스'가 '메서드'를 한다.)
클래스의 상하관계가 존재함
데이터가 중심이 되던 PP와 달리 class 중심으로 바뀜
객체 간 상호작용이 중요하며, 순서가 중요한 것이 아님
객체
: object
클래스에서 정의한 것을 토대로 메모리에 할당된 것
'속성(변수)'과 '행동(메서드)'으로 구성된 모든 것
class: 타입을 표현하는 방법, 객체를 생성하기 위한 설계도
instance : 클래스로 만든 객체
클래스는 객체다(O)
객체는 인스턴스다(X)
객체는 클래스의 인스턴스다(O)
name = 'Alice'
print(type(name)) # <class 'str'>
변수 name은 str 클래스의 인스턴스
우리가 사용하던 데이터 타입은 모두 클래스
인스턴스와 메서드
'hello'.upper()
- 문자열.대문자로()
- 객체.행동()
- 인스턴스.메서드()
하나의 객체(object)는 특정 타입의 인스턴스(instance)
객체의 특징
타입(type) : 어떤 연산자(operator)와 조작(method)이 가능한가?
속성(attribute) : 데이터를 가지는가?
조작법(method) : 함수(기능)를 할 수 있는가?
클래스
클래스를 정의할 때 특징이 있음
- 대문자를 사용함
- 소괄호()를 생략할 수 있음
class Person:
blood_color = 'red'
def __init__(self,name):
self.name = name
def singing(self):
return f'{self.name}가 노래합니다.'
클래스 기본 활용
def __init__
: 생성자 함수
특정한 타이밍(객체를 생성할 때)에 자동으로 호출되는 특별한 메서드
생성자 함수를 통해 instance를 생성하고 필요한 초기값을 설정
self.name = name
:인스턴스 변수
인스턴스(객체)마다 별도로 유지되는 변수
인스턴스가 생성될 때마다 초기화됨
blood_color = 'red'
:클래스 변수
클래스 내부에 선언된 변수
클래스로 생성된 모든 인스턴스들이 공유하는 변수
singing(self): return
:인스턴스 메서드
각각의 인스턴스에서 호출할 수 있는 메서드
클래스를 정의 > 클래스와 해당하는 이름 공간(namespace) 생성
인스턴스를 만듦 > 인스턴스 객체가 생성되고, 독립적인 namespace 생성
인스턴스에서 특정 속성에 접근 > 인스턴스->클래스 순으로 탐색
인스턴스를 생성할 때는 생성자 부분만 실행됨(클래스 변수에는 따로 실행되지 않음)
; 함수의 정의와 호출, 클래스의 정의와 호출의 실행 과정 체크하기!
독립적인 이름공간의 이점
각 인스턴스는 독립적인 메모리 공간을 가짐
클래스와 다른 인스턴스 간에는 서로의 데이터나 상태에 직접적인 접근이 불가능
클래스와 인스턴스를 모듈화
각각의 객체가 독립적으로 동작
메서드
인스턴스 메서드
클래스로부터 생성된 각 인스턴스에서 호출할 수 있는 메서드
인스턴스의 상태를 조작하거나 동작을 수행
클래스 내부에 정의되는 메서드의 기본
반드시 첫 번째 매개변수로 인스턴스 자신(self)을 전달받음
"인스턴스.메서드" 라고 코드를 작성하여도, "클래스.클래스가 가진 메서드(인스턴스)" + 자기자신을 조작함
> 이것이 인스턴스 메서드의 첫번째 매개변수가 반드시 인스턴스 자기 자신인 이유
이제는 객체 스스로 메서드를 호출하여 코드를 동작하는 것이 바로 객체 지향적 표현임
생성자 메서드
인스턴스 객체가 생성될 때 자동으로 호출되는 메서드
인스턴스 변수들의 초기값을 설정
매직 메서드
인스턴스 메서드임
__가 있는 건 특수한 동작을 위해 만들어진 것
ex. __str__(self), __len__(self), __init(self)__ 등
클래스 메서드
클래스가 호출하는 메서드
인스턴스의 상태에 의존하지 않는 기능을 정의
클래스 변수를 조작하거나 클래스 레벨의 동작을 수행
@classmethod 데코레이터를 사용하여 정의함
호출 시, 첫번째 인자로 호출하는 클래스(cls)가 전달됨
(만약 데코레이터를 사용하지 않으면 인스턴스 메서드가 됨)
정적 메서드
클래스와 인스턴스와 상관없이 독립적으로 동작하는 메서드
주로 클래스와 관련이 있음
인스턴스와 상호작용이 필요하지 않을 때 사용
ex. 그냥 일반 함수가 필요할 때. 이 때는 인스턴스와 관련이 없음
@staticmethod 데코레이터를 사용하여 정의함
호출 시 필수 매개변수는 없음
즉, 객체 상태나 클래스 상태를 수정할 수 없으며 단지 기능만을 위한 메서드로 사용됨
스태틱 메서드는 class가 호출함
클래스가 사용해야 할 것 : 클래스 메서드, 정적 메서드 2개
인스턴스가 사용해야 할 것 : 인스턴스 메서드 1개
> 각자의 메서드는 OOP 패러다임에 따라 목적이 있는 것이기에 올바른 메서드만 사용하도록 해야함
절차 지향과 객체 지향은 대조되는 개념이 아니다.
객체 지향은 기존의 절차 지향을 기반으로 둔채 보완하기 위해
객체라는 개념을 도입하여 여러 이점을 가지는 패러다임