티스토리 뷰
구조적 프로그래밍 (절차적 프로그래밍)
- 프로그램 작성 시 기능으로 세분화해서 각각의 기능을 모듈화(함수화)해서 구현
- 장점 : 설계/ 프로그래밍이 쉽고 빠르다.
- 단점: 프로그램 규모가 커지면 유지보수와 코드의 재사용이 어렵다.
객체지향 프로그래밍
- Object Oriented Programming (OOP)
- 개체들을 파악해서 그 개체들간의 관계를 프로그래밍 하는 방식
- 현실세계의 해결해야 할 문제를 그대로 프로그램으로 묘사(표현)
- 프로그램을 구성하는 주체들 (개체, 객체, Object)을 파악하고, 그 객체들간의 데이터 흐름에 초점을 맞추어서 프로그램을 작성
- 객체 모델링: 각각의 객체를 프로그램적으로 묘사
- 추상화(Abstraction)을 거쳐서 객체 모델링한다.
- 개체들의 [속성 -> 변수, 행위 -> 함수]
- 변수(property, member field, field)
- 함수(method)
** 현실세계의 개체를 프로그래밍적 객체로 나타내기 위한 수단이 클래스
Class
- 객체 모델링의 수단
- ADT다
ADT
- Abstract data type (추상적인 데이터 타입, ADT)
- class는 data type의 관점에서 봤을 때, 기존 data type을 이용해서 새로운 data type을 만드는 것이다.
- <-> Built-in data type
Instance
- 클래스를 기반으로, 내용을 메모리에 저장시키기 위해 instance로 메모리 공간을 만든다.
- 클래스는 하나, 클래스로부터 파생된 공간 (instance)들은 여러 개
- instance 하나가 한 사람의 데이터를 뜻함
Class Variable
- class 자체가 가진 변수
Instance Value
- 각각의 instance가 개별적으로 가지는 변수
- self.dept의 dept는 -> instance value
Instance Method
클래스 선언
class Student(object):
scholarship_rate = 3.0 # class variable
def __init__(self, name, dept, num, grade): # initializer 생성자 constructor
self.name = name
self.dept = dept
self.num = num
self.grade = grade
def __repr__(self): # 원래는 호출 시 메모리 주소가 출력되지만
return self.name # 재정의 가능
@classmethod # Decorator
def change_scholarship(cls, rate):
cls.scholarship_rate = rate
print("장학금 기준이 변경되었어요!")
@ staticmethod
def is_valid_scholarship(rate):
if rate < 0:
print("장학금 기준은 음수가 될 수 없습니다.")
def is_scholarship(self): # instance method
if self.grade > self.scholarship_rate: # error(x): instance namespace에 없으면 -> class namespace 가서 찾음
# instance namespcae에 변수 추가 된 이후에는 instance variable과 비교
# if self.grade > Student.scholarship_rate:
return True
else:
return False
클래스 사용
student = Student("홍길동", "심리학과", "20203311", 4.0)
print(student) # <__main__.Student object at 0x00000165AF5D1E88> - 재정의 아닐 시
print(student.__repr__()) # <__main__.Student object at 0x00000165AF5D1E88> - 재정의 아닐 시
print(student.is_scholarship()) # True
student.scholarship_rate = 4.5 # class variable을 변경하는 것이 아니라/ instance namespace에 새로 추가
print(Student.scholarship_rate) # 3.0
print(student.scholarship_rate) # 4.5
print(student.is_scholarship()) # False
# class method는 클래스를 인자로 받아서 class variable을 생성, 변경, 참조하기 위해서
# student.change_scholarship(3.7)
Student.change_scholarship(change_rate) # class method 사용
# 장학금 기준이 변경되었어요!
### static method
Student.is_valid_scholarship(change_rate ) # static method 사용
# 장학금 기준 학점은 음수가 될 수 없습니다.
정보은닉/ getter/ setter
# private로 처리된 속성이 있으면 외부에서 직접적인 access 불가 => method로 처리
# private 속성 값 알아내는 method => getter
# private 속성 값을 설정해주는 method => setter
class Student(object):
scholarship_rate = 3.0 # class variable
def __init__(self, name, dept, num, grade): # initializer
self.name = name # instance variable
self.__dept = dept # private variable
self.num = num
self.grade = grade
## getter method
def get_dept(self):
return self.__dept
## setter method
def set_dept(self, dept):
self.__dept = dept
# private method
def __print_date(self):
return self.name
student = Student("홍길동", "심리학과", "20203311", 4.0)
# print(student.__dept) # private 처리 - error
# 'Student' object has no attribute '__dept'
# student.__dept = "컴퓨터" # error
print(student.get_dept()) # 심리학과
student.set_dept("컴퓨터")
print(student.get_dept()) # 컴퓨터
Super Class
class Unit(object): # 모든 class는 object를 상속받는다.
def __init__(self, damage, life):
self.utype = self.__class__.__name__ # 클래스 이름 참조
self.damage = damage
self.life = life
def show_status(self):
print("직업: {}".format(self.utype))
print("공격력: {}".format(self.damage))
print("생명력: {}".format(self.life))
Sub Class
class Marine(Unit):
def __init__(self, damage, life, range_upgrade): # 오버라이딩 - 상속 시 재정의
super(Marine, self).__init__(damage, life) # Marine class의 상위 class를 찾아, 두 인자를 넘겨 init 호출
self.range_upgrade = range_upgrade
# overriding
def show_status(self):
super(Marine, self).show_status()
print("사거리 업그레이드 유무: {}".format(self.range_upgrade))
# overriding
def attack(self):
print("마린이 총으로 공격합니다. 땅땅!!")
def stimpack(self):
if int(self.life) < 20:
print("체력이 낮아서 스팀팩 수행이 불가능합니다.")
else:
# int(self.life) -= 10
# int(self.damage) += 1.5
print("마린이 스팀팩을 사용했어요!!")
Magic Function
- __init__, __repr__
Initializer
- instance가 만들어지는 순간 자동으로 호출 -> 초기화 역할
- constructor(생성자)와 비슷
dir() 내장 함수
- python 함수도 객체
- print(dir(my_func))
- **dir()**: 객체가 인자로 들어오면 해당 객체의 모든 속성과 메소드를 알려주는 python 내장 함수
Namespace
- instance namespace
- class namespace
- superclass namespace
- instance namespace < class namespace < superclass namespace
- instance namespace에서 찾지 못한 속성/메소드는 error를 발생시키는 것이 아니라, class namespace로 가서 찾는다.
instance method
- self인자를 가지고 있는 method
- 하나의 인스턴스에 한정된 데이터를 생성, 변경, 참조하기 위해서 사용된다.
class method
- 클래스를 인자로 받아서 class variable을 생성, 변경, 참조하기 위해서
- @classmethod
static method
- @staticmethod
access modifier(접근제어자)
- 외부에서 직접적으로 access하는 것을 막는 방법
- Java => public vs private
- Python => __변수명 -> private
Inheritance (상속)
- 재사용성을 위한 대표적인 객체지향 기법
- Parent Class = Upper /SuperClass
- Child Class =** Sub**Class
- IS-A관계
- Sub class** is a** Supler class
- 역성립 x
- 1:N 일대다
'멀티캠퍼스 AI과정 > 01 Python Basic' 카테고리의 다른 글
Python 07, 08, 09 - Decorator, Module, Exception (0) | 2021.01.05 |
---|---|
Python 05, 06 - Magic function, First Class, Closure (0) | 2021.01.05 |
Python 03 - Python 함수/ 내장/ 외장/ 람다 함수 (0) | 2021.01.05 |
Python 02 - 입출력, 제어문, List Comprehension (0) | 2021.01.05 |
Python - 01 DateTime (0) | 2021.01.05 |
댓글