개발과 계발/코딩학당

2022-11-23 코딩학당 2

멈 무 2022. 11. 24. 00:29

오늘배운 거슨 파이썬 오브젝트 !

컵 안에 물을 채워넣거나 빼는 것을 표현하는 것,

삼각형, 사각형 도형을 그리는 걸 만들어보면서

객체.함수.메소드의 정의와 상속의 개념에 대해서 배웠다

 

객체, 함수, 메소드 설명해주실때 사실 잠깐 멍때려서ㅋㅋ..

검색을 해봤눈데

 

https://coding-kindergarten.tistory.com/56

 

[파이썬 중급 문법] 클래스(class) 총정리 1편_객체,속성,메소드,인스턴스

안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다. 코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록

coding-kindergarten.tistory.com

 

2) 속성과 메소드

앞서 클래스를 빵 만드는 기계(함수)와 입력과 출력(변수)의 정보를 담은 설계도라고 설명했습니다.
지금 배울 속성(attribute)과 메소드(method)는 각각 설계도에 표시되어 있는 변수와 함수라고 이해하시면 됩니다.

클래스의 변수 = 속성 (attribute)
클래스의 함수 = 메소드 (method)

이라고 나와있구

함수와 메소드가 좀 다른점이 있다구 그래서 찾아봤눈데

https://velog.io/@yejin20/Python-%ED%95%A8%EC%88%98%EC%99%80-%EB%A9%94%EC%86%8C%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90

 

[Python] 함수와 메소드의 차이점

파이썬을 공부하는 내내 함수와 메소드라는 단어를 자주 들었다. 그런데 막상 배운 것들을 블로그에 글로 정리할 때마다 이 단어를 함수라고 말해야할지, 메소드라고 말해야할지 몇 번 고민했

velog.io

 

결론은 print() 와 같이 그냥 실행할수있는? 함수가 있고

클래스 내에서 실행되는 것이 메소드...

메소드를 사용하려면 클래스 정의가 꼭 선행되어야 한다 !

 

 

<컵안에 물이 들어있고, 물을 일정량만큼 뺀다(마신다)>

여기에서 생각해야하는 것은

1. 컵의 용량

2. 물이 담긴 양

 

 class Cup:

     def __init__(self, volume):
         self.volume = volume

     def drink(self, vol):
         self.volume -= vol
         print('drink', vol, 'remain', self.volume)


 c = Cup(10)
 c.drink(3)
 c.drink(3)
 c.drink(3)
 c.drink(3)
 c.drink(3)

 c2 = Cup(1)
 c2.drink(1)
 c2.drink(1)

Cup이라는 클래스 안에서

__init__ 으로 컵의 용량을 정의해주고

drink 라는 이름의 함수를 정의했다. 

drink를 하면 현재 용량에서 넣는 값만큼 - 되고, 현재 남은 양을 출력되도록 했다

 

여기까지만 하면 계속 빠지기 때문에

실제 물이 담긴거라면 음수값이 없겠지만, 지금은 정의해준게 없어서 음수로 계속 빠졌음

 

그래서 다음에 한게

 

<컵에 물을 넣어서 컵의 용량이 꽉차면 "더이상 부을 수 없습니다" 출력하기>

(물이 없는걸로 시작할수도있고, 조금 있는상태로 시작할 수도 있음)

 class Cup:
     def __init__(self, volume, amount=0):
         self.volume = volume
         self.amount = amount
    
     def pour(self, amt):
         remain = self.volume - self.amount
         if amt <= remain:    
             self.amount += amt
             print('pour', amt, 'remain', self.amount)
         else:
             print("더이상 부을 수 없습니다")


 c1 = Cup(10)

 c1.pour(5)
 c1.pour(5)
 c1.pour(5)

 c2 = Cup(5, 2)
 c2.pour(2)
 c2.pour(2)

똑같이 Cup 클래스를 정의해준 다음

이번에는 현재 양을 나타내는게 필요해서 amount를 추가로 정의해줬다

그리고 pour 에 if/else 조건문으로

안넘쳤을때는 현재양을, 넘쳤을때는 문구를 출력하는 것을 넣었음

 

여기에는 pour라는 행위를 하기 전에

현재 양을 확인해서 pour 할 수 있는 지 없는지를 판단해야하기 때문에

remain을 새로 정의해주었음!

 

 

그다음 한거시

<컵에 물을 계속 부을 수 있는데, 현재 차있는 용량과 넘치면 "흘러넘침"이 출력하기> 

 class Cup:
     def __init__(self, volume, amount):
         self.volume = volume
         self.amount = amount

     def pour(self, amt):
         remain = self.volume - self.amount
         if remain <= amt:
             self.amount += remain
             print("차있는용량",self.amount,"흘러넘침", amt-remain)
         else:
             self.amount += amt

 c1 = Cup(10, 5)
 c1.pour(3)
 c1.pour(3)
 c1.pour(3)

이거는 다른분이 해서 완전히 이해된거는 아니지만

음 일단 remain 정의는 같게 해주고

remain이 amt와 작거나 같을때는 self.amount와  remain을 합하고 그 값을 self.amount에 할당했다(연산자 사용)

그리고 차있는 용량과 흘러넘친 용량을 출력하도록 함

 

그리고 else부분은 remain이 클때, 즉 컵에 물을 넣을 수 있는 용량이 넣는양보다 클때

self.amount에 넣는 양(amt)을 ㅎ바하고 그 값에 self.amount에 할당했다...

그리고 별도로 출력하라는 명령이 없어서 뭐가 안나오긴했음..

 

라고 이해했는데 사실 잘 이해한건지 머르겟다 ㅠ

글구 연산자 모르는거 쓰셔가지구 9ㅅ9 검색햇움

https://corytips.tistory.com/162

 

파이썬 - 할당연산자 (=, +=, -=, *=, /=, %=, **=, //=)

파이썬에서 기본으로 사용되는 할당연사자(Assignment Operators)는 등호(=)이다. 등호는 등호 오른쪽의 값을 왼쪽으로 할당한다. 파이썬에는 등호를 응용한 다양한 할당연사자가 존재한다. 그 종류는

corytips.tistory.com

 

 

글고 다음에 한거는 속성에 관한 거신데

 

<삼각형, 사각형 등 도형을 그린다>

여기서 고려해야할 거슨

1. 좌표 (도형이 그려질 위치)

2. 변의 길이

3. 변의 개수

class Figure:
    def __init__(self, coord, length, count):
        self.crd = coord
        self.lgth = length
        self.cnt = count

    def draw(self):
        x = self.crd[0]
        y = self.crd[1]
        msg = f'{x}, {y}좌표에 {self.cnt}개의 변을 {self.lgth}길이로 그려라'
        print(msg)
            
        #  self.x, self.y = coord

f = Figure((3,5), 10, 3)
f.draw()


class Rect(Figure):
    def __init__(self, coord, length):
        super().__init__(coord, length, 4)

class Tri(Figure):
    def __init__(self, coord, length):
        super().__init__(coord, length, 3)
    def draw(self):
        x = self.crd[0]
        y = self.crd[1]
        msg = f'{x}, {y}좌표에 {self.cnt} 개의 변을 {self.lgth} 길이로 그려주세요'
        print(msg)
        
r = Rect((10, 3), 5)
r.draw()

t = Tri((1, 4), 15)
t.draw()

먼저 Figure라는 클래스에서

도형을 그릴때 생각해야하는 3가지 개념을 정의해주고

draw함수로 그리는 것을 구현했음

 

ㅠㅠ 이거 내가... 했눈데 ㅠ 좌표를 표현한다는 게

좌표 자체가 2개의 변수인데

그걸 어떻게 표현하지????라는 생각을 했다

애초에 파이썬이 좌표라는 개념이 있는지 모르겠고 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

있으면(x, y) 로 그냥 표현해주면 되겟지만

그 좌표라는 개념을 컴터에게 어케알려주죠 선생님....? <--- 이생각으로 암것도 못했음 ㅋㅋㅋㅋㅋㅋ

 

내가 헤메니까 알려주신게

 coord = (1, 2)
 print(coord)
 print(coord[0])
 print(coord[1])

 x, y = 10, 20
 print(x)
 print(y)


 count = 10
 a = f'count is {count}'
 print(a)
 b = 'count is {} {}'.format(11, 'name')
 print(b)
 class Rect():
     pass

 class Tri():
     pass

요부분인데... 

coord = (1, 2) 라고 데이터 값을 주고 출력을 하면 나오고

리스트형이기 때문에

print(coord[0]) 하면 첫번째 데이터가 출력

print(coord[1]) 하면 두번째 데이터가 출력

 

그리고 count = 10 정의 후

a = f'count is {count}'  정의하고

a를 출력하면 count is 10 이 출력됨.

 

똑같이

b=f'count is {} {}'.format(11, 'name') 이렇게하믄... {} 위치에 순서대로 11, 'name'이 출력됐음

여기에서돜ㅋㅋㅋㅋ format이라는게 갑툭튀해서

잘 이해를 못햇눈데(바로 넣어주는거라고 설명을 해주셨지만..)

와서 검색해보고 이해해따..

https://blockdmask.tistory.com/424

 

[python] 파이썬 format 함수 (문자열 포매팅 방법 1)

안녕하세요. BlockDMask 입니다. 파이썬에서 문자열 포매팅 방법은 %와 서식기호를 이용한 방법, format 함수를 이용한 방법, f-string을 이용한 방법 이렇게 세가지가 있다고 볼 수 있습니다. 오늘은 파

blockdmask.tistory.com

여기에서

a = f'count is {count}' 

저 빨강색 f는 어디서 갑툭튀한거야... 했는데

def 처럼 그냥 있는 함수????

그냥 어휘력 같은거라서 계속 하면서 아는수밖에 없다고했음 ㅠ 

기본적으로 되는 함수와 그렇지 않은것(내가 정의해줘야하는것)

 

그래서 다시 돌아오면

    def draw(self):
        x = self.crd[0]
        y = self.crd[1]
        msg = f'{x}, {y}좌표에 {self.cnt}개의 변을 {self.lgth}길이로 그려라'
        print(msg)
            
        #  self.x, self.y = coord

draw 에서

x는 crd의 첫번째 변수이다

y는 crd의 두번째 변수이다

라는것을 정의해줬고

msg 라는 이름으로 " (x값), (y값) 좌표에 (변의개수)개의 변을 (변의길이)길이로 그려라" 라는 메세지가 나오는걸 정의하고

msg를 프린트했음

 

아래 주석은 self.x, self.y = coord로 정의하는 방법이 잇따고 첨에 설명해주신건데 내가 이해못햇슴 ㅎ

지금보니 알것도 같네......ㅇㅏ닝가 ㅎ

 

무튼 이걸로 Figure클래스 정의는 끝났고

그뒤에

사각형 Rect 클래스에 Figure클래스를 상속,

삼각형 Tri 클래스에 Figure 클래스를 상속시키는것을 했다

class Rect(Figure):
    def __init__(self, coord, length):
        super().__init__(coord, length, 4)

class Tri(Figure):
    def __init__(self, coord, length):
        super().__init__(coord, length, 3)
    def draw(self):
        x = self.crd[0]
        y = self.crd[1]
        msg = f'{x}, {y}좌표에 {self.cnt} 개의 변을 {self.lgth} 길이로 그려주세요'
        print(msg)

삼각형과 사각형은 '변의 개수'가 고정인 것이므로 숫자 각각 3, 4로 고정함

 

근데 여기서 만약에 실행시킬때

Figure에는 3개의 값을 필요로 할테고,

Rect와 Tri는 2개의 값을 필요로 하는데

 

f = Figure((3,5), 10, 3) 요런식으로

'변의개수' 값을 그냥 넣고 출력하면 삼각형 사각형이 의미가 없어짐!

 

그래서 한거시

super().__init__(coord, length, 4)

요거인데

super()는 상속해주는? 곳을 의미하고

뜻을 풀면

super(여기에선 Figure)의 __init__을 (coord, length, 4)로 다시 써준것과 같음!

 

글고

사각형에서는 "~ 그려라"라고 출력을

삼각형에서는 "~ 그려주세요"라고 출력을 하기위해서

Tri 클래스에서는 draw의 x y msg를 다시 써주고 문구를 바꿔줬음!

 

여기에서는 일부만 쏙 바꾸는게 안되서(통으로 묶여있어서?)

똑같이 다시 써준거시다.

 

이걸 뭐라고했는데....리액팅? 리....라이팅?ㅋㅋ 리라이팅이 맞겟지..? 머르게다

 

 

요기까지했눈데

내가 오늘은 좀 정신이 산만했는지,,,

지난주는 막 머리에 쏙쏙 들어오는 느낌이었는데

오늘은 ㅋㅋㅋ ㅠㅠ 그런느낌은 없었다

 

그래두 이러케 돌아보니까 좀 이해되는거같음 !

오늘 쓴거처럼 했던거 흐름대로 적는게 기억하기 좋은거같다

 

 

알아보기

- 비쥬얼스튜디오 레이아웃 / 터미널, 파이썬대화형창, 출력창  각각 역할과 사용법

- 주석처리,해제 단축키가 검색해보면  ctrl+K+U 아니면 ctrl+/ 로 나오는데 둘다 안먹힘 ㅡㅡ 왜때문에... ㅠㅠ

- 파이썬 파일과 파이썬 소스파일은 모가다른가요 선샘미...

 

 

오늘의 인증샷,,,, 지난주에 모임장님이 안주셔섴ㅋㅋ 이번엔 내가 찌것다!