✏️ 2022-11-30 Today I Learn

@mitoconcrete · November 30, 2022 · 11 min read

[TodayKeywords] 오늘 공부한 키워드

  • WORA : Write Once Run Anywhere
  • Dynamic Class Loading : 컴파일 시점이 아닌 런타임시점에 클래스를 로딩하는 것.
  • JVM

    • Class loader System : 아직 메소드 영역에 로드되지 않은 .class 파일을 Method Area 에 load시키기 위한 시스템.
    • Loading : JVM 메소드 영역에 로드

      • BootStrap ClassLoader : 모든 ClassLoader의 부모이며, 하위 2개의 ClassLoader에서 탑재되지 않은 Class들을 로딩한다.
      • Extension ClassLoader : jre/lib 내에 위치한 클래스들을 로딩한다.
      • Application ClassLoader : 개발자가 작성한 코드에서 사용된 클래스를 로딩한다.
    • Linking : 주소 연결

      • Verification : .class 파일의 유효성을 검증한다.
      • Preparation : 클래스 내의 메서드와 멤버변수들을 각 타입의 초기값으로 초기화 한다. 아직, 올리진 않는다.
      • Resolution : Symbolic reference 를 direct referect로 변경하여 실제 참조주소의 클래스를 사용할 수 있도록 한다.
      • Symbolic reference : 클래스의 참조주소를 실제 메모리주소가 아니라, 어떤 심볼텍스트로 정의한것.
      • direct reference : 클래스를 메소드 영역에 올리고, 해당 실제주소를 할당하는 것.
    • Initialization : 클래스에 개발자가 static의 초기값으로 정의한 값들이 실제로 초기화 되는 영역. 이 영역이 끝나면, 클래스는 초기화할 준비를 마침. 이 영역에서 static초기화 블럭이 실행됨.
    • RunTime Data Area : 검증을 마친 .class파일이 실제 메모리에 올라가 구동되는 영역.
    • 공유 영역 : Runtime Data Area 내의 모든 스레드에서 접근이 가능한 영역

      • Method Area : 클래스들의 정보가 저장되는 곳. runtime constant pool(런타임 상수 풀), file data(필드 데이터), method data(메서드 데이터), constructor(생성자) 가 저장됨.
      • Constant Pool : 실제 메모리주소를 찾을 때 사용하는 테이블. 초기에는 symbolic reference들이 대부분이지만, 코드가 진행되면서 Linking을 통해 대부분 direct reference로 변경됨.
      • Byte-code : 개발자가 작성한 코드의 진행을 어셈블리 언어로 표현해 둔 것. 명령어와 Constant pool 주소로 구성된다.
      • Heap
      • new 키워드를 통해 인스턴스화 된 객체가 들어가는 공간, static을 제외한 나머지 멤버변수, 메서드들이 사용되는 상태가 된다.
      • GC가 이곳에서 동작하면서, 불필요한 인스턴스를 제거하면서 메모리를 관리한다.
    • 분리 영역

      • Stack : 메소드가 차례대로 실행될 수 있게 만들어줌.
      • Stack frame : 메소드 단위로 생성되는 레이어

        • Operand stack : Contant pool 에서 정의한 명령어에 따라 실행되는 명령어들이 쌓이는 곳. 들어갔다 나올때 실행된다.
        • Constant pool reference : Contant pool 에서 정의한 명령어
        • Local variable Array : 지역변수로 선언한 것들이 배열형태로 저장됨. 0번째는 무조건 this나 super.
        • PC register : 스레드 별로 어떤 동작을 했는지 순서를 저장하는 공간
        • Native method stack : C, C++로 작성된 메서드가 저장되는 공간.
    • Execution area : .class를 실제로 실행하는 영역

      • Interpreter : 바이트 코드를 런타임시 한줄한줄 곧바로 바이너리 코드로 번역하여, OS에게 명령을 내림
      • JIT Compiler : 바이트 코드를 분석하여, 중복되는 영역을 미리 바이너리 코드로 번역해놓고 캐싱하여 재사용 시 소모되는 리소스를 줄이기 위해 사용하는 컴파일러이다.
      • Garbage Collector : Heap 영역에 메모리가 찰 경우, 자동으로 비워주어 메모리 영역을 관리해주는 기능을 한다. 최근에는 Constanct pool 에도 GC가 적용된다고 한다.
    • JNI(Java Native Interface)
    • C, C++, 어셈블리로 작성된 함수를 사용할 수 있는 방법 제공.
    • 자바에서 기본으로 제공되는 메서드에 native 키워드를 가 붙은 친구.
    • 네이티브 메소드 라이브러리.
    • C, C++로 작성된 라이브러리.
  • psvm : Public static void main(String args[]) : String args[] 를 인자로 받는 main 메서드 만을 Entry point로 삼을 수 있음.

[NextKeywords] 공부할 키워드

  • NPL
  • HTTPS
  • SOLID
  • Optional
  • loop label
  • call by referrence
  • call by value
  • CSV
  • 파일입출력
  • UML
  • 다이나믹 디스패치
  • UTC
  • epoch time / Instant time
  • MVC
  • URL ClassLoader
  • Secure ClassLoader
  • JNI

[회고] 221130 : 새로운 것을 받아들이는 걸 거부하지 않기.(키워드 학습의 시작)

오늘은 JVM에 대해 학습했다. 역시나 메모리로 들어가니, 어질어질하고 배워야할 것들이 쏟아졌다. 또한, 배우는 개념들은 결국 컴퓨터 구조와 연관된 것이기 때문에, 공부를 하다보면 파고들게 되었다. 하나하나의 과정을 이해하는 과정이 오래걸리고 힘겹다보니, 다음 개념으로 진행할 때 부담감이 엄청났다. 또한, 다음개념으로 넘어가도 되는것인지에 대한 확실함이 부족하고, 내가 정말로 이 개념을 이해하고 있는지에 대한 확신도 없었기에 계속 같은 개념을 파다보니, 다음 개념으로 넘어가는데 굉장히 많은 시간이 소요되었다.

나는 그동안 내가 좋아하는 것, 재미있는 것만 하고 살아왔기 때문에 한 개념을 진득하게 파고 들어가는 것이 즐겁지가 않았다. 그래서 지금처럼 개발언어를 다뤄보면 잘하는데, 각 언어의 동작원리라던지, 딥한 기술질문이라던지에 대한 질문이 들어오면 확실하게 답변하지 못했다. 나의 기술면접 패착요인이 이것이라고 판단하고 있어 가장 경계해야하는 태도임을 인지하고 있음에도 불구하고, 지속적으로 몸과 마음이 거부하는 것을 느끼고 너무 힘들었다.

하지만, 생각을 다시 해보았다. 나는 지식노동자인데, 남들이 다 아는것을 모르는 건 정말 무책임한 일이라는 것을 깨달았다. 그것도 재미있는것만 골라서 하는 지식노동자를 고용자와 동료들 입장에서 얼마나 신뢰할까 걱정했다. 내가 개발의 모든 영역을 좋아하는게 아니란 것을 깨달았기 때문에, 오히려 좋아하지 않는 것을 좋아하게 만들면 나의 단점이 커버되지 않을까 생각되었다.

나의 특성을 잠깐 돌아봤을 때, 진득하게 하나에 몰입하는 것을 잘하지 못한다. 단, 여러가지 주제를 번갈아보고, 그것을 기억하는 것을 잘한다. 언어의 핵심을 공부하긴 꺼려하지만, 그때 그때 필요한 것들을 잘 찾아서 흐름을 빠르게 파악하여 핵심을 잘 이해한다.

그렇다면, 얉고 넓게 같은 개념들을 지속반복해서 학습하다보면 어느순간 많은 것들을 한번에 높은레벨까지 끌어올릴 수 있지 않을까? 싶었다. 그래서 오늘부터 시도해보려고 하는 방법이 키워드 학습이다. 지금 현재 우리반을 맡고계신 튜터님도 키워드를 잡으라고 말씀하시는데, 난 그 키워드들을 볼때마다 설레는 마음이 생긴다. 하지만, 하나를 잡고 파고들기 시작하면 지친다..

따라서, 적절히 깊이를 잘 설정하여, 키워드만을 기억하되 한번 공부한 개념은 평생 기억 할 수 있을 정도로 꼼꼼히 학습할 예정이다. 또한, 그렇게 학습한 것들은 한 줄 내외로 간략하게 작성해볼 예정이다. 많은 새로운 것들을 나에게 효과적으로 받아들이게 만들고 싶은데 이게 적절한 방법인진 모르겠지만.. 한번 해보려고 한다.

@mitoconcrete
어제보다 조금 더 성장하기 위해 기록합니다.