Python_6. 클래스

소고기는레어·2021년 6월 4일
0

Python

목록 보기
6/10

클래스

클래스

  • 클래스는 서로 연관이 있는 변수와 함수의 집합이다.
  • 필요한 값만 입력해주면 미리 설정한 내용을 그대로 찍어낸 후 출력하는 일종의 자동화 공정이라고 볼 수 있다.
# 중국집 주문 접수
class order :
     # self를 제외한 괄호 안의 값을 전달하면 그 값이 가공을 거쳐 반환된다.
    def __init__(self, address, menu, amount, price) :
        self.address = address
        self.menu = menu
        self.amount = amount
        self.price = price
        print("{0:>20}".format("주문이 접수되었습니다."))
        print("{0:>20}".format("- 주문내역 -"))
        print("주소 : {0}".format(address))
        print(f"메뉴 : {menu}\t수량 : {amount}\t총액 : {amount*price}\n")

# order 클래스에 값 전달
order_1 = order("파이썬빌라 201호", "짜장면", 3, 5000)
order_2 = order("파이썬아파트 102동 403호", "짬뽕", 2, 6000)

# 반환
'''
        주문이 접수되었습니다.
            - 주문내역 -
주소 : 파이썬빌라 201호
메뉴 : 짜장면   수량 : 3        총액 : 15000

        주문이 접수되었습니다.
            - 주문내역 -
주소 : 파이썬아파트 102동 403호
메뉴 : 짬뽕     수량 : 2        총액 : 12000
'''

__init__

  • 클래스가 작동할 때 생성되는 것들을 객체라고 칭한다.
    • 클래스를 통해 이 객체가 생성될 때 inti이 자동으로 호출된다.
    • 객체는 클래스의 인스턴스이며 init에서 요구하는 값을 모두 입력해야만 클래스가 작동하고 객체가 생성된다.

멤버변수

  • 멤버변수는 클래스 내에서 생성된 변수를 의미한다.
  • 각 객체의 멤버변수는 외부에서도 호출이 가능하다.
  • 클래스를 통해 생성된 객체는 클래스 외부에서 변수를 추가해서 사용할 수도 있다.
# 이전에 생성한 중국집 주문접수
class order :
    def __init__(self, address, menu, amount, price) :
        self.address = address
        self.menu = menu
        self.amount = amount
        self.price = price
        print("{0:>20}".format("주문이 접수되었습니다."))
        print("{0:>20}".format("- 주문내역 -"))
        print("주소 : {0}".format(address))
        print(f"메뉴 : {menu}\t수량 : {amount}\t총액 : {amount*price}\n")

order_1 = order("파이썬빌라 201호", "짜장면", 3, 5000)
order_2 = order("파이썬아파트 102동 403호", "짬뽕", 2, 6000)

# 각 객체의 멤버변수는 아래와 같이 외부에서 호출이 가능하다.
print("{0}에 {1} 배달이 완료되었습니다.".format(order_1.address, order_2.menu))

# 클래스를 통해 생성한 객체에 외부에서 변수를 추가할 수 있다.
order_1.use_coupon = True

메소드

  • 클래스로 생성한 객체가 다양한 기능을 수행할 수 있도록 클래스 내부에서 메소드를 생성할 수 있다.
  • 객체명.메소드명() 으로 객체를 호출하고 해당 객체가 메소드를 수행하도록 명령한다.
# 이전에 생성한 중국집 주문접수
class order :
    def __init__(self, address, menu, amount, price) :
        self.address = address
        self.menu = menu
        self.amount = amount
        self.price = price
        print("{0:>20}".format("주문이 접수되었습니다."))
        print("{0:>20}".format("- 주문내역 -"))
        print("주소 : {0}".format(address))
        print(f"메뉴 : {menu}\t수량 : {amount}\t총액 : {amount*price}\n")
        
    # 클래스 내부에 메소드 추가하기
	# 클래스와 메소드에서 self는 호출될 객체 자기자신을 의미한다. 
    def cancel(self, reason):
    	print("{0} 주문을 취소하였습니다. 사유 : {1}"\
        .format(self.address, reason))
    
# 객체 생성
order_1 = order("파이썬빌라 201호", "짜장면", 3, 5000)
order_2 = order("파이썬아파트 102동 403호", "짬뽕", 2, 6000)

# order_1에 메소드 적용
# order_1의 정보를 불러온 뒤 cancel을 적용시킨다.
order_1.cancel("배달 불가 지역")
# => 파이썬빌라 201호 주문을 취소하였습니다. 사유 : 배달 불가 지역

상속

  • 상속은 다른 클래스의 정보를 다른 클래스로 불러와서 그대로 사용하는 것을 말한다.
    • 상속 해주는 클래스를 부모 클래스, 상속 받는 클래스를 자식 클래스라고 부른다.
  • 두 개의 클래스로부터 상속 받는 다중 상속 또한 가능하다.
    • 이 경우 부모 클래스를 콤마로 구분하여 작성하면 된다.
  • 상속은 변수만 상속 전달 받는 것이 아닌 포함된 모든 정보(행동, 함수 등)를 전달 받는다.
    • 따라서 자식 클래스에서 생성한 객체도 부모 클래스의 함수를 사용할 수 있다.
# 일반 주문과 배달 주문을 구분하여 받기로 하였다

# 일반 주문
class order:
    def __init__(self, menu, amount, price) :
        self.menu = menu
        self.amount = amount
        self.price = price
        print("{0:>20}".format("주문이 접수되었습니다."))
        print("{0:>20}".format("- 주문내역 -"))
        print(f"메뉴 : {menu}\t수량 : {amount}\t총액 : {amount*price}\n")

    def cancel(self, reason):
    	print("주문을 취소하였습니다. 사유 : {0}"\
        .format(reason))

# 배달 주문
class order_delivery(order): # order 클래스에서 상속을 받는다.
                   	     # 다중 상속일 경우 콤마로 구분
    def __init__(self, address, menu, amount, price):
        
        # order에서 상속 받을 변수를 호출한다.
        # 다중 상속일 경우 클래스별로 따로 호출한다.
        order.__init__(self, menu, amount, price)
        
        # 현재 클래스에서만 사용할 변수를 추가한다.
        self.address = address
        
        print("주소 : {0}".format(address))
        
	def delivery_cancel(self, reason):
    	print("{0} 배달 주문을 취소하였습니다. 사유 : {1}"\
        .format(self.address, reason))


order_1 = order("짜장면", 3, 5000)
order_2 = order_delivery("파이썬아파트 102동 403호", "짬뽕", 2, 6000)

메소드 오버라이딩

  • 이름 그대로 함수를 덮어 쓰는 것을 말한다.
  • 부모 클래스에서 물려 받은 함수를 자식 클래스에서 새로운 내용으로 덮어쓰게 된다. (함수의 이름은 같아야 한다.)
  • 이렇게 되면 부모 클래스의 객체는 기존의 함수를 사용하고,
    자식 클래스의 객체는 새롭게 재정의 된 함수를 사용하게 된다.
class order:
    def __init__(self, menu, amount, price) :
        self.menu = menu
##         self.amount = amount
        self.price = price
        print("{0:>20}".format("주문이 접수되었습니다."))
        print("{0:>20}".format("- 주문내역 -"))
        print(f"메뉴 : {menu}\t수량 : {amount}\t\
        총액 : {amount*price}\n")

    # 부모 클래스 함수
    # 부모 클래스 객체는 cancel을 호출하면 이 함수가 적용된다.
    def cancel(self, reason):
    	print("주문을 취소하였습니다. 사유 : {0}"\
        .format(reason))

class order_delivery(order):
    def __init__(self, address, menu, amount, price):
        order.__init__(self, menu, amount, price)
        self.address = address
        print("주소 : {0}".format(address))

    # 자식 클래스 함수
    # 함수 이름은 부모와 같지만 내용은 다르다.
    # 자식 클래스 객체는 cancel을 호출하면 이 함수가 적용된다.
    def cancel(self, reason):
    	print("{0} 배달 주문을 취소하였습니다. 사유 : {1}"\
        .format(self.address, reason))

pass

  • pass는 함수나 클래스 등에서 아무 행동도 수행하지 않고 넘어가는 것을 말한다.
def hello():
	print("안녕하세요")
# "안녕하세요"가 출력된다.
    
def abc():
	pass
# 아무 작업도 수행하지 않으며, 오류 등의 말썽 없이 다음 작업으로 넘어간다.
    
def bye():
	print("안녕히 가세요")
# "안녕히 가세요"가 출력된다.

super

  • super는 부모 클래스로부터 상속 받을 때 사용한다.
  • super를 사용하면 self와 클래스명을 입력할 필요가 없어서 간단하다.
  • 하지만 다중상속의 경우 가장 먼저 호출된 부모 클래스 1개의 내용만 상속하게 된다.
class order_delivery(order):
    def __init__(self, address, menu, amount, price):
    
    	# super를 이용한 상속
        # 부모 클래스명과 self가 생략된다.
        super().__init__(menu, amount, price)
        
        self.address = address
        print("주소 : {0}".format(address))

연습 문제

  • 클래스를 활용하여 다음 양식의 문장을 출력하는 부동산 매물 조회 프로그램 만들기

총 3대의 매물이 있습니다.
강남 아파트 매매 10억 2010년
마포 오피스텔 전세 5억 2007년
송파 빌라 월세 500/50 2000년

class House:

    house_list = []  # 매물 리스트를 클래스 변수로 생성

    def __init__(self, location, house_type, deal_type, price, completion_year):
        self.location = location
        self.house_type = house_type
        self.deal_type = deal_type
        self.price = price
        self.competion_year = completion_year
        House.house_list.append(self) # 인스턴스를 매물 리스트에 추가

    def show_detail(self): # 매물 정보를 출력할 함수 생성
            print(self.location, self.house_type, self.deal_type, self.price, self.competion_year)


# House 클래스로 매물 정보 입력
gangnam = House("강남", "아파트", "매매", "10억", "2010년")
mapo = House("마포", "오피스텔", "전세", "5억", "2007년")
songpa = House("송파", "빌라", "월세", "500/50", "2000년")

# 내용 출력
print("총 {0}대의 매물이 있습니다.".format(len(House.house_list)))
for i in House.house_list:
    i.show_detail()
profile
https://www.rarebeef.co.kr/

0개의 댓글