Ssa!

파이썬 실강 4일차! 본문

언어/python

파이썬 실강 4일차!

Ssa! 2022. 9. 13. 16:23

1. 클래스에 대한 이해(개념설명)

클래스를 선언하는것은 과자 틀을 만드는 것이고, 선언된 과자틀(class)로
과자(instance)를 만든다고 생각하면 됩니다.

선언 후 바로 사용되는 함수와 다르게 클래스는 인스턴스를 생성하여 사용하게 됩니다.

class 내부에 선언되는 메소드는 기본적으로 self라는 인자를 가지고 있습니다.

self는 클래스 내에서 전역 변수와 같이 사용됩니다.

# 용어 정리
 - 인스턴스(instance) : class를 사용해 생성된 객체
 - 메소드(method) : 메소드란 클래스 내에 선언된 함수이며, 클래스 함수라고도 한다.
 - self : 메소드를 선언할 때에는 항상 첫번째 인자로 self를 넣어줘야 한다.

클래스를 처음에 이해가 안되어서 유튜브로 쉬운 것이 없나 찾다가 좋은 강의라 생각하여 올린다. 

https://www.youtube.com/watch?v=uIcK7-YU8uA 

유튜브 예제

위에 정말 쉽게 설명해주셔서 이해가 쉬웠다. 위 영상에 자기소개서를 빗대어 표현해주셨는데 코딩으로 각각의 이름과 나이를 변수를 하나하나씩 지정해줘야 하지만 클래스를 사용하면 매우 쉽게 사용할 수 있다. 즉 클래스를 자기소개서 형식(?)이라고 표현하면 편하다.  또한 상속이라는 개념도 처음들었는데 여기서 기존 클래스의 목록을 놔두고 새로운 것들을 추가하기 위해서 상속이라는 개념을 쓴다고 들었다.  아래는 강의 내용의 코드이다!

class Jss:
    def __init__(self):
        self.name = input("이름: ")
        self.age = input("나이: ")
    def show(self):
        print(f"나의 이름은 {self.name}, 나이는{self.age}입니다")
class Jss2(Jss): #상속할 때 불러올 class명을 적는다
    def __init__(self):
        super().__init__() #상속할 때 supper로 이전 __init__을 불러온다
        self.gender = input("성별: ")
    def show(self):
        print(f"나의 이름은 {self.name}, 성별은 {self.gender}자, 나이는{self.age}입니다")
a = Jss2()
a.show()

튜터님 클래스 예제

튜터님께서도 쉽게 설명해주셨는데 밑의 예제로 설명해주셨다.  위의 유튜브에서 알려줬던 개념과 유사하다. 자기소개서를 프로필이라는 적당한 비유를 들어서 설명해주셨다. 내가 생각하기에 셀프 프로필에 input값을 넣어서 스스로 작성하면 저장이 되도록 하면 매우 편리할 것 같다. 이것을 활용하여 웹 프로필 페이지를 제작할 때 개개인의 프로필의 데이터를 저장하고 나타낼 수 있는 것일까? 나중에 장고를 활용하면서 제대로 알게 되었으면 좋겠다. class라는 개념을 어느정도는 이해했지만 튜터님께서도 왜 사용하는지를 아는데 몇개월씩이나 걸리셨다고 했다. 나 또한 프로젝트 동안에 적용을 시키면서 함수와 클래스의 차이를 명확하게 알고 활용도를 높이고 싶다. 

class Profile: # 1
    def __init__(self): # 3
        self.profile = { 
            "name":"-",
            "gender":"-",
            "birthday":"-",
            "age":"-",
            "phone":"-",
            "email":"-"
        }
    def set_profile(self, profile): # 5
        self.profile = profile # 6
        
profile1 = Profile() # 2
profile1.set_profile({ # 4
            "name":"진",
            "gender":"남자",
            "birthday":"11월2일",
            "age":"30",
            "phone":"010-1234-5678",
            "email":"jin1234@naver.com"
        })
print(profile1.profile)

또한 튜터님의 클래스 강의를 듣던 중 다른 분의 질문을 하셨는데 오버로딩? 오버라이딩?? 뭔 스타크래프트에 오버로드인가 ㅋㅋ 생각했는데 찾아보니 상속과 관련된 개념이였다.  정확하게 이해를 못했지만 어느정도 대략적인 틀은 잡힌 것 같다. 처음 강의를 들었을 때 이해가 안되는 질문을 했을 때 왜 저런 질문을 하지? 라는생각을 했지만 요즘 생각의 전환이 바뀌어 그 개념이 무엇일까???하며 직접 찾아본다. 

https://hyeonggi.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9

 

[Python 입문] 14. 파이썬 오버라이딩과 오버로딩

 앞서 클래스에 대해 배우면서 오버라이딩(Overriding)과 오버로딩(Overloading)에 대해 나왔었다. 오버라이딩과 오버로딩은 이름에서부터 비슷한 것 같지만 사실은 완전 다른 두 가지 개념이다. 목차

hyeonggi.tistory.com

 

2. mutable 자료형과 immutalbe 자료형

immutable이라는 것은 변경불가능한 객체라고 한다. 
(일반적인 자료형, 튜플이 있다.)

내가 이해한 바로 설명하자면 immutable은 이라는 자료형은 메모리에 그 값을 따로 저장한다고 보면된다!

사각형이 메모리라고 치면 저런식으로 따로 저장이 되어 있다고 하면 된다. 

id라는 것은 해당 변수의 메모리 주소를 보여준다! 라고 생각하면 된다.

Int

a = 1                 #1
>>> id(a)
140729439544144
>>> a += 1            #2
>>> id(a)
140729439544176
cs
String

a = 'a'               #a
>>> id(a)
1985199052704
>>> a += 'b'          #ab
>>> id(a)
1985209620944
cs

Tuple

>>> a = (1,2)         #(1,2)
>>> id(a)
1985209935624
>>> a += (3,)         #(1,2,3)
>>> id(a)
1985209858448

이렇게 변환이 불가능하다는 것을 bool을 이용하여 판단할 수 있다!

int

>>> a = 1
>>> b = a             #b = 1
>>> a == b            #a = 1 , b = 1
True
>>> b += 1            #b = 2
>>> a == b            #a = 1 , b = 2
False
Colored by Color Scripter
cs
String

>>> a = 'a'
>>> b = a             #b = 'a'
>>> a == b            #a = 'a' , b = 'a'
True
>>> b += 'b'          #b = 'ab'
>>> a == b            #a = 'a' , b = 'ab'
False
Colored by Color Scripter
cs
Tuple

>>> a = (1,2)
>>> b = a             #b = (1,2)
>>> a == b            #a = (1,2) , b = (1,2)
True
>>> b += (3,)         #b = (1,2,3)
>>> a == b            #a = (1,2) , b = (1,2,3)
False

 

mutable이라는 것은 변경이 가능한 자료형이다.

(리스트와 딕셔너리)

mutable은 값이 변해도 그 할당한 변수들이 리스트와 딕셔너리를 바라보고 있기 때문에 변경이 가능하다!

아래의 메모리 주소값을 확인하면 동일하다는 것을 볼 수 있다.

List

>>> a = [1,2]         #a = [1,2]
>>> id(a)
1985209849032
>>> a.append(3)       #a = [1,2,3]
>>> id(a)
1985209849032
cs
Dict

>>> a = {1:'a'}       #a = {1:'a'}
>>> id(a)
1985209931096
>>> a[2] = 'b'        #a = {1:'a', 2:'b'}
>>> id(a)
1985209931096

또한 bool을 이용하여 판단이 가능하다

List

>>> a = [1,2]
>>> b = a             #b = [1,2]
>>> a == b            #a = [1,2] , b = [1,2]
True
>>> b.append(3)       #b = [1,2,3]
>>> a == b            #a = [1,2,3] , b = [1,2,3]
True
Colored by Color Scripter
cs
Dict

>>> a = {1:'a'}
>>> b = a             #b = {1:'a'}
>>> a == b            #a = {1:'a'} , b = {1:'a'}
True
>>> b[2] = 'b'        #b = {1:'a',2:'b'}
>>> a == b            #a = {1:'a',2:'b'} , b = {1:'a',2:'b'}
True

 

 

추가적으로 튜터님이 디버깅하는 방법(4가지)

1.디버깅 하는 법(print)

변수에 나오는 값들을 다 print를 찍어본다!

2.디버깅 하는 법(빨간색 에러)

빨간색으로 에러를 표시하고 그 전에 저장되있는 변수들을 다 볼 수 있다!

3. 디버깅 하는 법(함수)

DEBUG = True

def log(message):
    if DEBUG:
        print(f"[DEBUG] {message}")
        
log(a)

 

print를 찍는 것 처럼 True일 때 log를 보여주고 False를 일 때 log를 안보여준다.

4.디버깅 하는 법(import logging)

import logging

LOG LEVEL

DEBUG
VERBOSE
INFO
WARNING
ERO

logging이라는 모듈이 있는데 이걸로 디버깅할 수도 있다! 나중을 위해서 일단 적어놓자!

추가적으로 원본배열의 보존을 위해 배열을 복사할 필요(2가지)

from copy import deepcopy

deepcopy()

이 모듈을 사용하면 원본 배열 의 보존할 수 있다!

new_list = [::]

리스트를 이런식으로 슬라이싱하면 보존할 수 있다! 또한 [ : : -1]로 표시하면 리스트 역순으로 나타낼 수 있다. 

느낀점

이번에 클래스라는 새로운 개념이 매우 복잡하고 어려웠다. 그럼에도 불구하고 쉬는 시간과 점심시간을 활용하여 유튜브에 자료를 찾아보고 점프 투 파이썬에서 이해하기 위해 글도 읽었다. 아직도 제대로 이해 못한 부분이 많지만 클래스는 이런거다? 라는 것을 알았다. 튜터님께서 말씀하시길 이런 어려운 개념을 아직은 정확하게 이해하도록 하지말고 장고 프레임워크를 배울 때 많이 쓰게 될테니 그때 확실하게 이해하면 된다고 말씀하셨다. 또한 튜터님께 질문에 대해서도 말씀해주셨는데 튜터님에게 모르는 것을 질문할 때 전체적인 코드를 보여주고 고쳐주세요! 라고 하기 보다는 디버깅(?) 하나하나씩 print로 출력된 값들을 다 찍어보고 그럼에도 해결이 안된다고 할 때 가지고 오라고 하셨다. 오늘 생각보다 진도는 많이 안나갔지만 다른 여러가지 중요한 사항들을 알게되어 기쁘다!

 

'언어 > python' 카테고리의 다른 글

파이썬 실강 5일차!  (0) 2022.09.14
파이썬 클래스 과제  (0) 2022.09.14
파이썬 과제 숫자야구! 튜터님!  (0) 2022.09.13
파이썬 과제 숫자야구!  (0) 2022.09.07
파이썬 계산기 튜터님이 하신 것!!!  (0) 2022.09.07