객체지향언어란?
1. 추상 데이터 타입(Abstract Data Type, ADT)
**책그림참조(p379/616)
- 동적 메모리
- 데이터와 함수가 연결됨(퍼블릭,프라이빗)
- 함수에서 많이쓰는 데이터가 있다면 한번에 연결해서 같이 쓰면 어떨까?
- c에서는 데이터만 메모리에잡아놓고 함수는 호출시 불러썼는데, 함수선언시 데이터와 묶어서 메모리에 잡아놓으면 더 편하겠다는 것이 추상 데이터 타입의 모토
- 사용자입장에서는 함수 내부가 어떻게 구현되어 있는지 알필요가 없다
2. 객체 지향 프로그래밍(Object Oriented Programming, OOP)
개념 | 설명 | 예시 |
객체(object) | 실존하는 물건 또는 개념 | 심판, 선수, 팀 |
속성(attribute) | 객체가 가지고 있는 변수 | 선수이름,소속팀 |
행동(action) | 객체가 작동할 수 잇는 함수(메서드) | 공을 차다, 공을 패스하다 |
3. 캡슐화(Encapsulation)
3.1 C에서의 사용자 정의 데이터타입(구조체,struct)
필요한 자료형 구조체를 만든 후 관련된 함수를 후에 정의한다
구조체에서 생성된 것은 데이터만 가지므로 변수이다
// C - struct
struct car{
char color[10];
int speed;
}
main(){
struct car my_car1; //구조체 변수 생성, 이때 메모리를 잡음
//데이터를 먼저 선언
}
// 관련된 함수를 이후에 별도 선언
upSpeed(){} // 함수 내부 구현 생략
downSpeed(){} // 함수 내부 구현 생략
3.2 Python에서 Class
파이썬에서는 데이터와 관련 함수를 class에서 한번에 정의한다
class에서 생성된 것은 데이터와 함수를 가지므로 객체라고 부른다
#Pyhon - Class
class Car:
color = ""
speed = 0
def upSpeed(self, v):
self.speed += v
def downSpeed(self, v):
self.speed -= v
my_car = Car() # 객체생성(데이터,함수 모두)
class 안에 데이터만 있다면? 함수만 있다면? 그것은 객체인가?
=> Yes, 또는 인스턴스라고 부른다
class 내부의 함수는 매서드, 내부의 변수는 필드라고 부른다
사용방법
1단계 : 클래스 생성
2단계 : 인스턴스 생성
3단계 : 필드나 메소드 사용
# 1단계 Class 생성
class Car:
color="blue" # 인스턴스 변수
speed=0 # 인스턴스 변수
count=0 # 클래스 변수
def __init__(self, name):
self.name = name
Car.count += 1 # 클래스 변수 변경
def upSpeed(self, v):
self.speed += v
def downSpeed(self, v):
self.speed -= v
# 2단계 Instance 생성
my_car1 = Car('hyundai')
# 3단계 필드나 메소드 사용
my_car1.color = 'red'
my_car1.upSpeed(10)
print("자동차1 현재속도:{}km, 생산된 자동차 총 숫자:{}대".format(my_car1.speed, my_car1.count))
# 4단계 값 출력해보기
my_car2 = Car('kia')
my_car2.upSpeed(50)
print("자동차2 현재속도:{}km, 생산된 자동차 총 숫자:{}대".format(my_car2.speed, my_car2.count))
# 출력부
# 자동차1 현재속도:10km, 생산된 자동차 총 숫자:1대
# 자동차2 현재속도:50km, 생산된 자동차 총 숫자:2대
4. 상속(Inheritance)
기존 class의 필드와 메소드를 그대로 물려받는 새로운 class를 만드는 것
아래 코드에서 클래스 Sedan은 color,speed같은 필드를 정의한 적 없지만 Car로부터 상속받아 가지고 있다
마찬가지로, 메서드 upSpeed, downSpeed도 가진다
# 상위 Class
class Car:
#필드
color='blue'
speed=0
#메서드
def upSpeed(self, v):
self.speed += v
def downSpeed(self, v):
self.speed -= v
# Class Car을 상속받을 Class Sedan
class Sedan(Car):
brand = 'hyundai'
#Class Sedan은 필드값인 brand만 정의했지만,
#Class Car을 상속했기에 필드값 color, speed와 메서드값 up/downSpeed를 가진다
4.1 Method Overriding
상위 class의 메소드를 하위 class에서 재정의하는 것
부모 class(슈퍼클레스)의 함수를 상속받을 때 함수의 이름과 매개변수의 수가 똑같아야한다
# 상위 Class
class Car:
speed=0
def upSpeed(self, v):
self.speed += v
print("Class Car // 변경된 스피드는 :",self.speed)
# Class Car을 상속받을 Class Sedan
class Sedan(Car):
def upSpeed(self, v):
self.speed += v
if self.speed >200:
self.speed = 200
print("Class Sedan // 변경된 스피드는 :",self.speed)
my_car = Car()
my_car.upSpeed(250)
#>> Class Car // 변경된 스피드는 : 250
my_sedan = Sedan()
my_sedan.upSpeed(250)
#>> Class Sedan // 변경된 스피드는 : 200
4.2 Operator Overloading(연산자 중복)
사용자 정의 객체에서 필요한 연산자를 내장 타입과 형태나 동작이 유사하도록 재정의한 것
Operator overloading을 위해 "__함수이름__" 형식의 메소드를 미리 정의함
(함수의 이름은 같지만 매개변수의 개수는 다를 수 있다)
메소드 | 연산자 | 사용 예 |
__add__(self, other) | +(이항) | A+B, A+=B |
__sub__(self, other) | -(이항) | A-B, A-=B |
__mul__(self, other) | * | A*B, A*=B |
__truediv__(self, other) | / | A/B, A/=B |
__floordiv__(self, other) | // | A//B, A//=B |
__mod__(self, other) | % | A%B, A%=B |
__divmod__(self, other) | divmod() | divmod(A,B) |
__pow__(self, other,[,modulo]) | pew(), ** | pow(A,B), A**B |
__lshift__(self, other) | << | A<<B, A<<=B |
5. 다형성(Polymorphism)
5.1 다형성이란?
상속 관계 내의 다른 class들의 instance들이 같은 맴버 함수 호출에 대해 각각 다르게 반응하도록 하는 기능
Method Overriding, Operator Overloading도 다형성을 지원하는 중요한 기술
5.2 장점
적은 코딩으로 다양한 객체들에게 유사한 작업을 수행 가능하게 한다
작성 코드량이 줄어들고 코드의 가동성을 높여준다
5.3 파이썬에서의 다향성 장점
파이썬에서는 데이터 타입 선언이 없다는 점에서 다향성을 적용하기 용이함
동적타이핑언어이기 때문에 하나의 메소드에 의해 처리될 수 있는 객체의 종류에 제한이 없음