본문 바로가기

카테고리 없음

Python - Class

1.1 class 선언

- 사칙연산을 수행하는 클래스 선언하기

 

class FourCal:
    pass

 

* 파이썬에서는 클래스선언 또는 조건문, 반복문에서 대괄호 ( {} ) 대신 콜론 ( : )과 들여쓰기로 대체된다.

* pass는 아무것도 수행하지 않는 문법으로, 임시로 코드를 작성할 때 주로 사용된다.

 

a = FourCal()
print(type(a)) # <class '__main__.FourCal'>

 

1.2 메서드 선언

- 클래스 안에 함수 구현하기

- 함수 구현은 def 키워드를 사용해 선언한다.

 

class FourCal:
    def __init__(self, first, second):
        self.first = first
        self.second = second

    def add(self, first, second) -> int:
        return first + second

 

* 함수 또한 다른 언어와 같이 대괄호를 사용하지 않고 콜론과 들여쓰기로 선언을 한다.

* 파이썬에서 클래스의 생성자는 __init__ 이라는 이름의 메서드로 구현한다

* 파이썬에서 인스턴스 변수(객체 변수)는 self.(인스턴스 변수) = 할당하고자 하는 값 형태로 메서드 어디서든 선언할 수 있다. 하지만 변수는 사용전에 기본적으로 선언되어있어야 좋다.

* 여기서 클래스 메서드를 선언할 때는 첫 매개변수로 self를 가지게 되는데, self는 특별한 의미를 가지게 된다.

먼저 위에 선언한 add 함수를 호출해 보자

 

a = FourCal(3, 5)
print(a.add(a.first, a.second))

 

add 메서드에는 self, first, second 총 세개의 파라미터가 필요한데 실제로는 2개만 전달한 것을 확인할 수 있다.

여기서 self는 add를 호출한 객체 a 가 자동으로 전달된다.

 

 

파이썬에서의 첫번째 매개변수, self는 관례적으로 사용된다.

객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self 라는 이름을 사용한 것이다. 따라서 다른 이름으로 사용해도 상관없다는 의미이다. ( 다른 이름으로 사용해도 첫번째 매개변수는 생략될 것이다. )

 

class A:
    def func1():
        print("function 1")
    
    def func2(self):
        print("function 2")

 

예시로 인자를 아예 받지않는 메서드와, 1개만 받는 메서드, 2개의 파라미터를 받는 메서드를 선언하고 실행시켜보자

 

func1을 선언할때
func2을 선언할때
func3을 선언할때

 

결과는 다음과 같은 에러가 뜬다.

 

 

func1은 인자가 없지만, 하나의 인자를 받았다는 에러가 발생한다.

이는 앞서 언급했던 것 처럼 파이썬이 클래스에 선언된 메서드엔 첫번째 인자로 항상 인스턴스를 전달해주기 때문이다.

self는 객체 자기 자신을 참조하는 매개 변수이다. 자바와 같은 객체지향 언어에서는 이것을 안보이게 전달하지만 파이썬은 명시하게 한다. 

 

1.3 클래스의 상속

클래스를 상속하기 위해서는 다음처럼 클래스의 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 된다.

 

class 클래스 이름(상속할 클래스 이름)

 

class FourCal:
    def __init__(self, first, second):
        self.first = first
        self.second = second

    def add(self) -> int:
        return self.first + self.second

    def mul(self):
        return self.first * self.second

    def sub(self):
        return self.first - self.second

    def div(self):
        return self.first / self.second


class MoreFourCal(FourCal):
    def pow(self):
        return self.first**self.second
        
    def div(self):
        if self.second == 0:
            return 0
        else:
            return self.first // self.second


a = MoreFourCal(3, 5)
print(a.add()) # 8
print(a.div()) # 0
print(a.pow()) # 243

 

1.4 클래스 변수

객체 변수는 다른 객체들에 영향을 받지 않고 독립적으로 그 값을 유지한다는 점이 있지만, 클래스 변수는 클래스로 만든 모든 객체에 공유 된다는 특징이 있다.

 

class Family:
    lastname = "Lee"

    def __init__(self, firstName):
        self.firstName = firstName

    def printName(self):
        print(Family.lastname, self.firstName)


jin = Family("Jin Ha")
dong = Family("Dong Jun")

jin.printName() # Lee Jin Ha
dong.printName() # Lee Dong Jun

 

id  함수를 사용하면 클래스 변수가 공유된다는 사실을 확인할 수 있다.

 

print(id(jin.lastname)) # 4381772336
print(id(dong.lastname)) # 4381772336
print(id(Family.lastname)) # 4381772336

 

2.  모듈

모듈은 함수나 변수 또는 클래스를 모아 놓은 파일이다.
모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다.

 

2.1. 모듈 만들기

 

# mod1.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

 

위 예시처럼 mod1.py라는 모듈을 만들고 해당 모듈을 사용하기 위해서는 import 키워드를 사용한다.

모듈을 사용하기 위해서는 해당 모듈이 동일한 디렉터리에 있어야 한다.

 

import mod1

print(mod1.add(2, 3)) # 5

 

mod1.add, mod1.sub처럼 쓰지 않고 모듈 이름 없이 함수 이름만 쓸려면 from 모듈 이름 import 모듈 함수 를 사용하면 된다.

 

from mod1 import add

print(add(2, 3)) # 5

 

또는 add 이외에 다른 함수를 사용하고 싶다면 아래와 같은 방법이 있다.

 

from mod1 import add, sub # 콤마로 구분하여 필요한 함수들을 불러옴
from mod1 import * # 모든 함수, 클래스들을 불러옴

 

2.2 __name__ == "__main__"

위 예시에서 구현했던 mod1.py에 연산 결과를 출력하는 문장을 추가해보자.

 

# mod1.py

def add(a, b):
    return a + b

def sub(a, b):
    return a - b

print(add(2, 3)) # 5
print(sub(10, 5)) # 5

 

위 모듈을 다른 곳에서 사용하기 위해 import mod1를 수행하는 순간 mod1.py가 실행되어 추가된 두 문장의 결괏값이 출력된다.

이러한 문제를 방지하려면 mod1.py를 다음과 같이 변경해야 한다.

 

# mod1.py


def add(a, b):
    return a + b


def sub(a, b):
    return a - b

if __name__ == "__main__":
    print(add(2, 3))
    print(sub(10, 5))

 

if __name__ == "__main__" 조건문

- mod1.py를 직접 실행했을 경우 : 참이 되어 if 다음 문장을 실행

- import를 사용하여 다른 파일에서 이 모듈을 불러서 사용했을 경우 : if 다음문장을 실행하지 않음.

 

* __name__ 변수는 파이썬이 내부적으로 사용하는 특별한 변수 이름으로, mod1.py를 직접 실행할 경우 __name__변수에 __main__값이 저장된다.

하지만 다른 파일에서 import할 경우엔 __name__ 변수에는 mod1.py 모듈 이름 값 mod1 이 저장된다.

 

더보기

python에서의 __name__

 

파이썬에서의 __name__은 프로그램의 시작점을 나타내는 변수이다. 파이썬은 최초로 시작한 스크립트 파일과 모듈의 차이가 없기 때문에 어떤 스크립트 파일이든 시작점도 될 수 있고 모듈도 될 수 있다. 그래서 name 변수를 통해 현재 스크립트 파일이 시작점인지 모듈인지 판단한다.

__name__ 변수에 __main__ 이라는 값이 들어가는 것은 프로그램의 시작점이라는 것을 의미하며, 그 외의 값은 시작점이 아님을 의미한다.

 

* 파이썬이 처음에 개발 될 당시에는 리눅스/유닉스에서 사용하는 스크립트 언어 기반이었기 때문에 프로그램의 시작점이 따로 정해져 있지 않았습니다. 보통 리눅스/유닉스의 스크립트 파일은 파일 한 개로 이루어진 경우가 많은데, 이 스크립트 파일 자체가 하나의 프로그램이다 보니 시작점이 따로 필요하지 않습니다. 하지만 C 언어나 자바같은 언어는 처음 만들어질 때부터 소스 파일을 여러 개 사용했기 때문에 여러 소스 파일의 함수들 중에서도 시작 함수(main)를 따로 정해 놓았습니다.

 

 

참고

파이썬 코딩 도장: 45.2 모듈과 시작점 알아보기 (dojang.io) 

 

파이썬 코딩 도장: 45.2 모듈과 시작점 알아보기

인터넷에 있는 파이썬 코드를 보다 보면 if __name__ == '__main__':으로 시작하는 부분을 자주 만나게 됩니다. if __name__ == '__main__':     코드 도대체 이 코드는 왜 사용하는 것일까요? 이 코드는 현재

dojang.io

 

[Python] __name__ 이란? (velog.io)