Object Oriented Programming(객체지향 프로그래밍)
문제를 여러가지 객체로 나누어 작업하는 프로그래밍 방식
프로그램을 객체라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식
객체는 결국 특정 타입의 인스턴스이다.
-
123,900,5는 모두
int
의 인스턴스 -
'hello', 'bye'는 모두
string
의 인스턴스이다. -
[232,89,1],[]는 모두
list
의 인스턴스이다.
🌟int, string, list는 모두 클래스이다.
a = [1,2,3]
print(a,type(a)) # <class 'list'>
b = '123'
print(b,type(b)) # <class 'str'>
객체의 특징:
-
타입(type): 객체의 타입에 따라 어떤 연산자/메서드 적용 가능한지가 달라진다.
-
속성(attribute): 객체가 지니는 값, 상태를 나타낸다.
-
조작법(method): 객체의 타입에 따라 어떠한 함수 및 행위가 가능한지 달라진다.
순차적인 처리로써 프로그램 전체가 유기적으로 연결되는 구조의 프로그래밍 방법이다.
컴퓨터의 처리구조와 유사하여 실행속도가 빠르다는 장점이 있다.
프로그램안에 여러가지 독립된 객체들과 그 객체들 사이에 발생하는 상호작용으로 프로그램을 정의하는 방법이다.
실제 세계를 모델링하여 프로그래밍하는 기법이기도 하다.
-
추상화: 현실 세계를 프로그램 설계에 반영
-
캡슐화: 클래스 내부의 변수와 메소드를 하나로 패키징(묶는) 방법이다. 비슷한 개념으로 정보은닉이 있다. 객체의 응집도와 독립성을 높임으로써 객체의 모듈화를 지향한다.
- 정보은닉: 객체의 내부 구현을 숨겨 객체가 반드시 정해진 메소드를 통해서만 상호작용하도록 유도.
ex: 자바에서의 접근제어자
public
, protected
, default
, private
-
상속: 자식클래스에게 부모클래스가 지니는 특징(속성, 메서드 등)을 물려준다. 이를 통해서 새로운 클래스를 생성하였을 때 속성이나 메서드를 따로 정의해줄 필요가 없다.
-
다형성: 하나의 객체가 여러개의 타입을 가질 수 있는 것이다.
ex: 자바에서의 대표적인 다형성 구현법
overriding
, overloading
, functional interface
🌟사각형의 넓이를 구해보자.
절차지향 프로그래밍 예시
def area(x, y):
return x * y
def perimeter(x, y):
return 2 * (x + y)
a = 10
b = 20
c = 30
d = 40
square1_area = area(a, b)
square1_perimeter = perimeter(a, b)
square2_area = area(c, d)
square2_perimeter = perimeter(c, d)
객체지향 프로그래밍 예시
class Rectangle:
def __init__(self, x, y):
self.x = x
self.y = y
def area(self):
return self.x * self.y
def perimeter(self):
return 2 * (self.x + self.y)
r1 = Rectangle(10, 20)
r1.area()
r1.perimeter()
r2 = Rectangle(30, 40)
r2.area()
r2.perimeter()
사각형: 클래스
각 사각형(r1, r2): 인스턴스
사각형의 정보: 속성
사각형의 행동/기능: 메서드(넓이, 높이 구하기)
기본문법
#클래스 정의 (클래스 정의 시에는 CamelCase, 변수/함수 정의시에는 Snake_Case)
class MyClass:
pass
#인스턴스 생성
my_instance = MyClass()
#메서드 호출
my_instance.my_method()
#속성 접근 시...
my_instance.my_attribute
클래스: 객체들의 분류(class)
인스턴스: 하나하나의 실체/예(instance)
class Person:
pass
print(type(Person)) # <class 'type'>
p1 = Person()
print(type(p1)) # <class '__main__.Person'>
isinstance(person1, Person) # True
-
얕은복사: 데이터의 주소 값만 복사한다는 것을 의미한다.
-
깊은 복사: 실제의 데이터 값을 새로운 메모리 공간에 복사한다는 것을 의미한다.
#얕은 복사
a = [1,2,3]
b = a
b[0] = 'hi'
print(a) # ['hi',2,3]
print(b) # ['hi',2,3]
#깊은복사
a = [[1,2],2,3]
b = list(a) # list(a)라는 새로운 저장소를 생성하여 b 값을 복사한다.
b[0][0] = 'hi'
print(a) # [[1,2],2,3]
print(b) # [['hi'],2,3]
#또는
import copy
a = [[1,2],2,3]
b = copy.deepcopy(a) #메서드를 사용하는 것도 가능하다.
b[0][0] = 'hi'
print(a) # [[1,2],2,3]
print(b) # [['hi'],2,3]
인스턴스 메서드: self.method()
, object.method()
-
인스턴스를 조작하기 위한 메서드
-
클래스 내부에 정의되는 메서드의 기본
-
호출 시, 첫번 째 인자로 인스턴스 자기자신(self)이 전달됨
생성자 메서드: __init__
-
인스턴스 객체가 생성될 때 자동으로 호출되는 메서드
-
인스턴스 변수들의 초기값을 설정
class Person:
def __init__(self):
print('인스턴스가 생성되었습니다.')
p1 = Person() # 인스턴스가 생성되었습니다.
소멸자 메서드: __del__
-
객체가 소멸될 때 호출하는 메서드
-
리소스 해제 등의 종료 작업을 위해 활용됨
#소멸자 메서드
class Person:
def __del__(self):
print('인스턴스가 사라졌습니다.')
p1 = Person()
del p1 # 인스턴스가 사라졌습니다.
class Person:
#인스턴스가 생성될 때 특정 작업을 수행하게 한다.
def __init__(self, name):
#인스턴스의 이름을 정의해준다.
self.name = name
print('응애!')
#Person 클래스의 인스턴스를 생성
man = Person('김철수')
print(man.name)
woman = Person('김영희')
print(woman.name)
#아래의 방법으로 인스턴스의 속성 정의도 가능하다.
man = Person()
man.name = '홍길동'
print(man)
print(man.name)
https://blog.hexabrain.net/285 (생성자와 소멸자)
https://journeytosth.tistory.com/73 (인스턴스 메서드 / 정적 메서드 / 클래스 메서드)
https://rok93.tistory.com/entry/%EC%96%95%EC%9D%80%EB%B3%B5%EC%82%AC-VS-%EA%B9%8A%EC%9D%80%EB%B3%B5%EC%82%AC (깊은복사 / 얕은 복사)
https://zzang9ha.tistory.com/372 (깊은복사 / 얕은 복사)