본문 바로가기
개발일지/Python

2022.02.09 파이썬정복 15장-1 클래스

by 개발에정착하고싶다 2022. 2. 9.
320x100
# 15 클래스

# 캡슐
'''
# 해설코드
balance = 8000
def deposit(money):
    global balance # 앞에 glabal을 써주는게 무슨 효과가 있을까?
    balance += money
    # return 이나 print는 안써줘도 되는구나

def inquire():
    print("잔액은 %d원입니다."% balance)

deposit(1000)
inquire()

# 위의것의 결과값을 얻기위한 노력은 사실 매우 간단한 코드로 표현이 가능한데
# 왜 굳이 이렇게 길고 복잡하게 만들었을까?
# 뭔가 추가되는 계좌들이 있는 상황에선 이게 편하기 때문이란다.. 음.. 맞는것같기도하고 아직은 잘 와닿지 않긴한다.
'''

'''
# 내가 해본 코드 - 1차시도 실패
total = 0
def deposit(money):
    global total
    total +=money

def check():
    print("현재 잔액은 %d원 입니다."%total)

deposit(8000)
# print(check) # 이 부분이 문제였다. 이미 함수안에 print를 넣어놨는데 또 그걸 print 하려고 하다니
check() # 이게 올바른 사용 법이다. 왜냐하면 이렇게 정의되었기 때문이다.
'''
'''
# 해설코드
class Account:
    def __init__(self,balance): # 해설 안봤으면 self 뒤에 balance가 추가로 나왔을지도 몰랐을 것이다.
        self.balance = balance # 그나저나 이 함수는 왜 정의된거고 기능이 뭘까?
    def deposit(self, money):
        self.balance += money
    def inquire(self):
        print("잔액은 %d원 입니다."%self.balance)
# 여기까지는 class라고 뭔가 정의함수 상위개념 묶음 번들을 만드는 느낌이다.

sinhan = Account(8000) # 클래스를 최 상위 줄에서 호출해주고 사용할때는 클래스.정의함수 식으로 써주는거구나.
# sinhan = deposit(1000) # 이걸 .으로 이어붙이는게 아니라 =으로 했더니 정의되지 않은 함수로 에러가 뜨더라.
sinhan.deposit(1000)
sinhan.inquire()

nonghyup = Account(1200000) # 그러고보니깐 매인 클래스의 옆에는 ()가 없는데 미리 들어가 있네;
nonghyup.inquire()

# 신한, 농협 모두다 Account 라고 클래스를 불러왔고 ()안에다가 숫자를 집어넣었다. 이거는 바로 아래에 있는 __init__으로 정의되어있는
# 함수의 balance로 꽃히게 된다.
# 쉽게 Account 클래스의 구조는
# balance에 들어가는 혹은 들어가있는 돈
# 추가로 집어넣을돈
# 위의 둘이 하나의 계좌 잔액에 담기게 되고 그 잔액을 출력
'''

'''
# 내가 시도해본 함수 - 틀림 - 5개의 실패 빼곤 다 맞았음
class Account:
    def __init__(self,balance): # 이제보니 발란스가 일종의 total 역할을 위해서 존재하는 것 같다.
        self.balance = balance #틀림 1. self 나는 self가 돈이 되어 더해주는줄 알았는데 아니였다. # 틀림 5. +=balance
    # def deposit(self,balance): #틀림 2. 위에서 쓰인 기본 정의 외의 것은 중복되는 걸 쓰면 안된다.
    def deposit(self,money):
        self.balance += money
    def check(self): # 틀림3. 이 비어있는 공간에 .self가 들어가야 하더라
        print("잔액이 %d원 입니다."%self.balance) #틀림 4. 맨 뒤의 정의함수를 self와 연결해줘야하더라

sinhan = Account(9000)
sinhan.deposit(1000)
sinhan.check()

nonghyeup = Account(9000)
nonghyeup.deposit(1000)
nonghyeup.check()

# 전체적으로 왜 굳이 self를 써줘야하는지. 특히 첫번째 정의함수인 __init__에서는 가장 어이가 없었던것이
# self.balance = balance 이다. 왜? 굳이? a=a야? 그러면 self.balance의 뜻과 의미는 뭔데?
'''

'''
조금씩 클래스 사용 이유에 대해서 나온다.

class 이름:
    def __init__(self,초기값):
        멤버 초기화 # 엥? 왠 멤버며 왜 초기화를 하나?
    메서드 정의

'''
'''
# 이번 예시는 오랫만에 아주 좋은 예시같다.
# 구조 원리를 이해하는데 매우 좋은 예시같다.
# 더불어서 앞선 설명도!

class Human:
    def __init__(self,age, name): # 아 꼭 self 다음에 초기값으로해서 1개만 들어갈 필요는 없는거구나.
        self.age = age # 음... 굳이 아까부터 왜자꾸 이렇게 쓰일까? =를 기준으로 앞은 의무적으로 붙여줘야하지만 초기값이라서 못쓰기 때문에
                        # 대체해주는 걸까?
        self.name = name
    def intro(self):
        print(str(self.age)+ "살"+self.name+"입니다.")

kim = Human(29,"김상형")
kim.intro()
lee=Human(45,"이승우")
lee.intro()
'''

'''
# 내가 풀어본 코드
class Human:
    def __init__(self,age,name): # 이게 의무적으로 클래스 함수에선 가장 먼저 쓰여야 하는 건지 의문이다.
        self.age=age
        self.name =name

    def check(self):
        print(str(self.age)+"살"+self.name+"입니다.")

bob = Human(29,"김창영")
# Human.check() # 틀림1. bob을 클래스로 대체해서 사용하기로 해놓고 클래스 변환전의 클래스를 사용했다.
bob.check()

won = Human(42,"원호")
# Human.check()# 틀림1. bob을 클래스로 대체해서 사용하기로 해놓고 클래스 변환전의 클래스를 사용했다.
won.check()
'''

'''
# 상속

class 이름(부모):
    ....
'''

'''
# 이건 부모개념인 클래스를 자식개념인 클래스에게 물려준다는 개념같은데
# 난해하다;

class human:
    def __init__(self,age,name):
        self.age = age
        self.name = name

    def intro(self):
        print(str(self.age)+"살"+self.name+"입니다.")
# 여기까진 어려운게 없다.
# 여기서 부터가 훅 난해해진다.
class Student(human):
    def __init__(self,age,name,stunum): # 부모클래스에 age, name이 있기 때문에 하단부에는 stunum만 써준건가?
        super().__init__(age,name) # 앞의 super는 왜붙이는 것인가.
        self.stunum = stunum

    def intro(self):
        super().intro() # 추측하기로는 super.이것이 뭔가 자식임을 자청하는 클래스 안에서 구동되는것같다.
                        # 추측이 맞았다. 부모의 클래스를 끌고오는게 super라고 한다.
        print("학번 : "+str(self.stunum))

    def study(self):
        print("하늘천 따지 검을현 누룰황") #근데 여긴 왜 뭐 super.intro()이런게 안쓰였냐
                                    # super는 쓰고싶을때만, 이거는그냥 저 프린트문 쉽게 출력하기 위한 함수
        

kim = human(29,"김상형")
kim.intro()
lee = Student(34,"이승우",930011)
lee.intro()
lee.study()

# 진즉에 이렇게 설명을 좀 해주지 이제 좀 복잡해도 이해가 간다.
'''

'''
# 내가 시도해본 풀이 - 첫번째

class parents:
    def __init__(self,age,name):
        self.age = age
        self.name = name

    def intro(self):
        print(str(self.age)+"살"+self.name+"입니다.")

# 오류 테스트용 수식
# first = parents(29,"김형곤")
# first.intro()

# class children: # 틀림3 부모 클래스를 옆에 가져오는 것을 누락했다.
class children(parents):
    def __init__(self,age,name,sum):
        super().__init__(age,name) # 틀림3. 이것도 super옆에 ()를 누락했었다.
        self.sum = sum
    def introduce(self):
        super().intro() # 틀림2.# 이게 좀 난해하다. 왜 이렇게 쓰였는지 노이해다.
        print("학번 : " +str(self.sum)) # 틀림6. 여기에 sum이 아니라 num이라고 넣었다.

    def just(self): # 틀림 1. (self)를 안넣어 줬었다.
        print("하늘천따지")

first = parents(29,"김형곤")
first.intro()
second = children(34,"이승우",930011)
second.introduce() # 틀림 4. 자식 클래스를 정의는 해줬는데 여기서 자식.정의함수 이렇게 안써줬다.
second.just() # 틀림 5. 자식 클래스를 정의는 해줬는데 여기서 자식.정의함수 이렇게 안써줬다.
'''

'''
# 난해했지만 그래도 이젠 좀 이해가 되었다. 다시 시도
# 두번째 시도

class parents:
    def __init__(self,age,name):
        self.age = age
        self.name=name

    def intro(self):
        print(str(self.age)+"살"+self.name+"입니다.")


class children(parents):
    def __init__(self,age,name,num):
        super().__init__(age,name)
        self.num = num
    def intro2(self):
        print("저의 학번은"+str(self.num)+"입니다.") # 유일하게 틀린게 이게 문자 + 정수 + 문자여서
                                                # 문자 + 문자 + 문자로 전환해줬다.
    def just(self):
        print("푸른하늘 으은하수")


p = parents(90,"장춘삼")
p.intro()
c = children(80,"박덕팔",900046)
c.intro2()
c.just()
'''

# 엑세서
'''
kim.Human(29."김상형")
kim.name= "정우성"
kim.age=46
'''

'''
# 해설코드
class Date:
    def __init__(self,month):
        self.month = month
    def getmonth(self): # read용 메서드
        return self.month
    def setmonth(self,month): # change용 메서드
        if 1<=month <=12:
            self.month=month
today = Date(8)
today.setmonth(15)
print(today.getmonth())

'''

'''
class Date:
    def __init__(self,month):
        self.inner_month=month # 틀림1. 이건또 뭐냐 ㅡㅡ inner라니..
    def getmonth(self): # 왜 어떤건 self옆에 month 초기화값을 넣고 어떤건 안넣냐..
        return self.inner_month
    def setmonth(self,month):
        # if 1<= month =<12: # 틀림2.=<과 <=가 틀린거구나..
        if 1<= month <=12:
            self.inner_month = month

    month = property(getmonth, setmonth)


today = Date(8)
today.month = 15
print(today.month)
'''

'''
class Date:
    def __init__(self,month):
        self.inner_month = month
    @property # 당췌 이해가 안간다 이건
    def month(self):
        return self.inner_month
    @month.setter # 당췌 이해가 안간다 이것도 # 뜻은 이해가는데 정확한 기능운영을 모르겟다.
    def month(self,month):
        if 1<=month<=12:
            self.inner_month = month

today = Date(8)
today.month =15
print(today.month)
'''

'''
# 여기서부터 더욱 난해해졌다

class Date:
    def __init__(self,month):
        self.month = month
    def getmonth(self):
        return self.__month # 이건또 왜이렇게 반쪽짜리같이 쓰였을까?
    def setmonth(self,month):
        if 1<= month <=12:
            self.__month = month # 여기도 왜 굳이?
    month = property(getmonth, setmonth) # 여기는 getmonth와 setmonth를 표현해줄때 ()를 왜 안써줬을까?

today = Date(8)
today.__month=15
print(today.month)

# 여기는 지나치게 복잡한데다가 설명이 충분히 되지 않았다.
# 설명을 해주긴 했는데 음.. 크게 와닿진 않았다.
'''


'''

이번챕터의 설명은 매우 만족스러웠다.
딱 필요한 정도의 만큼만 충분히 설명해주셨고
예제도 해당 기능을 딱 숙지할 수 있을 정도의 심플한 예제였고

여태까지 불만이 있다면
1. 약 11~14장 정도에서 점점 성의 없어지고 기능을 파악하는것과는 약간 아다리가 안맞는예제
2. sys.argv 와 14장 데이터베이스 설명 및 샘플의 부재
이정도인것같다
물론 여전히 sys보다도 데이터베이스 설명 및 샘플이 없었던게 너무 아쉽지만
그나마 현재까지 시중에 나온것중에서는 실력쌓는데에 도움이 되는것같다. 
'''
300x250