dmswl

파이썬 클래스 vs 패키지 본문

챗봇

파이썬 클래스 vs 패키지

dmswl. 2022. 7. 26. 15:11

파이썬 클래스

 

- 파이썬은 기본적으로 OOP(Object-Oriented Programming)을 지원한다. 파이썬에서 사용되는 모든 것들은 객체로 이뤄져 있으며, 객체로 처리됨.

- 하지만 파이썬은 인터프리터 언어로 일반적으로 main 함수(또는 메서드)가 없어도 실행되며, 동적 바인딩을 통한 객체에 값을 할당함.

- 때문에 C언어와 같이 클래스가 없이 함수들의 집합으로만 이뤄지게 코드를 작성할 수 있지만, 알아두면 좋을 객체 지향의 장점을 살릴 수 있는 클래스와 객체에 대해 간단하게 알아보자.

 

클래스의 선언

 

- 파이썬에서 클래스를 선언하기 위해서는 def 클래스명(): 을 사용해 클래스를 선언.(이는 카멜 케이스를 따름)

 

클래스 구조

class MyCar():
    engine = 0 # 클래스 변수

    def __init__(self, speed, tire): # 생성자
        # self.* # 인스턴스 변수
        self.speed = speed
        self.tire = tire
        MyCar.engine += 1


    @staticmethod
    def is_engine(speed1, speed2):
            return speed1 == speed2


    @classmethod
    def get_engine(cls):
      return cls.engine


my_car = MyCar(5, '한국')  

print(my_car.speed) # 5
print(my_car.tire) # 한국
print(my_car.get_engine()) # 1
class MyCar{
  private static int engine = 0;
  private int speed;
  private String tire;

  public MyCar(int speed, String tire){
    this.speed = speed;
    this.tire = tire;
    MyCar.engine += 1;
  }

  public void setSpeed(int speed){
      this.speed = speed;
  }
  public int getSpeed(){
    return speed;
  }
  public void setTire(String tire){
    this.tire = tire;
  }

  public String getTire(){
    return tire;
  }

  public static int getEngine(){
    return MyCar.engine;
  }

  public static void main(String []args){
      MyCar myCar = new MyCar(5, "한국");

      System.out.println(myCar.getSpeed()); // 5
      System.out.println(myCar.getTire()); // 한국      
      System.out.println(myCar.getEngine()); // 1
  }
}

위 코드는 파이썬과 자바에서 MyCar라는 클래스를 선언할 때의 예를 유사하게 표현한 것.

 

self 키워드

: Java의 this 키워드와 유사. 객체 자신의 특정 변수를 인스턴스 메서드의 인자로 받는 값을 할당하기를 원할 때 사용.

인스턴스 메서드는 자기 자신을 가리키는 self 키워드를 인자의 첫번째에 항상 가지고 있어야 함.

 

접근제한자 X

: 그렇기 때문에 기본적으로 모두 public 상태, my_car라는 인스턴스 멤버에 닷(.) 연산자로 바로 접근 가능.

 

관례적으로 언더스코어(_)를 붙인 변수는 private 상태로 취급(원하면 직접 접근 가능), 언더스코어를 두개(__) 붙인 변수나 메서드의 경우에만 private 상태로 명시하여 접근 불가하게 할 수 있음.

 

마지막으로 __init__ 키워드는 생성자(Constructor)를 명시하는 전용 키워드로, 객체가 생성될 때 자동으로 호출되는 메서드를 의미.

파이썬 메서드명으로 __init__을 사용하면 이 메서드는 생성자가 된다. 

 

객체의 초기화를 위해 사용되는 것은 타언어와 마찬가지이지만, 약간 다른 성질을 갖는다. 

 

staticmethod, classmethod

정적 메서드(staticmethod)

: 다음은 위 코드에서 @ 데코레이터(Java의 annotation과 같은 역할)가 붙은 두 가지 메서드에 대해서 알아보자.

먼저, 정적 메서드 @staticmethod를 메서드명 앞에 작성하여 정적 메서드임을 명시하고, self 파라미터를 갖지 않고 인스턴스 변수에 엑세스 할 수 없다. 따라서 정적 메서드는 보통 객체 필드와 독립적이지만 로직상 클래스 내에 포함되는 메서드에 사용된다. 클래스 메서드는 메서드 앞에 @classmethod라는 데코레이터를 표시하여 해당 메서드가 클래스 메서드임을 표시한다.

 

클래스 메서드(classmethod)

: 다음으로 클래스 메서드는 정적 메서드와 비슷한데, 객체 인스턴스를 의미하는 self 대신 cls라는 클래스를 의미하는 파라미터를 전달받는다. 위의 예와 같이 클래스 메서드는 cls를 인자로 받아 클래스 변수에 접근할 수 있다.

일반적으로 인스턴스 데이터에 접근할 필요가 없는 경우 클래스 메서드나 정적 메서드를 사용하는데, 이때 보통 클래스 변수를 엑세스 할 필요가 있을 때는 클래스 메서드를, 이를 엑세스 할 필요가 없을 때는 정적 메서드를 사용한다.

  클래스 메서드 정적 메서드
클래스 변수에 엑세스 할 필요 O X

 

파이썬 모듈

모듈(Module)

: 파이썬 코드를 논리적으로 묶어서 관리하고 사용할 수 있도록 하는 것으로, 보통 하나의 파이썬 .py 파일이 하나의 모듈이 된다. 자바 언어에서 클래스를 import 해서 사용하는 것과 같은 방법이다.

모듈 안에는 함수, 클래스, 혹은 변수들이 정의될 수 있으며, 실행 코드를 포함할 수 있다.

이러한 모듈들을 사용하기 위해서는 모듈을 import 구문을 이용하여 사용하면 되는데, import문은 다음과 같이 하나 혹은 복수의 모듈을 불러들일 수 있다.

 

파이썬에서 모듈을 import 하면 그 모듈을 찾기 위해 다음과 같은 경로로 순서대로 탐색한다.


  1. 현재 디렉토리
  2. 환경변수 PYTHONPATH에 지정된 경로
  3. Python이 설치된 경로 및 그 밑의 라이브러리 경로

때문에 하나의 패키지에서 자주 사용되는 모듈은 되도록 같은 디렉토리에 작성하고, 여러 패키지에서 사용되는 모듈은 sys.path 파이썬 경로 디렉토리에 추가하는 것이 좋다. 패키지에 대한 자세한 내용은 밑에서 정리하도록 하고, sys.path를 통해 모듈의 경로를 추가하는 방법에 대해 알아보자.

 

sys.path를 사용하기 위해서는 sys라는 시스템 모듈을 import 해야 하며, sys.path는 임의로 수정할 수도 있다. 예를 들어, 기존 sys.path에 새 경로를 추가(append)하면, 추가된 경로도 이후 모듈 검색 경로에 포함된다. 

 

패키지

파이썬에서 모듈은 하나의 .py 파일을 가리키며, 패키지는 이러한 모듈들을 모은 컬렉션을 가리킨다. 파이썬의 패키지는 하나의 디렉토리에 놓여진 모듈들의 집합을 가리키는데, 그 디렉토리에는 일반적으로 __init__.py 라는 패키지 초기화 파일이 존재한다.(Python 3.3 이후부터는 init 파일이 없어도 패키지로 인식이 가능함)

패키지는 모듈들의 컨테이너로서 패키지 안에는 또 다른 서브 패키지를 포함할 수도 있다. 파일 시스템으로 비유하면 패키지는 일반적으로 폴더에 해당하고, 모듈은 폴더 안의 파일에 해당한다. 특정 패키지를 구성하고, 이러한 패키지를 사용하기 위해 import 구문을 확장해서 사용한다.

 

모듈 패키지
- 하나의 .py 파일
- 폴더 안의 파일
- 하나의 디렉토리에 놓여진 모듈들의 집합(__init__.py 존재)
- 폴더

 

Comments