I. 객체 지향 프로그래밍
1. 객체 지향 프로그래밍?
: 컴퓨터의 프로그램이 단순히 명령어의 다발로 보는 것이 아니라 하나의 독립된 객체로 보는 것.
2. 절차 지향 프로그래밍?
: 프로그램 전체를 일종의 흐름으로 파악. 때문에 기능 중심적으로 파악되고 실행이 빠르다. 하지만 중간 프로세스가 고장나면 그 근처 전부를 들여다 봐야함. 그래서 생산 속도가 느리고 객체 지향으로 발전.객체 지향은 절차가 아닌 핵심 데이터를 기반으로 한 독립된 객체를 조립하는 방식을 취하는 것. 주의할 것은 절차 지향과 객체 지향이 완전히 구분되는 것이 아니라 객체 지향이 절차 지향을 포괄하는 것.
3. 메서드와 인터페이스
: 객체 내에서 사용되는 함수가 메서드, 즉 기능. 가령 가수 객체는 노래하기라는 메서드를 가진다. 이렇게 핵심 개념을 프로그래밍으로 구현하는 것을 추상화라고 한다. 이렇게 추상화된 구조가 인터페이스.
4. 객체 지향의 장단점
1) 장점
- 잘 만들어진 객체는 재사용이 가능하다.
- 객체는 데이터와 기능에 대한 정의를 이미 내포하고 있기 때문에 타인이 만든 객체를 참조할 때 그 구체적인 프로세스를 몰라도 사용 및 활용할 수 있다.
- 객체 단위로 모듈화 가능하기에 대규모 소프트웨어를 개발할 수 있다.
2) 단점
- 설계 시 많은 노력과 시간 필요
- 절차 지향에 비해 실행 속도가 상대적으로 느림
II. 객체와 클래스
1. 객체 개념(컴퓨터 과학적 정의)
: 클래스에서 정의한 것을 토대로 메모리에 할당된 것. 객체는 고유의 속성(데이터)과 기능(메서드)로 구성된다. 파이썬은 모든 것이 객체이다. 실제로 흔히 사용하는 자료형(실수형, 문자형, 정수형 등)은 파이썬 내부의 클래스이다. 가령 문자열 '익규'는 정의되어 있던 str클래스를 이용해 만든 것이다. 또 다른 예로, 어떤 리스트에 데이터를 추가할 때 list.append의 형식을 취하는데 이 append는 리스트 클래스 내부의 메서드인 것이고 그렇게 만들어진 리스트 [1.2.3]은 리스트 클래스의 객체인 것이다.
2. 클래스
: 클래스는 일종의 설계도이다. 이 설계도를 이용해 만든 것이 객체인 것. 객체는 인스턴스라고도 하는데 객체와 인스턴스는 구분하여 쓰는 말이다. 인스턴스는 클래스와의 관계성을 동반하는 말로서, 가령 A클래스의 인스턴스인 a라고 하지 A클래스의 객체인 a라고 하는 것은 어색한 표현이다.
3. 객체와 클래스 문법
1) 기본 문법
class MyClass: # 클래스 정의
my_instance = MyClass() # 인스턴스 생성(MyClass의 인스턴스인 my_instance생성)
my_instance.my_method() # 메서드 호출
my_instance.my_attribute # 속성 접근
2) 객체 비교하기
- ==
- 동등한(메모리 주소가 아닌 메모리 주소에 담긴 내용물이 같은 것)
- 변수가 참조하는 객체가 동등한(내용이 같은) 경우 True
- 두 변수가 참조하는 객체의 내용물이 같은 것이지 두 객체가 동일한 메모리 주소를 가리키고 있는 것을 확인하지는 않음
- is
- 동일한(두 객체가 가리키는 메모리 주소가 같은 것)
- 동일한(두 객체가 가리키는 메모리 주소가 같은 것
a = [1, 2, 3]
b = [1, 2, 3]
print(a==b, a is b) # True, False
a = [1, 2, 3]
b = a
print(a == b, a is b) # True, True
3) 인스턴스 변수와 클래스 변수
class Person:
species = 'human' # 클래스 변수 정의, 같은 클래스의 인스턴스들은 같은 값 가짐
def __init__(self, name): # 생성자 메서드(__init__)에서 self.<변수이름>으로 인스턴스 변수 정의
self.name = name
john = Person('john')
john.name = 'John Kim' # 인스턴스 생성 이후 <인스턴스이름>.<변수이름> 으로 접근
III. OOP 메서드
1. 인스턴스 메서드와 클래스 메서드
- 인스턴스 메서드는 클래스 내부에 정의되는 메서드 기본
- 인스턴스 메서드 호출 시, 첫 번째 인자로 인스턴스 자기자신(self)이 자동으로 전달됨.
class Person:
count = 0 # 클래스 변수
species = 'human'
def __init__(self, name): # 생성자 메서드, 인스턴스 변수들의 초기값을 설정
self.name = name
def say_hi(self, ment): # 인스턴스 메서드
self.ment = ment
print(self.ment)
@classmethod # @classmethod 데코레이터를 사용하여 정의
def num_of_population(cls):
print(f'인구수는{cls.count}입니다.')
john = Person('john')
john.say_hi('hi im john') # john.ment = 'hi im john'
2. 매직 메서드
- 언더바 두개 있는 것, 특수 동작을 위함