클래스(Class)
우리가 실생활에서 쓰는 모든 것을 객체(Object)라고 한다.
객체 지향 프로그래밍(Object Oriented Programming)
- 프로그램 구현에 필요한 객체를 파악한다.
- 각각의 객체들의 역할이 무엇인지를 정의한다.
- 객체들 간의 상호작용을 통해 프로그램을 만드는 것이다.
- 각 객체 안에는 필드와 메서드가 들어 있다.
객체지향의 4대 특징
- 추상화(abstraction)
- 캡슐화(encapsulation)
- 상속성(inheritance)
- 다형성(polymorphism)
- 동적바인딩(Dynamic Binding)
클래스와 객체의 관계
- 클래스(Class)
- 객체를 만드는 틀이다.(객체들을 추상화한 것이다.)
- 필드(상태)와 메서드(동작)를 정의한다.
- 하나의 클래스에서 무수히 많은 객체를 생성할 수 있다.
- 객체(Object) == 인스턴스
- 클래스를 실체화한 것이다.
- 클래스에서 정의한 필드와 메서드를 따른다.
- 각 객체는 독립적이다.(동일한 클래스에서 생성되어도 필드와 메서드의 변화를 공유하지 않는다.)
파이썬 클래스 정의
파이썬에서 클래스는 class 키워드를 사용해 정의할 수 있다.(클래스명은 맨 앞글자 대문자로 약속되어 있다.)
class 클래스명:
# 상태
# 메서드
__init__(self) 메서드로 생성자를 정의할 수 있다.
- 생성자는 객체가 생성될 때 단 한번만 실행된다.
- 객체의 상태를 초기화 할 때 사용한다.
- 매개변수로 항상 self를 줘야하고 추가적인 매개변수를 정의하면 객체를 생성할 때 반드시 값을 전달해야 한다.
class Test:
def __init__(self):
pass
# def __init__(self) -> None:
# pass
- 매개변수를 다르게 생성자를 여러개 정의하여 Overloading을 할 수 있다.
- Overloading은 같은 이름의 메서드를 매개변수를 다르게 여러개 정의하여 함수 호출 시 전달하는 값에 따라 다른 함수가 호출 된다.
class Test:
def __init__(self) -> None:
pass
def __init__(self,a) -> None:
self.a = a
def __init__(self,*args) -> None:
self.args = args
self는 객체/클래스 자기자신을 의미한다.
- 필드를 정의할 때 앞에 "self.필드" 형식으로 정의한다.
- 클래스 내부의 메소드를 호출하려면 "self.함수" 형식으로 호출한다.
- 클래스 내부의 필드를 호출하려면 "self.필드" 형식으로 호출한다.
class Test:
def __init__(self,a:int,b:int) -> None:
self.a :int = a
self.b :int = b
def func1(self):
print(self.a)
def func2(self,b:int):
self.func1()
print(b)
파이썬 객체
파이썬 객체 생성은 정의된 클래스를 메서드 호출하듯이 사용하면된다.
class Test:
def __init__(self,a:int) -> None:
self.a :int = a
def func1(self):
print(self.a)
# 클래스 정의
test = Test(10)
# 필드 a를 10으로 초기화한 객체 test
test.func1()
# 객체 메서드 호출
파이썬 기본적으로 모든 필드와 메서드들이 public으로 접근지정되어 있어 언제 어디서든 호출할 수 있다.(캡슐화)
- public : 클래스 내, 외 자유롭게 접근 가능
- protected : 클래스 내부, 상속된 클래스 내부에서 접근 가능
- private : 클래스 내부만 접근 가능
class Test:
def __init__(self,a:int,b:int,c:int) -> None:
self.a :int = a # public
self._b :int = b # protected
self.__c :int = c # private
def func1(self): # public
print(self._b)
print(self.__c)
def _func2(self): # protect
print(self.__c)
def __func3(self): # private
print(self.__c)
test = Test(10,9,8)
print(test.a)
test.func1()
상속(inheritance)
클래스는 상속을 통해 자신의 자식 클래스를 만들 수 있다.
- 상속된 클래스(자식)는 상속하는 클래스(부모)의 모든 필드, 메서드를 그대로 가진다.
- 상속은 여러번 할 수 있다.
- 상속은 여러개 받을 수 있다.(다중 상속)
파이썬에서 상속하는 방법은 클래스명 옆에 ()안에 부모 클래스를 적으면 된다.
- 다중 상속은 콤마(,)를 사용하여 여러개를 클래스를 상속 받을 수 있다.
- super()은 부모 클래스를 의미한다.(부모 클래스의 필드/메소드를 호출할 때 사용)
- super().__init__를 사용해 부모 클래스에 값을 전달 할 수 있다.
class Person:
def __init__(self,name:str,age:int) -> None:
self._name:str = name
self._age:int = age
def info(self) -> str:
return f"{self._name}의 나이는 {self._age}입니다."
class Rachel(Person):
def __init__(self,name:str,age:int,sex:str)->None:
super().__init__(name,age)
self.sex:str = sex
class Pupba(Person):
def __init__(self,name:str,age:int,sex:str) -> None:
super().__init__(name,age)
self.sex:str = sex
def hello(self) -> None:
print(f'Hello {self._name}')
p = Person("사람",1)
print(p.info())
r = Rachel("Rachel",2,"여자")
print(r.info())
pb = Pupba("Pupba",1,"남자")
print(pb.info())
pb.hello()
# 다중 상속
class Test(str,int,list):
def __init__(self) -> None:
super().__init__()
오버라이딩(Overriding)
- 상속한 자식 클래스에서 부모 클래스의 메서드의 내용을 수정한다.
- 자식 클래스로 만든 객체에서 메서드를 호출하면 수정한 내용을 실행한다.
# Person
# ..
# Rachel
# ..
class Pupba(Person):
# ...
def info(self) -> str:
return f"{self._name}의 나이는 {self._age}이고 성별은 {self.sex} 입니다."
# ...
pb = Pupba("Pupba",1,"남자")
print(pb.info())
클래스 메소드(Class Methods)
클래스에서 호출되는 메서드 self대신 "cls"를 사용하여 자신의 클래스를 전달한다.(다른것으로도 사용할 수 있지만 관용적으로 사용)
메서드를 정의할 때 위에 "@classmethod"라는 데커레이터를 써야한다.
- "cls(값)" 형태로 사용하면 전달된 값으로 초기화된 인스턴스(객체)를 반환한다.
class Test:
def __init__(self,a:int,b:int) -> None:
self.a:int = a
self.b:int = b
def printAll(self) -> None:
print(self.a,self.b)
@classmethod
def clsmd(cls,value):
return cls(value,value)
t1 = Test(1,2)
t1.printAll()
t2 = Test.clsmd(2)
t2.printAll()
t3 = t1.clsmd(3)
t3.printAll()
정적 메서드(Static method)
인스턴스나 클래스를 인자로 받지 않는 메서드이다.
메서드를 정의할 때 위에 "@staticmethod"라는 데커레이터를 써야한다.
- 호출할 때는 "클래스.메서드()" 형태로 호출 하는 방법이 관행이다.
- 같은 클래스로 만들어진 객체가 공유한다.
class Test:
def __init__(self,a:int,b:int) -> None:
self.a:int = a
self.b:int = b
@staticmethod
def printAB(a,b):
print(a,b)
Test.printAB(1,2)
Test.printAB(3,4)
모듈(Module)
함수나 변수 또는 클래스를 모아 놓은 파이썬 파일을 말한다.
이러한 모듈은 다른 파이썬 파일에서 불러와서 사용할 수 있으며 다음과 같은 키워드를 통해 불러올 수 있다.
import 파이썬 파일명(경로)
# as 를 사용해 별명을 지어서 사용할 수 있다.
# or
from 파이썬 파일명(경로) import 클래스 또는 메서드
# from 사용시 import * 를 사용하면 모든 클래스/메서드를 불러온다는 뜻
예시
# mod1.py
class Mod:
def __init__(self,a:int,b:int) -> None:
self.__a:int = a
self.__b:int = b
def add(self) -> int:
return self.__a+self.__b
# mod2.py
def hello1()->None:
print("Hello I'm Pupba!")
def hello2()->None:
print("Hello I'm Pupba!!")
# main.py
import mod1 as md1
from mod2 import hello1,hello2
md = md1.Mod(1,2)
print(md.add())
hello1()
hello2()
if __name__ == "__main__"을 사용해서 모듈 내 하드 코딩한 코드가 실행되지 않게 할 수 있다.
- if __name__ == "__main__" 블럭 안에 있는 코드들은 현재 스크립트가 메인으로 실행될 때 실행된다.(모듈로 사용시 X)
# mod2.py
def hello1()->None:
print("Hello I'm Pupba!")
def hello2()->None:
print("Hello I'm Pupba!!")
hello1()
hello2()
# main
from mod2 import hello1,hello2
# mod2.py
def hello1()->None:
print("Hello I'm Pupba!")
def hello2()->None:
print("Hello I'm Pupba!!")
if __name__ == "__main__":
hello1()
hello2()
# main.py
from mod2 import hello1,hello2
표준 라이브러리 모듈
- 파이썬 인터프리터를 설치하면 같이 설치되는 모듈들이다.
서드파티 모듈(Third Party Module)
- 파이썬에서 공식적으로 개발한 것이 아닌 제3자나 회사가 만든 library, plug_in, framework 등이다.
- ex. Numpy, Pandas, OpenCV, Flask, Django ...
- 다음 사이트에서 검색해서 찾거나
- 또는 웹 검색을 통해 찾을 수 있다.
'Langauge > Python' 카테고리의 다른 글
[Python] 8. 파일 처리 (0) | 2023.02.11 |
---|---|
[Python] 7. 예외처리 (0) | 2023.02.11 |
[Python] 5. 함수 (0) | 2023.02.10 |
[Python] 4. 내장 자료형 (0) | 2023.02.10 |
[Python] 3. 제어문 (0) | 2023.02.10 |