Python 객체지향
객체지향 프로그래밍 (OOP : Object Oriented Programming)
- 프로그램을 명령어의 나열로 보는 시각에서 벗어나 여러 개의 독립된 단위인 “객체”들의 모임으로 파악하는 것으로 클래스, 속성, 메서드로 구성을 이루고 있다.
- 객체지향은 캡슐화(Encapsulation), 추상화(Abstraction), 상속성(Inheritance), Ploymorphism(다형성) 4가지의 특징으로 구성된다.
클래스의 구성
예제 | 설명 |
---|---|
class Car: def __init__(self): self._speed = 0 print('\n인스턴스 성공: 자동차 객체 생성!') def get_speed(self): return self._speed def start(self): self._speed=10 print('자동차 출발') def accelerate(self): self._speed += 20 print('자동차 가속') def stop(self): self._speed=0 print('자동차 정지') 나의차 = Car() 나의차.start() 나의차.accelerate() print('현재속도:', 나의차.get_speed()) 나의차.stop() | __init(self)__ 메서드: __으로 시작하는 메서드를 매직메서드 또는 특별메서드라고 함 객체가 처음 생성될 때 자동으로 호출되는 메서드| |
self 는 객체를 가리키며 첫 번째 인자로 가져야 함 | |
_speed 속성: _으로 시작하는 속성은 private으로 외부에서 접근이 제한된다 ※ one underscore : 외부에서 변경가능, two underscore : 외부에서 변경불능 | |
클래스 이름은 코딩규약에 따르면 주로 대문자로 시작한다. 클래스 안에 변수를 접근 하려면 클래스일름.변수 : print(나의차._speed) | |
type( {1:'아버지', 2:'어머니'}) dict | 내장형(Built-in)/사용자 정의 클래스 |
클래스내 메서드 종류
예제 | 설명 |
---|---|
# ※ self 와 cls의 차이는 오직 메소드 타입에 있다. # instance 메소드 사용시 self, class 메소드는 cls class Circle: __PI = 3.141592 @classmethod def 원면적(cls, r): x = cls.__PI*(r**2) return round(x,4) | 클래스메서드 : 객체생성 없이 바로 접근 가능 Circle.원면적(3) |
class Circle: @staticmethod def 원면적(r, pi): x = pi*(r**2) return round(x,4) | 정적메서드: 객체생성 없이 바로 접근 가능 Circle.원면적(3, 3.1415) |
__init__() | 특별 메서드 (매직 메서드) 클래스에서 자동으로 또는 특별한 연산으로 호출되는 메서드로 ‘__’ 으로 시작 |
특징1: 캡슐화(encapsulation)
- 객체 외부에서 내부의 속성을 직접 접근, 속성을 읽거나 변경시키지 못하게 하는 것을 의미
- 허락된 인터페이스/외부에 공개된 메서드를 통해 읽고 변경이 가능
- 밑줄이 없으면 공개모드(public), 밑줄하나(protected)-변경가능하나 변경하면 안됨, 밑줄두개 (private)-변경불가
- 캡슐화의 원칙은 밑줄 하나 이다.
- property 기능 - 캡슐화를 유지하면서 쉽게 속성을 읽고 설정하는 방법
방법1- @ 활용법 | 방법2-property 함수 |
---|---|
#데코레이터 활용 class Radio: def __init__(self): self._state = 'off' print('인스턴스 성공 : 라디오 객체 생성!') @property def switch(self): return self._state @switch.setter def switch(self,value): self._state = value print('바뀐 라디오 상태:', value) radio.switch = 'on' | #property 함수 활용 class Radio: def __init__(self): self._state = 'off' print('라디오 객체 생성!') def read_state(self): return self._state def assign_state(self,value): self._state = value print('변경된 상태:', value) # property(fget=read_state,fset=assign_state ) 원래 문법이다 스위치=property(read_state, assign_state) 라디오.스위치='켜짐' |
특징2: 상속성(inheritance)
- 클래스를 처음부터 새롭게 만들지 않고 기존의 클래스를 활용하여 수정,보완 하여 새로운 클래스를 정의
- 상속을 원하지 않은 경우: ‘__’으로 시작하는 protected 모드로 속성 정의
# 예제 class Animal(object): # class Animal: 와 동일한 문장임 def __init__(self,legs=4,animal_type='beast'): self.legs=legs self.animal_type = animal_type def printleg(self): print('childleg'); # 부모의 init 이 세팅이 안되면 에러가 발생함에 주의 class Dog(Animal): # **kwargs(keword arguments) 함수 인자 전달 방식을 이용하여 간편히 상속 def __init__(self,name=None,owner=None, **부모인자): super(Dog,self).__init__(**부모인자) # super().__init__(**부모인자) 동일함 print(부모인자) self.name = name self.owner = owner def printleg(self): # 메서드 오버라이드 (재정의) print('childleg'); def printname(self): # 신규 메서드 추가 print('신규메서드');
특징3: 다형성(polymorphism)
- 객체가 인터페이스를 통해 다양한 동작을 제공해야 한다는 원칙
# 예시 class Animal: def __init__(self,name): self._name=name def talk(self): return (self._name[0:2]+', '+self._name[0:2]) # __init__ 가 지정되지 않기 때문에 Animal이 호출이 된다 class Cat(Animal): def talk(self): # override return '야아옹~~' # __init__ 가 지정되지 않기 때문에 Animal이 호출이 된다 class Dog(Animal): def talk(self): # override return '멍, 멍~' 애완동물 = [Cat('나비'), Dog('삽살이'), Cat('미미'), Animal('구렁이')] # 리스트 정의 # index i 가 객체를 나타내게 된다. for i in 애완동물: print(i._name + ': ' + i.talk()) >>> 결과 : 나비: 야아옹~~ 삽살이: 멍, 멍~ 미미: 야아옹~~ 구렁이: 구렁, 구렁
특징4: 추상성 (abstraction)
- 기능의 세부적인 복잡성을 숨기고 객체의 주요 기능만 보여줘야 한다는 원리
- 추상 클래스 (abstract class)
- 구현되지 않은 추상 메서드를 한 개 이상 가지며, 자식클래스에 구현하도록 강제
- 상속받은 클래스는 추상 메서드를 구현하지 않아도, import할 때까지 에러는 발생하지 않으나 객체를 생성할 때 에러 발생 ( 상속만 가능, 객체화 불가능! )
- 반드시 abc 모듈을 import 해야 함
- 사용법
from abc import * class 추상클래스_이름(metaclass=ABCMeta) @abstractmethod def 추상메서드_이름(self) pass
- 예시
from abc import * class AbstractCountry(metaclass=ABCMeta): name='국가명' population='국가명' capital='수도' def show(self): print('국가 클래스의 메소드 입니다.') @abstractmethod def show_captial(self): print('국가의 수도는 ? ',end='') class Korea(AbstractCountry): def __init__(self, name, population, capital): self.name = name self.population = population self.capital = capital def show_name(self): print('국가 이름은 :', self.name) def show_captial(self): # 추상 메서드를 구현해 준다 super().show_captial() print(self.capital) b = Korea("대한민국", 50000000, '서울') b.show_captial() # 결과는 아래처럼 출력 국가의 수도는 ? 서울 a = AbstractCountry() # 추상메소드가 정의 되지 않기 때문에 에러 발생
댓글남기기