A. Programming/Python

[파이썬 코딩 #5] 클래스와 if __name__ == "__main__" - 로또(Lotto) 번호 생성 프로그램 - 5

_DK_ 2022. 3. 12. 12:00
반응형
저는 미래가 어떻게 전개될지는 모르지만,
누가 그 미래를 결정하는지는 압니다.
- 오프라 윈프리

 

  이전 글을 통해서 작성한 코드들을 모듈로 만들어 프로그램의 동작 흐름을 보다 알기 쉽도록 해보았습니다.

[A. Programming/Python] - [파이썬 코딩 #4] 모듈 만들기 - 로또(Lotto) 번호 생성 프로그램 - 4

 

[파이썬 코딩 #4] 모듈 만들기 - 로또(Lotto) 번호 생성 프로그램 - 4

성공(success)이 노력(work)보다 먼저 나타나는 유일한 곳은 사전이다. - 비달 사순 이전 글들을 통해 로또 번호를 랜덤으로 생성을 해보고 이를 파일로 저장하는 것까지 해보았습니다. [A. Programming/P

yongbba.tistory.com

 

 이번에는 파이썬의 클래스를 작성해보는 방법을 알아보고 이 과정에서 필요한 것들에 대해서 조금 알아보려고 합니다.

 

 

 파이썬 클래스 작성

 

  파이썬을 이용하여 코딩을 잘하기 위해서는 객체지향 프로그래밍에 익숙해져야 하고, 이를 위해서는 클래스(class)를 생성하고 이를 활용하는 방법을 익혀야 합니다. 앞선 글들에서 작성했던 'Lotto.py' 코드를 클래스를 활용하여 다시 작성을 해보도록 하겠습니다.

import randomNum
import excelFunc

class Lotto:
    def __init__(self):
        self.start = 1
        self.end = 45
        self.count = 6
        self.lottoNum = []
        self.filePath = 'C:/TEST/Lotto/data/data.xlsx'

    def createLottoNum(self):
        self.lottoNum = randomNum.ranNumAndSort(self.start, self.end, self.count)

    def createWBAndWrite(self):
        wb = excelFunc.createWorkBook()
        excelFunc.writeLottoNum(wb, self.lottoNum, self.filePath)

    def readLottoNum(self):
        self.lottoNum = excelFunc.readLottoNum(self.filePath)

myLotto = Lotto()
myLotto.createLottoNum()
print(myLotto.lottoNum)

myLotto.createWBAndWrite()
myLotto.readLottoNum()
print(myLotto.lottoNum)

 

  위의 코드를 살펴보면 'Lotto'라는 클래스를 만들어주고, 로또 번호를 생성하는데 필요한 변수들을 클래스 변수로 추가해서 처리를 하도록 변경하였습니다. 클래스를 생성하면 호출되는 '__init__' 부분에 클래스 변수들을 정의하고 클래스 함수들에서 이를 이용하여 각 기능들을 하도록 변경해주었는데, 이는 'Lotto'라는 클래스를 생성하고 클래스에서 제공하는 함수들만 호출하면 원하는 결과를 얻을 수 있도록 변경되었다고 볼 수 있습니다.

 

  여기에서 '__init__'을 이용하여 클래스 변수들의 초기값을 설정해주었는데, 파이썬은 클래스를 이용하여 객체를 생성하면 '__new__' 메소드와 '__init__' 메소드가 실행이 됩니다.('__new__'와 '__init__'는 기능이 다르며, 일반적으로 클래스 변수 초기화는 '__init__'에서 하는 편입니다.)

 

  위의 코드를 실행해보면 이전 코드와 동일하게 동작하는 것을 확인 할 수 있습니다. 

 

 

 if __name__ == "__main__" 활용한 메인 함수 구성

 

  만약 위에서 작성한 'Lotto'라는 클래스를 이용하여 추가적인 개발을 한다고 가정을 해보도록 하겠습니다. 이때 보통 다른 파일에서 'Lotto'라는 클래스를 이용하여 객체를 생성하게 될 텐데 이 경우 어떻게 되는지 알아보도록 하겠습니다. 테스트를 위하여 'test.py' 라는 파일에 아래와 같은 코드를 작성하여 보겠습니다.

 

import Lotto

print('test')

 

  위와 같이 작성 후 실행하면 'test'라는 문구만 출력되는 것이 아닌 'Lotto.py' 내에 작성된 코드들이 모두 실행이 됩니다. 'Lotto'라는 클래스만 이용을 하려고 했을 뿐인데 파이썬에서는 'Lotto.py'에 작성된 모든 코드를 실행한 것입니다.

 

  대부분의 프로그래밍 언어는 main 함수가 있어야 실행이 가능하며, 이 main 함수부터 실행이 됩니다. 파이썬은 이 main 함수가 없어도 실행이 가능하며, 따라서 import만 하더라도 존재하는 모든 코드들이 실행이 될 수가 있습니다. 이는 다소 불필요한 동작이 될 수도 있으며, 의도치 않은 동작을 일으킬 수도 있습니다. 이런 동작을 방지하고 다른 프로그래밍 언어들과 비슷하게 모듈이 import 될 때가 아닌 직접 실행을 하였을 때만 실행이 되도록 할 수 있습니다.

 

  위에서 작성한 'Lotto.py'를 아래와 같이 작성하여 보도록 하겠습니다.

import randomNum
import excelFunc

class Lotto:
    def __init__(self):
        self.start = 1
        self.end = 45
        self.count = 6
        self.lottoNum = []
        self.filePath = 'C:/TEST/Lotto/data/data.xlsx'

    def createLottoNum(self):
        self.lottoNum = randomNum.ranNumAndSort(self.start, self.end, self.count)

    def createWBAndWrite(self):
        wb = excelFunc.createWorkBook()
        excelFunc.writeLottoNum(wb, self.lottoNum, self.filePath)

    def readLottoNum(self):
        self.lottoNum = excelFunc.readLottoNum(self.filePath)

if __name__ == "__main__":
    myLotto = Lotto()
    myLotto.createLottoNum()
    print(myLotto.lottoNum)

    myLotto.createWBAndWrite()
    myLotto.readLottoNum()
    print(myLotto.lottoNum)

 

  위와 같이 코드를 작성한 후 'test.py'를 실행하면 'test' 문구만 출력되며, 'Lotto.py'를 실행하면 이전과 같이 로또 번호가 생성되는 것을 확인할 수 있습니다.

 

  직접 실행을 할 경우에는 '__name__' 변수에 "__main__"이라는 값이 들어가고, import 등을 통한 참조가 될 때에는 모듈명이 들어가게 됩니다. 파이썬에서 코딩을 할 때는 이를 이용하여 main 함수처럼 구성을 하는 것이 일반적입니다.('__name__'을 출력하는 코드를 추가하고 'Lotto.py'와 'test.py'를 실행해보면 어떤 식으로 값이 들어가는지 알 수 있습니다.)

 

  이번 글에서는 파이썬의 클래스나 '__init__', '__name__' 등의 사용 방법에 대해서 간략하게나마 알아보았습니다.(보다 자세한 내용들은 여기서 다 다루는 것은 원래 의도와는 맞지 않다고 보여 어떤 식으로 작성하는지에 대해서만 알아보았습니다. 이론적인 내용들은 훨씬 더 잘 작성된 블로그들이 많다고 생각되기에...)

 

  다음 글들에서는 로또 번호 생성 프로그램에 기능을 하나씩 추가하면서 파이썬에서 제공하는 다양한 모듈들에 대해서 알아보려고 합니다.

 

 

 

반응형