ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 토스Toss 개발자 컨퍼런스 시청 - 메모리에 남지 않는 문자열
    비전공자 공부일기/::::: 묻고 답찾기 2021. 10. 26. 23:48

    요즘 토스의 행보가 참 대단하다.
    간편송금, 금융정보 스크랩핑 서비스에 지나지 않았던 것 같다고 느낀 게 최근이었는데
    눈 깜짝할 사이에 금융그룹사로 거듭나며 여러 서비스들을 잠식해나가고 있다.

    관심을 갖고 알아보던 차, 토스에서 유투브 채널을 열고
    자신들의 문화, 개발스토리, 상품스토리를 올리고 있는 것을 보았다.

    재밌게 하나하나 보던 중에 개발 이야기는 발상과 기술 모두 알아두면 좋을 것 같아 천천히 소화시키며 보고 있다.
    그리고 영상 내용 중에 알게 되는 내용들을 기록해 두기로 한다!

    SLASH21 / 메모리에 남지 않는 문자열 / 안정원님

     

     

    * 구조체 Struct

    구조체란? 서로 다른 자료형의 데이터를 하나로 묶은 것
    cf)  배열? 서로 같은 자료형의 데이터를 하나로 묶은 것

    C의 구조체가 자바에서는 Class라는 개념으로 구현되어 있음
    둘의 차이는 변수 생성 이후 메모리 할당 여부에 따라 달라짐
    C는 변수 선언과 동시에 메모리 할당 / Java는 new 연산자로 메모리 생성

     

    * Mutating

    스위프트에서 클래스는 레퍼런스 타입이고 구조체(struct), 열거형은 값 타입이다.
    값 타입의 속성은 기본적으로 인스턴스 메서드 내에서 수정할 수 없다.
    수정하기 위해서는 mutating 키워드를 붙여야 한다.

    + 값 타입(Value Type) = 원시 타입(Primitive Type)
    - boolean, String, number, 구조체 등 언어에 내장된 기본 자료형
    - Stack에 메모리 할당

    + 참조 타입(Reference Type)
    - 값 타입이 아닌 모든 데이터 타입
    - 대표적으로 object, array, function, class 등이 있다.
    - {객체 리터럴}, [배열 리터럴], new 함수로 정의할 수 있다.
    - 힙 영역에 메모리 할당

    (참고글: https://alstn2468.github.io/Javascript/2020-05-08-ValueTypeReferenceType/)

    * Copy On Write (COW)

    작성 시 이전의 내용을 Copy한다는 뜻이다.
    자식 프로세스를 생성하면 같은 메모리 공간을 공유하게 된다.
    그런데 부모 프로세스가 데이터를 삽입, 수정, 삭제하면 같은 메모리 공간을 공유할 수 없다.
    이때 부모 프로세스는 해당 페이지를 복사한 다음 수정하는데, 이것이 COW이다.

     

    * 메모리 구조 - Stack, Heap

     

    - 데이터 영역(Static Data): 전역변수와 static 변수가 할당되는 영역 / 프로그램이 종료될 때까지 메모리상 존재
    - 스택(Stack): 지역변수와 매개변수가 저장되는 영역 / 함수호출이 완료되면 사라짐
    - 힙(Heap): 프로그램이 실행되는 동안(런타임) 메모리의 크기가 결정되는 경우 동적할당

    영상에 따르면 Swift(iOS 개발언어)에서는 String을 Stack에 할당한다고 한다.
    Swift는 잘 모르지만 문자열이 char들의 배열로 이루어진 건 같지만, 특이하게도 각 문자 뒤에 구분을 위한 null이 들어감

     

     

    * 강한 참조와 약한 참조

    + 강한 참조(Strong Reference)
    - 일반적으로 new를 통해서 객체를 생성하고 해당 객체를 참조
    - 자바의 경우 가비지 컬렉션의 대상에서 제외됨
    ex) toss = new Bank(); foo = toss;

    + 약한 참조(Weak Reference)
    - WeakReference를 이용하여 new 할당된 객체를 참조
    - GC의 수집 대상이 되므로, 나중에 수거 뒤 null값을 갖게 됨
    ex) toss = new Bank(); foo = new WeakReference(toss)

     

    댓글

coding wanee