본문 바로가기

Python

Python 클래스와 객체

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

 [ 파이썬 기초 마지막날(?) ]

언제부턴가 프로그래밍을 배우지 않을때부터

객체지향~ 객체지향~ 하는 이야기가 많이 들려왔다

 

나만의 착각일 수도 있지만 객체를 지양하는게 아닌 지향한다는건

최대한 객체로 만들라는 뜻 아닐까? 라는 생각을 했다

 

솔직히 정확한 뜻은 모른다

얼추 짐작해서 이런것을 말하는구나~ 싶긴한데

자료를 찾아봐도 대부분이 대답이 같은 것은 없고

두루뭉술한 수준인 것 같다

 

그런데 클래스를 배우면서 객체지향에 대한 단어의 이해를

확연하게 키울 수 있는것 같다

 

먼저 클래스의 코드 구조를 살펴보자

 

 

BusCard 클래스

파이썬에서의 클래스는 앞에 class 자가 붙는다

이것으로 다음 문구들이 class 인지 아닌지 구분할 수 있고

바로 첫번째 문단에 생성자가 올 수 있도록 한다

 

이 구조만 봤을때 느껴지는 건

클래스 안에 def 로 함수들이 오는구나 하는것인데

이를 보고 객체지향이라고 한다면

어느정도 느낌이 올지도 모르겠다

 

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

 

물론 정확한 표현은 아니지만

대략적으로 이렇게 이해하면 쉽지 않을까~ 하는 개인적인 생각이다

 

 

 

 

📋 생성자와 접근제어자

 

 

생성자

클래스의 가장 앞 부분에 나오는 __init__ 이 함수가 생성자다

생성자는 클래스를 호출할 때 초기값들을 설정해주는 역할이다

간혹 밑줄이 한개처럼 보일 때도 있지만 꼭 앞뒤로 두개씩을 붙여줘야 하고

init 글자가 생성자 역할을 하기 때문에

해당 함수는 생성자로 활용될 때 변함이 없다 ( __init__ )

 

클래스 사용에 앞서 인수를 넘겨주면

해당 인수를 매개변수로 받고

매개변수에 해당하는 내용에 대한 초기값을 생성자에서 줄 수가 있다

 

class Television:
    def __init__(self, channel, volume, on):
        self.channel = channel
        self.volume = volume
        self.on = on
    def show(self):
        print(self.channel, self.volume, self.on)
    def setChannel(self, channel):
        self.channel = channel
    def getChannel(self):
        return self.channel

 

Television 이라는 클래스가 존재를 하고

생성자에 매개변수로 self, channel, volume, on 을 받아들일 때

아래와 같은 코드로 어떻게 변화하는지 볼 수 있다

 

 

t = Television(9, 10, True)

t.show()
t.setChannel(11)
t.show()

출력 값

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 = 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))
            choice()
            continue
        else :
            print("\n▣ Y 혹은 N 으로 답변해주세요 ▣\n")
            continue

def choice() :
    choice = int(input("1) 재시작\t2) 프로그램 종료 : "))
    if choice == 1 :
        fCharge = int(input("\n재충전금액 입력 : "))
        global        bus
        bus.deposit(fCharge)
    else :
        print("\n=== 프로그램 종료 ===\n")
        err

main()

'Python' 카테고리의 다른 글

python으로 DB 파일 출력 및 수정  (0) 2022.10.27
Python 과 File  (0) 2022.09.07
파이썬 딕셔너리(Python Dictionary)  (0) 2022.09.06
튜플(Tuple)  (0) 2022.09.06