ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클래스, 힙 메모리, 스택 메모리 개념, 코딩도장 34.6
    CodingPython 2022. 1. 5. 17:18

     

    https://pro-jy.tistory.com/m/38

    최초의 코딩을 한 사람

    딱 봐도 하녀를 부릴 것 같다.

    영국 귀족이니까...

     

    파이썬(python) 메모리 관리 1

    파이썬의 메모리 관리는 대부분 Python Memory Manager에 의해 수행되지만 최상의 코딩 방법과 Python Memory Manager 작동 방식에 대한 이해는 보다 효율적이고 유지 관리 가능한 코드로 이어질 수 있습니

    pro-jy.tistory.com

    https://luv-n-interest.tistory.com/1046 이 두개의 블로그를 참조하였다

     

    스택과 힙 메모리 영역, Stack Heap Memory

    운영체제를 배웠다면.. 조금이라도 알 수 있지만 시험이 끝나면 까먹는 우리에게 다시 익힐 시간이 필요하다. 다시 알아보자 ** 데이터 영역에는 전역 변수, static variable들이 저장된다. 숫자나 문

    luv-n-interest.tistory.com

    주소값.주소값 = 값

     

    왼쪽이 스택, 오른쪽 이 힙 메모리이다

    둘 다는 램 메모리에 저장된다. 

    스택이 훨씬 더 빠르다.
    이유는... 하녀가 밑에서 서랍의 편지들을 왔다갔다 하기 편하기 때문...
    마치 중력을 거스르는 놈이어서 그런것일까 힙은 힙하다.. 많은 노력이 필요하다.... 
    그래서 많은 노력이 필요하기 때문에 최대한 안건드리는 정보들을 넣어둔다....

    스택은 이미 할당 되어 있는 공간을 사용하는 것이고

    은 따로 할당해서 사용하는 공간이다.

    다만 스택은 공간이 매우 적기 때문에

    모든 응용 프로그램에서 스택을 사용할 수는 없다.

    self.mana 등이 가리키는 녀석 mana 가 값

    메모리의 위치를 찍는다--> 메모리에 있는 전자들이 있다(여기서 놀고 있음)

    이런 느낌...

    class Person:
        count = 0    # 클래스 속성
     
        def __init__(self):
            Person.count += 1    # 인스턴스가 만들어질 때
                                 # 클래스 속성 count에 1을 더함
     
        @classmethod
        def print_count(cls):
            print('{0}명 생성되었습니다.'.format(cls.count))    # cls로 클래스 속성에 접근
     
    james = Person()
    maria = Person()
     
    Person.print_count()    # 2명 생성되었습니다.

    cls 는 클래스의 속성에 접근한다.

    count 라는 속성에 두 번 접근 한 것이므로 결과는 count라는 속성의 '값'인 2가 나오게 된다

    class 기반클래스이름:
        코드
     
    class 파생클래스이름(기반클래스이름):
        코드

    언어, 파이썬은 영어이다

    따라서 오른쪽에서 왼쪽으로 읽어야한다는 개념을 깨우쳤다

    값(주어) 가 여기(위치를 가리키는 것)에 있다.

    이 문장이 여기 = 값 이렇게 되는 것이다. 

    따라서 함수도 def 어쩌구 () : 는

    왼쪽에 있으므로 '여기들'에 해당한다.

    그런데 우리는 값을 위주로 생각하기 때문에 하녀에게 값이 어디로 가면 되죠?

    저기 , 저기 옆에왼쪽, 저기옆에왼쪽의 아래 라고 설명이 구체적으로 들어가는 것 같다. 

    오른쪽부터 넓은 범위를 의미하고, 왼쪽으로 갈수록 좁은 범위를 의미한다

    그런데 왜 인자는 **kwargs 가 맨 오른쪽에 있을까

    이렇게 딕셔너리는 리스트가 아니기 때문에 순서형이 아니다. 더 범위가 넓은 형태인 것이다

    따라서 **kwargs 가 맨 오른쪽에 오게 된다.

    참고로 *args 는 가변인자로, 튜플형태가 담기게 된다.

    (값이 안 바뀜)

    튜플은  list처럼 새로운 메모리에 값을 할당하는 것이 아니라,

    복사된 변수가 원본과 같은 객체를

    '가리키고있다.' 

    따라서, list는 딕셔너리의 key값(해쉬값)으로 쓸 수 없지만, tuple은 가능하다.

    class Person:
        def __init__(self):
            print('Person __init__')
            self.hello = '안녕하세요.'
     
    class Student(Person):
        def __init__(self):
            print('Student __init__')
            super().__init__()                # super()로 기반 클래스의 __init__ 메서드 호출
            self.school = '파이썬 코딩 도장'
     
    james = Student()
    print(james.school)
    print(james.hello)

    동시에 파이썬은 굉장히 수직적인 느낌이 강하다.

    super() 라는 것도 슈퍼맨을 연상케 한다. 

    클래스 상속. 상속을 했으니 밑으로 내려간다. 밑에있는 애들이 위로 올라가려면 슈퍼맨이 되야 한다...

    이런 단어하나하나가 정치적 옳음?을 유발하게 되는 트리거가 되기도 한다.

     

    메서드 안에서 접근해야할 때 이런 @classmethod 라는 것을 쓴다. 

    메서드 안에서!!

    특히 cls를 사용하면 메서드 안에서 현재 클래스의 인스턴스를 만들 수도 있습니다.

    이 말은 스택 메모리에서 힙 메모리에 가야할 얘를 만들 수 있다는 뜻이다.

    기존 규약을 어기는 것이기 때문에 @가 필요한 듯 하다.

    그리고 생성된 인스턴스에 점(.)을 찍어서 인스턴스 변수나 메서드에 접근한다.

    .은 이동하는 화살표를 만들어주는 것 과 같다.

    static method 를 사용하면 힙에서 바깥으로 나갈 일이 없으므로

    메모리 참조 횟수가 줄어들게 된다. 이것은 2번 참조할것을 1번으로 줄이는 것이다, 메모리 사용에 있어서 장점이 있다.

     

    • classmethod도 staticmethod도 객체에서 접근이 됩니다. 유의해야합니다.
    >>> a = CustomClass()
    >>> a.add_class_method(3, 5)
    8
    >>> a.add_static_method(3, 5)
    8
    이번에는 인스턴스를 통하지 않고 클래스에서 바로 호출할 수 있는 정적 메서드@staticmethod처럼 앞에 @이 붙은 것을 데코레이터라고 하며 메서드(함수)에 추가 기능을 구현할 때 사용합니다.
    클래스에서 바로 호출하면 메모리의 높은 주소인 스택에서 접근이 쉬워진다.

    정적 메서드나 클래스 메서드는 프로그램 전체 영역에서 접근 가능한 만큼 예전 전역변수들과 비슷한 특성을 가지고 있다. 그러다 보니 남발하는 것은 권장하지 않는다.

    자바는 정적 메서드와 클래스 메서드가 동일한데 비하여 파이썬은 두개를 나눈다. 


    컴퓨터가 보는 객체 : 클래스를 이용해 만들어진 변수와 함수를 가진 메모리 공간

    * class 메소드에는 클래스 정보(cls)이 전달되므로 새로운 객체를 생성하고 반환하는 메소드(팩토리메소드)를 만드는 데 사용된다.


    def bar(a):
    a = a - 1
    return
    a
    def foo(a):
    a = a * a
    b = bar(a)
    return b
    def main():
    x = 2
    y = foo(x)
    if __name__ == "__main__":
    main()
    스택 이벤트의 시퀀스 아래에서 볼 수 있듯이 함수는 호출(스택에 푸시됨)되고 반환(스택에서 팝)되며 힙에 개체를 할당합니다.

     

     

    a = 10 

    b = a 

    a += 10

     print(b)

    위를 계산하게 되면 a라는 이름은 10이라는 값 객체를 가르키게 되고 b=a라고 할당해주었을 때 b는 a를 가르키는게 아니라(이중 할당 x) a의 값 객체를 가르킨다.
    따라서 a += 10을 해주었을 때 integer은 immutable이므로 a는 새로운 값객체 20을 만들어 가르킨다. 따라서 10을 가르키고 있는 b는 변하지 않는다. 하지만 call by reference에서는 b는 a의 주소를 참조하므로 b = 20이 된다.

     

    class - 객체를 만들어 내기 위한 틀

    class는 객체를 만들어내기 위한 약속이다.
    class는 객체의 속성(property)과 동작(method)을 정의한다.

     

Designed by Tistory.