Search

Python 05. Python Class - Basic

Created at
2018/07/16
Updated at
2021/01/21
Tags
Keywords
3 more properties
여럿이 함께 프로그램을 개발하려면 필요한 부분을 나눠서 작성한 후 합쳐야 한다. 이 때 프로그램을 기능별로 나누는 방법은 (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기⟫ 수업자료
인프런, ⟪프로그래밍, 데이터 과학을 위한 파이썬 입문⟫ 수업 자료