Study Record

[파이썬] 클래스와 인스턴스와 모듈 본문

서버보안/리눅스 서버보안

[파이썬] 클래스와 인스턴스와 모듈

초코초코초코 2021. 11. 29. 09:44
728x90

1. 클래스와 인스턴스

 

객체(Object)

  • 객체(Object)란 실제 세상에 있는 것을 하나의 사물로 정의
  • class는 blue print(설계도)와 비슷하다. 설계만 한것이지 사용하도록 따로 설정하여 사용한다.
  • 실제 세계에 존재하는 실체(instance)를 객체라고 하고, 객체들의 공통점을 간추려서 개념적으로 나타낸것을 클래스(class)라고 한다.

 

☞ class 특성

  • 클래스(class)는 "class 클래스이름:" 형식으로 정의한다.
  • 클래스(class) 내부에 정의된 함수를 메소드(method)라고 한다.
  • 객체(EX: teaji)사용은 "인스턴스명 = 클래스()"와 같이 만든다.
  • 객체의 메소드를 사용할 때는 "인스턴스.메소드(== 객체.메소드)" 형식을 사용한다.
  • class 안의 method는 self가 항상 첫번째 패러미터로 온다.
  • self 패러미터는 현재 class의 instance를 참고한다는 뜻이다. class 내의 변수에 접근할 때 사용한다.

 

☞ 클래스 사용 예시

class Coffee:
    total_amount = 10
    total_amount_price = 5000
    coffee_price = 300
    put_price = 0
    req_coffee_nums = 0
    remaining_price = 0

    def __init__(self, price):
    	# 생성자 - 클래스가 처음 생성될 때 실행된다.
        self.coffee_price = price;
        print("우리 동네에 자판기가 새로 생겼습니다!")

    def request(self):
        while True:
            self.info()
            self.req_coffee_nums = int(input("뽑을 커피의 개수를 입력해주세요 : "))
            self.put_price = int(input("자판기에 돈을 넣어주세요 : "))

            if self.check_mount() == 1:
                self.remaining_price = self.put_price - self.req_coffee_nums * self.coffee_price
                self.total_amount_price += self.req_coffee_nums * self.coffee_price
                self.total_amount -= self.req_coffee_nums

                self.get(self.remaining_price, self.req_coffee_nums)

            if self.total_amount <= 0:
                print("커피를 다 팔았으니 영업을 종료합니다.")
                break
        pass

    def get(self, price, num):
        print("-" * 13)
        print("커피 %d 잔과 거스름돈 %d 원 나왔습니다.\n맛있게 드십시오." % (num, price))
        print("-" * 13)
        pass

    def info(self):
        print("*" * 13)
        print("남은 커피 수 : %d 개\n커피 가격 : %d 원" % (self.total_amount, self.coffee_price))
        print("*" * 13)
        pass

    def check_mount(self):
        if self.req_coffee_nums * self.coffee_price > self.put_price:
            # 넣은 돈이 부족하다.
            print("돈이 부족합니다.\n넣으신 돈 %d 원을 가져가십시오." % (self.put_price))
            return -1

        if self.total_amount < self.req_coffee_nums:
            # 커피 개수가 부족하다.
            print("자판기에 남은 커피가 부족합니다.")
            return 0

        return 1
    

Coffee().request()

 

☞ 상속

  • 상속이란 어떤 클래스가 다른 클래스의 성질을 물려 받는 것을 말한다.
  • 클래스를 만들 때 처음 부터 모든것을 새로 만들 필요 없이, 핵심적인 성질을 갖고 있는 클래스로 부터 상속 받아서 조금만 손을 보면 쓸만한 클래스를 만들수 있다.
  • 일반적으로 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.
  • 기존 클래스가 라이브러리 형태로 제공되거나 수정이 허용되지 않는 상황이라면,
      상속을 이용한다.

 

☞ 상속 예시

class Person:
    def __init__(self, fname, lname):
        self.firstname = fname
        self.lastname = lname

    def printname(self):
        print(self.firstname, self.lastname)


# Person 클래스를 상속받은 Student 클래스
class Student(Person):
    def __init__(self, fname, lname, year):
        super().__init__(fname, lname)		# 부모의 __init__ 함수를 불러온다.
        self.graduationyear = year

    def welcome(self):
        print("Welcome", self.firstname, self.lastname,
              "to the class of", self.graduationyear)


x = Student("SeoungChan", "Baik", 2019)
x.welcome()

 

2. 모듈

모듈(Module)이란 함수, 변수 또는 클래스들을 모아 놓은 파일이다.

미리 만들어진 모듈을 사용할 수도 있고, 직접 정의해서 사용할 수도 있다.

mod1.py main.py
def safe_sum(a, b):
    print("mod1.py 의 safe_sum()함수를 사용합니다.")
    if type(1) != type(b) or type(1) != type(a):
        print("정수가 아닙니다.")
        return None
    else:
        return a + b
import mod1 as mod

print(mod.safe_sum('가', 1))

 

if __name__ == "__main__"

 

__name__ 변수는 파이썬이 내부적으로 사용하는 특별한 변수명이다. 주로 쉘프롬프트에서 파이썬 스크립트를 실행할 때는 실행이 되도록 하고, 별도의 프로그램으로 제작이 되는 경우에는 import 해서 사용해야만 사용이 가능하도록 하기 위해서 사용한다.

만약 쉘 프롬프트에서 "# python mod1.py" 처럼 직접 mod1.py 파일을 실행하면 mod1.py 파일의 __name__ 변수에는 __main__ 이라는 값이 저장된다. 하지만 파이썬 쉘이나 다른 파이썬 모듈에서 mod1import 할 경우(import mod1)에는 mod1.py__name__ 변수에는 "mod1"이라는 mod1.py의 모듈이름 값이 저장된다.

따라서 if __name__ == "__main__" 의 의미는 쉘에서 실행하는 경우가 된다.

# mod1.py 파일 내용
print("__name__ variable : ", __name__)

728x90