📍 객체 지향 프로그래밍
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 매개 변수를 통해 클래스를 조작
- 스태틱 메서드
클래스 변수나 인스턴스 변수를 사용하지 않는 경우에 사용(단지 기능)