Python 클래스와 객체 | dasfef

2023.03.05


📋 충북대학교 공동훈련센터 IoT기반 스마트솔루션 개발자 양성과정

[ 파이썬 기초 마지막날(?) ] 언제부턴가 프로그래밍을 배우지 않을때부터 객체지향~ 객체지향~ 하는 이야기가 많이 들려왔다
나만의 착각일 수도 있지만 객체를 지양하는게 아닌 지향한다는건 최대한 객체로 만들라는 뜻 아닐까? 라는 생각을 했다
솔직히 정확한 뜻은 모른다 얼추 짐작해서 이런것을 말하는구나~ 싶긴한데 자료를 찾아봐도 대부분이 대답이 같은 것은 없고 두루뭉술한 수준인 것 같다
그런데 클래스를 배우면서 객체지향에 대한 단어의 이해를 확연하게 키울 수 있는것 같다
먼저 클래스의 코드 구조를 살펴보자

BusCard Class


파이썬에서의 클래스는 앞에 class 자가 붙는다 이것으로 다음 문구들이 class 인지 아닌지 구분할 수 있고 바로 첫번째 문단에 생성자가 올 수 있도록 한다
이 구조만 봤을때 느껴지는 건 클래스 안에 def 로 함수들이 오는구나 하는것인데 이를 보고 객체지향이라고 한다면 어느정도 느낌이 올지도 모르겠다

” 지금까지 활용해보면서 느껴본 객체지향이라 함은 한가지로 분류된 코드에 줄줄이 여러 기능을 넣고 쓰는게 아닌 중요한 기능, 세부적인 기능 등 여러 기능들에 있어 각각의 객체로 만들어주고 그 객체들을 적재적소에 불러와서 이용할 수 있게끔 구성을 해주는 것이 객체지향이라고 느끼고 있다 “


물론 정확한 표현은 아니지만 대략적으로 이렇게 이해하면 쉽지 않을까~ 하는 개인적인 생각이다

📋 생성자와 접근제어자

생성자


클래스의 가장 앞 부분에 나오는 __init__ 이 함수가 생성자다 생성자는 클래스를 호출할 때 초기값들을 설정해주는 역할이다 간혹 밑줄이 한개처럼 보일 때도 있지만 꼭 앞뒤로 두개씩을 붙여줘야 하고 init 글자가 생성자 역할을 하기 때문에 해당 함수는 생성자로 활용될 때 변함이 없다 __init__


클래스 사용에 앞서 인수를 넘겨주면 해당 인수를 매개변수로 받고 매개변수에 해당하는 내용에 대한 초기값을 생성자에서 줄 수가 있다
Television 이라는 클래스가 존재를 하고 생성자에 매개변수로 self, channel, volume, on 을 받아들일 때 아래와 같은 코드로 어떻게 변화하는지 볼 수 있다


출력 값


9 10 True 로 인자를 넘기고 생성자에서 전역변수를 활용하기 위해 self. 을 필수로 붙여준다
그리고 self가 붙은 전역변수들의 값을 생성자에서 받아오는 매개변수들의 값과 동일화 시켜주고 그대로 프린트를 하게 되면 매개변수로 받은 9 10 True를 다시 출력한다
setChannel 함수를 통해 채널만 바꾸고 다시 show 를 통해 출력하면 채널만 변경된 것을 볼 수 있다
이처럼 생성자는 매개변수로 받아들이는 인수들의 초기값을 설정할 수 있도록 할 수 있다

접근제어자


접근제어자는 클래스 안에서 쓰이는데 양쪽이 밑줄 두개가 아닌 이상 클래스 내에서 한정적으로 쓰인다 즉 지역변수와 동일하게 클래스 내에서만 살아서 기능한다
이정도만 알아도 클래스 사용에는 큰 무리가 없는 것으로 판단되고, 새로운 지식이 있다면 추가적으로 넣도록 하겠다
마지막으로 수업을 들으면서 만들었던 버스카드 충전 및 잔액 표시 등의 기능을 넣었던 코드를 공유하고 마치도록 하겠다
[ 버스카드 클래스 연습 ]

1) 버스 충전 카드 클래스 생성

2) 충전할 금액 입력

3) 버스 탑승 여부 질문 (Y/N)

3-1) 탑승시 1200원씩 차감 및 몇회째 탑승인지 카운트 + 잔액 표시

3-2) 미탑승시 몇회 탑승했는지 카운트 표시 및 잔액 표시

3-3) 잔액 부족시 메시지 출력과 함께 종료
아래는 내가 작성한 코드이며 미탑승시 재충전 여부를 묻는 기능과 재충전시 기존에 남아있던 금액 + 재충전한 금액까지 포함하여 진행, 앞으로 남은 잔액으로 몇회 탑승할 수 있는지까지 제시하는 기능을 포함하였다

class BusCard :
    def __init__(self) :
        self.__balance = 0

    def withDraw(self, amount) :        # 출금시 수행 함수
        self.__balance -= amount        # 금액 = 총액 - 출금액
        return self.__balance

    def deposit(self, amount) :         # 입금시 수행 함수
        self.__balance += amount        # 금액 = 총액 + 입금액
        return self.__balance

# --------------------------------
def main() :
    fCharge = int(input("충전금액 입력 : "))
    global bus                          # bus 변수 글로벌 선언
    bus = BusCard()
    bus.deposit(fCharge)                # 최초 충전금액

    count = 0
    while True:
        getIn = str(input("☛ 승차 하시겠습니까?(Y/N) : "))
        if ((getIn == str("Y")) or (getIn == str("y"))) :
            count += 1                  # 탑승 횟수 카운트
            print("\n<< %d 회 탑승 >>" % count)
            change = bus.withDraw(1200)
            print(" [잔액] : %d" % change)
            print("")
            if(change < 1200):
                print("=== 잔액이 부족합니다 ===")
                break
        elif ((getIn == str("N")) or (getIn == str("n"))) :
            print("\n=== 승차 의사 없음 ===")
            print("\n [잔액] : %d" % change)
            print("남은 탑승가능 횟수 : %d\n" % (change // 1200))       # 잔액 / 1200 몫 == 탑승 가능 횟수
            choice()
            continue
        else :
            print("\n -- Y 혹은 N 으로 답변해주세요 \n")                 # 다른 키 입력시 출력
            continue

def choice() :
    choice = int(input("1) wotlwkr\t2) 프로그램 종료 : "))
    if choice == 1 :
        fCharge = int(input("\n재충전금액 입력 : "))
        global bus
        bus.deposit(fCharge)
    else :
        print("\n=== 프로그램 종료 ===\n")
        err                                                         # error 발생으로 강제 프로그램 종료

main()