여럿이 함께 프로그램을 개발하려면 필요한 부분을 나눠서 작성한 후 합쳐야 한다. 이 때 프로그램을 기능별로 나누는 방법은 (1)함수 (2)객체 (3)모듈이 있는데, 이번에는 객체에 대해서 살펴보도록 하자
목차
다음 파트인 intermediate에서는 아래와 같은 내용을 다룬다
•
getter & setter
•
private
•
is a / has a
•
magic method
1. OOP(Object-Oriented Programming, 객체 지향 프로그래밍)
1.1 객체 지향 프그래밍
개념
•
객체: 실생활에서 일종의 물건
◦
속성(Attribute)과 행동(Action)을 가짐
•
OOP는 이러한 객체 개념을 프로그램으로 표현
◦
속성은 variable, 행동은 function으로 표현됨
•
클래스(class) & 객체(object, instance)
◦
클래스: 설계도, 도면, 청사진
▪
변수와 함수들을 묶은 '사용자 정의 데이터 타입'이라고 생각하면 됨(custom data type)
▪
객체지향을 구현하기 위해 만들어진 개념: 다형성, 캡슐화, 추상화, 상속 등의 특징을 가짐
◦
객체: 실제 구현체
▪
클래스를 이용해서 실제 객체를 만들어야 클래스에 정의된 함수나 변수를 사용할 수 있음
•
클래스를 잘 정의해서 프로그래밍을 쉽게하고 반복적으로 사용할 수 있게 하는 것이 OOP
클래스와 객체 선언
•
함수를 선언한 뒤에 '호출'을 해야 함수를 사용하는 것처럼, 클래스도 '객체'를 만들어야 클래스에 정의된 함수나 변수를 사용할 수 있음
# 함수를 선언한 뒤에 '호출'해서 함수 사용
def dss():
print("data")
dss()
# class도 '객체'를 만들어야 클래스에 정의된 함수나 변수를 사용
class A:
method - a, b, c
obj = A() - 객체
obj.a(), obj.b()
Python
복사
1.2 객체 지향 프로그램의 예시
인공지능 축구 프로그램을 작성한다고 가정
•
객체 종류: 팀, 선수, 심판, 공
•
Action(function으로 표현)
◦
선수: 공을 차다, 패스하다
◦
심판: 휘슬을 불다, 경고를 주다
•
Attribute(variable로 표현)
◦
선수: 선수 이름, 포지션, 소속팀
◦
팀: 팀 이름, 팀 연고지, 팀 소속 선수
2. Structure - 클래스의 구조
2.1 Class 선언
•
문법: class ClassName(object):
◦
object: 상속받는 개체명으로, 생략해도 괜찮음
•
class naming
◦
class는 camelCase, CamelCase, PascalCase 사용
◦
함수는 snake_case 사용
•
Attribute 추가: __init__, self 사용하여 변수 할당
◦
__init__: 객체 초기화 예약 함수
•
Function 추가:
◦
def를 이용하여 기존 함수처럼 함수를 선언
◦
반드시 self를 넣어주어야 class 함수로 인정
◦
self는 객체 자신을 의미
class SoccerPlayer(object):
def __init__(self, name, position, back_number):
self.name = name
self.position = position
self.back_number = back_number
def change_back_number(self, new_number):
print("선수의 등번호를 변경합니다: from %d to %d" % (
self.back_number, new_number))
self.back_number = new_number
def __str__(self):
return "Hello, My name is %s. I play in %s in center" % (
self.name, self.position)
Python
복사
2.2 객체화: Object(Instance) 사용하기
•
클래스를 사용하려면 개체화를 시켜줘야 함
•
object 이름 선언과 함께 초기값 입력하기
jinhyun = SoccerPlayer("Jinhyun", "MF", 10)
print(jinhyun)
print("현재 선수의 등번호는:", jinhyun.back_number)
jinhyun.change_back_number(5)
print("현재 선수의 등번호는:", jinhyun.back_number)
Python
복사
Hello, My name is Jinhyun. I play in MF in center
현재 선수의 등번호는: 10
선수의 등번호를 변경합니다: from 10 to 5
현재 선수의 등번호는: 5
2.3 예시: 계산기 클래스와 객체 만들기
2.4 Class의 효율성
3. Constructor - 생성자
•
클래스가 객체가 될때 변수의 초기값을 설정해주는 역할
•
__init__으로 함수명을 작성하여 초기 변수값을 넣어주면 됨
•
클래스가 객체가 될 때, __init__ 함수를 먼저 실행해줌 (객체를 만들 때 자동으로 실행)
•
사용 이유: 생성자에서 설정된 변수가 없으면 객체를 만들수 없도록 함으로써 객체가 만들어진 상태에서 객체의 함수가 실행되지 않는 것보다 메모리를 절약
•
생성자를 만들고 객체를 선언할때 초기 데이터가 없으면 에러가 발생하여 객체가 생성되지 않음
◦
cf) 생성자가 없는 class에 초기값이 없이 객체를 만들면 함수를 실행할 때 에러
3.1 self
3.2 예시: 야구선수 정보를 가지고 선수별 클래스 만들기
•
클래스에는 타율을 구하는 함수를 추가
•
김선민(ksm) - 타석: 476, 안타:176
•
박건우(pkw) - 타석: 483, 안타:177
•
박민우(pmw) - 타석: 386, 안타:141
4. Inheritance - 상속
4.1 상속 개념
•
부모클래스로부터 속성과 method를 물려받은 자식 클래스를 생성하는 것
◦
기존 클래스의 기능을 새로운 클래스에서 사용하고 싶을 때 이용
•
기존의 클래스에 새로운 변수나 함수를 추가하거나 변경할수 있도록 해주는 기능
•
파이썬에서는 단일상속과 다중상속 모두 사용 가능
•
핸드폰 클래스 예시로 상속의 개념 보기
class iphone1():
method - call, send_sms
class iphone2(iphone1):
method - wifi
class iphone3(iphone2): # 보통은 이렇게 3단계까지 정도만 사용
method - touch_id
class galaxy():
method - game
class galaxy2(iphone1, galaxy): # 다중상속
method - show_image
Python
복사
이 경우 각 클래스는 다음과 같은 기능을 갖게 됨
◦
iphone1 - call, send_sms
◦
iphone2 - call, send_sms, wifi
◦
iphone3 - call, send_sms, wifi, touch_id
◦
galaxy - game
◦
galaxy2 - call, send_sms, game, show_image
Person을 상속받은 Korean 클래스 만들기
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
class Korean(Person):
pass
first_korean = Korean("Sungchul", 35)
print(first_korean.name)
Python
복사
Sungchul
4.2 다형성(Polymorphism): Overriding & overloading
•
다형성: 같은 이름의 method의 내부 로직을 다르게 작성
•
overriding과 overloading의 차이점은 다형성의 특징
◦
overriding : 상위 클래스가 가지고 있는 함수를 하위 클래스가 함수를 재정의 해서 사용 (기존 기능을 덮어 씌워 새로운 기능으로 만드는 것)
◦
overloading : 함수 이름은 같으나 argument 갯수 차이로 함수를 구분해서 실행해주는 방법
▪
python 에서는 지원x, default argument로 조건문을 사용하여 구현
# java에서는 overloading이 구현됨. 아래 두 개가 달리 실행됨
def test():
return 10
def test(num):
return num
Java
복사
# 파이썬에서는 default parameter 사용해서 구현 가능 (꼼수ㅎㅎ)
def test(num=None):
if num is None:
return 10
return num
# 함수는 return을 만나면 그 아래가 실행되지 않음
Python
복사
4.3 예시: 스타크래프트
5. Multiple Inheritance - 다중상속
•
어떤 클래스가 하나 이상의 상위 클래스로부터 여러 가지 행동이나 특징을 상속받을 수 있음
6. Super
•
super는 상위 클래스의 생성자를 받아옴 (속성을 받아옴)
6.1 예시: 스타크래프트
•
Human, Marin(Human), Medic(Human)
6.2 예시: person-employee
6.3 다이아몬드 상속과 super
다이아몬드 상속
•
상속 구조가 다음과 같을 경우 (A → B), (A → C), (B,C → D)
•
D() - A가 두 번 호출됨 (which is not necessary)
super를 사용하면 A가 두 번 호출되지 않음
위 내용 전체를 jupyter notebook으로 보려면,
참고자료
•
패스트캠퍼스, ⟪데이터사이언스스쿨 8기⟫ 수업자료
•
인프런, ⟪프로그래밍, 데이터 과학을 위한 파이썬 입문⟫ 수업 자료