객체지향 프로그래밍
프로그램을 구성하는 변수와 함수들에서 서로 연관성 있는 것 끼리 묶어서 모듈화하여 효율적인 프로그램을 만들기 위한 기술.
객체란
객체는 변수와 메소드가 서로 연관된 것끼리 묶어서 가지고 있는 값.
객체(object) = 속성(attribute) + 기능(method)
= 변수(field) + 함수(function)
클래스와 함수의 차이점
: 클래스가 함수보다 더 광범위한 개념. 함수가 클래스의 부분집합.
class(클래스)
: 객체의 설계도, 객체를 만들기 위한 것
class 클래스이름 : #선언부
#클래스 구현
#메소드들을 정의
Attribute(속성)
: 객체의 데이터, 객체가 가지는 값, 상태
instance 메소드(method)
1) 객체가 제공하는 기능
2) 객체의 attribute값을 처리하는 기능구현
def 이름(self [, 매개변수들 선언]):
#구현
#attribute 사용(조회/대입)
self.attribute
3) self (첫번째 매개변수)
- 메소드를 소유한 객체를 받는 변수
- 호출할 때 전달하는 argument를 받는 매개변수는 두번째부터 선언
- 메소드 호출
객체.메소드이름([argument, ...])
생성자(initializer)
: 객체를 생성할때 호출되는 특수메소드. 초기화 메소드 __init__(self,...)
def __init__(self [, 매개변수들 선언]):
self.속성명 = 값
정보은닉 (information hiding)
: 외부에서 마음대로 바꾸지 못하게 하기 위해 호출을 막고, setter/getter 메소드를 통해 변경/조회
데이터 보호가 주목적.
__(double underscore)로 시작하면 attribute의 직접호출을 막는다.
setter: attribute 값을 변경 set으로 시작
getter: attribute 값을 조회 get으로 시작
property 함수 사용
: 은닉된 instance 변수의 값을 사용할때 getter/setter대신 변수를 사용하는 방식 구현하기
setter/getter 구현 + property()
1) getter/setter 메소드를 만든다.
2) 변수 = property( getter, setter)를 등록한다.
3) 호출
예제)
class Person2:
def __init__(self, name, age, address):
self.__name = name
self.__age = age
self.address = address
self. email = None
# age값을 조회하는 메소드
def get_age(self):
return self.__age #같은 class에서는 __age(원래이름)로 호출가능.
#age값을 변경하는 메소드
def set_age(self, age):
if 0 <= age <=100:
self.__age = age
else:
print(f"{age}는 나이에 넣을 수 없습니다. 0 ~ 100 사이 정수를 넣어주세요.")
def get_name(self):
return self.__name
def set_name(self,name):
#이름은 두글자 이상일 경우만 변경가능.
if len(name) >= 2:
self.__name = name
else:
print("이름은 두글자 이상만 가능합니다.")
name = property(get_name, set_name)
age = property(get_age, set_age)
@property 데코레이터 : 위와 동일하게 작동하는 코드를 좀 더 간결하고 읽기 편하게 작성가능.
- getter메소드: @property 데코레이터 선언
- setter메소드: @getter 메소드이름. setter 데코레이터 선언
-> 반드시 getter 메소드 먼저정의, setter 메소드 이름은 getter와 동일해야한다.
상속(Inheritance)
: 기존 클래스를 확장하여 새로운 클래스 구현
1) 기반(base)클래스, 상위(super)클래스, 부모클래스
: 상속하는 클래스의 데이터타입이 된다, 물려주는 클래스
2) 파생클래스, 하위클래스, 자식클래스
: 상속을 해준 클래스보다 더 구체적인 클래스
다중상속과 단일상속
1) 다중상속 : 여러 클래스로부터 상속할 수 있다.
2) 단일상속 : 하나의 클래스로부터만 상속가능.
super() 내장함수
- 하위 클래스에서 상위 클래스의 instance를 반환(return)해주는 함수
super().메소드명()
메소드에서
- self.xxxx: 같은 클래스에 정의된 메소드나 attribute(instance변수) 호출
- super().xxxx: 부모클래스에 정의된 메소드나 attribute(부모객체의 attribute) 호출
예제)
class Student2(Person2):
# go() 메소드를 Student 클래스에 맞게 좀더 구체화된 내용으로 재정의(overriding) 한다.
# 상위클래스에 정의된 메소드와 동일한 선언(이름)으로 메소드를 구현.
def go(self):
print("스쿨버스를 타고 등교한다.")
def eat(self):
print("학교식당에 간다.")
print("급식을 받는다.")
# print("먹는다.") #부모클래스에 정의한 eat()을 실행시킨다.
super().eat() #super(): 부모클래스를 가리킨다.
def study(self):
print("학생이 공부한다. 2")
'데이터 분석일기 > python' 카테고리의 다른 글
정규표현식 (Regular Expression) (1) | 2023.08.29 |
---|---|
Iterable, Iterator, Generator와 Decorator (0) | 2023.08.28 |
예외처리 (0) | 2023.08.24 |
입출력 (1) | 2023.08.24 |
함수 (0) | 2023.08.17 |