본문 바로가기

Langauge/Python

[Python] 6. 클래스와 모듈

728x90
반응형

클래스(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)

클래스는 상속을 통해 자신의 자식 클래스를 만들 수 있다.

  • 상속된 클래스(자식)상속하는 클래스(부모)의 모든 필드, 메서드를 그대로 가진다.
  • 상속은 여러번 할 수 있다.
  • 상속은 여러개 받을 수 있다.(다중 상속)

Person을 상속받은 Rachel과 Pupba

 

파이썬에서 상속하는 방법은 클래스명 옆에 ()안에 부모 클래스를 적으면 된다.

  • 다중 상속은 콤마(,)를 사용하여 여러개를 클래스를 상속 받을 수 있다.
  • 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

 

 

표준 라이브러리 모듈

  • 파이썬 인터프리터를 설치하면 같이 설치되는 모듈들이다.
 

The Python Standard Library

While The Python Language Reference describes the exact syntax and semantics of the Python language, this library reference manual describes the standard library that is distributed with Python. It...

docs.python.org

 

 

 

서드파티 모듈(Third Party Module)

  • 파이썬에서 공식적으로 개발한 것이 아닌 제3자나 회사가 만든 library, plug_in, framework 등이다.
  • ex. Numpy, Pandas, OpenCV, Flask, Django ...
  • 다음 사이트에서 검색해서 찾거나
 

PyPI · The Python Package Index

The Python Package Index (PyPI) is a repository of software for the Python programming language.

pypi.org

  • 또는 웹 검색을 통해 찾을 수 있다.
728x90
반응형

'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