[cs] Java - JVM, final과 static

네민·2024년 11월 20일
0

우당탕탕 cs 공부

목록 보기
1/14

cs 스터디를 한지 두달정도 됐는데, 이제 시간도 여유로워졌겠다 공부한거 정리해서 올릴 예정...

VSFe/Tech-Interview <- 이 깃허브를 참고해서 공부하는 중이다!
질문들이 굉장이 좋은 듯해서 추천합니다!!

JVM

JVM → Java Virtual Machine 자바를 실행하기 위한 가상의 기계


기능

자바 컴파일러가 바꿔둔 클래스 파일을 읽어서 해당 운영체제에 맞게 실행시킬 수 있도록 도와줌

Interpreter: 바이트 코드를 한줄씩 읽는것

JIT(Just-In-Time) compiler: 이미 실행했던거를 기억하도록 해서 좀 더 빠르게 실행할수있도록 캐싱

Garbage Collector: 메모리를 자동으로 할당하고 버리고 함

자바 말고 다른 언어는 JVM 위에 올릴 수 없나요?

가능함. 자바만을 위한것이 아니라 특정 규칙에 따라 작성된 바이트 코드를 실행하는 것이기 때문이다.

그래서 Kotlin, Groovy, Jython 등.. 가능하다

  • 특정 규칙: 클래스 파일 형식. 바이트코드 명령 집합. 메모리 구조 및 데이터 타입 등…

C++, C# 같이 네이티브 코드로 컴파일 되는거는 JVM에서 바로 실행할 수 없다.

JVM 계열 언어를 일반적으로 컴파일해서 사용할 순 없나요?

사용 가능하다. 대신 바이트 코드로 컴파일돼서 클래스 파일이 생성되는게 아니라 운영체제에 맞는 네이티브 코드로 직접 컴파일이 된다.

바로 실행 가능하지만 일부 기능은 제한될 수 있음.

JVM을 사용함으로써 얻을 수 있는 장점과 단점에 대해 설명해 주세요.

장점

  • 한번 컴파일 하면 운영체제가 바껴도 그 환경에 JVM이 설치돼있다면 추가 수정 없이 실행시킬 수 있다.
  • 실행 전 클래스 파일의 무결성을 확인해서 악의적인 코드가 실행되는 것을 방지
  • JIT 컴파일러는 통해 캐싱하여 성능을 높임. 최적화 가능

단점

  • 바로 네이티브 코드로 변형시키는 것보다는 초기 실행 속도가 오래 걸린다.
  • JVM 자체가 메모리를 차지한다. JVM이 메모리에서 많은 부분을 차지하는 대규모 시스템에서는 자원 소비가 문제될 수 있음.

VM과 내부에서 실행되고 있는 프로그램은 부모 프로세스 - 자식 프로세스 관계를 갖고 있다고 봐도 무방한가요?

부모-자식 관계라기보다는 동일한 프로세스 내에서 실행된다고 봐야함. JVM이 프로세스 내에서 프로그램을 실행하는 환경을 제공하는 구조


final

final → 값의 불변하는 키워드

  • 변수에 사용될 경우: 값을 한번만 할당할 수 있으며, 변경이 불가능
  • 메소드에 사용될 경우: 오버라이딩 금지
  • 클래스에 사용될 경우: 상속 금지

→ 불변성 보장, 안정적인 코드 작성에 도움

static → 정적 변수 키워드

  • 클래스 로드시 메모리에 할당, 종료시까지 유지
  • 클래스의 인스턴스 간에 공유되는 속성이나 메소드를 정의할 때 유용

⇒ 코드의 안정성, 재사용성 높임

final 사용 이점 ?

final → 불변을 의미하니까 JIT에서 캐싱해서 성능 최적화도 가능

변하지 않으니까 안정성 있는 코드 작성 가능

의도 명확하게 표현 가능

컴파일 과정에서, final 키워드는 다르게 취급되나요?

그렇다. final은 변하지 않는다고 말하는거니까 이 부분에 대해서는 재실행하지 않도록 JIT로 캐싱한다.

static도 다르게 취급. 클래스 레벨에서 공유하는 자원을 의미하기 때문에, 메모리와 CPU 자원을 효율적으로 사용하는데 도움.


느낀점

부끄럽지만 JVM에 대해서 제대로 공부한 게 처음이었고
static, final 어렴풋이 알고만 있고 제대로 알아가려고 하지 않았던 것 같다...
부족한 지식을 얼른 쌓아가야겠다 !!!


참고자료
자바의 static과 final 키워드 깊게 이해하기

profile
기록하자

0개의 댓글