Backend 취업준비/Java

Java 여러 쟁점 정리

aammddkkzxc 2024. 1. 30. 23:35

객체 vs 인스턴스

  • 객체 : 다른 물체와 구분되는 특성을 조합한 프로그래밍 적으로 설계의 대상을 지칭한다. 혹은 실제로 구현한 인스턴스를 모두 아우르는 포괄적인 단어 (ex 자동차)
  • 인스턴스 : 클래스(ex 자동차 설계도)를 바탕으로 new예약어와 함께 생성되어, Heap영역에 메모리를 차지하여 존재하는 것 (ex 아반떼)

Heap vs method area

method area : JVM이 클래스를 로딩할 때 생성되는 영역으로써, 모든 쓰레드에 공유되는 영역 => 변하지 않는 정보들이 위치할 시 메모리 적으로 이득이 될 것이다. 따라서 정적 필드, 메서드, 정적 메서드, 상수 등 메타 데이터가 위치한다.

  • 필드가 method area에 위치하지 않는 이유 : 생성하는 인스턴스마다 다른값을 생성자를 통해 초기화 해 줄 수 있으므로
  • 메서드가 metod area에 위치하는 이유 : 매개변수로 들어오는 인자에 따라 결과 값은 다르지만, 실제로 수행하는 내용(기능) 은 변하지 않음

문자열 리터럴 vs 문자열 객체

  • String 리터럴이 java8부터 Heap영역의 String Constant Pool에 존재하게 된 이유 => 메모리 관리를 위하여
    • method area의 크기는 한정적이고, GC의 대상에서 제외되는 경우가 많아 메모리 관리가 어려웠다.
    • 따라서 동적으로 메모리를 할당하는 Heap영역에 위치 시켜 GC가 관리하기 쉽게 하도록 하여 메모리 이득을 취하였다.
    • (JVM의 종류와 버전이 다양해서 현재 내 수준에서는 이렇게 이해하고 있는게 최선인듯 하다..)
  • String 리터럴과 new예약어로 생성된 String객체를 다르게 취급하는 이유 => 메모리 관리를 위하여
    • 같은 내용을 가진 문자열 리터럴은 동일한 메모리를 공유하게 된다
    • new 연산자로 생성된 String 객체는 각각 다른 객체가 된다
    • 따라서 꼭 필요한 경우가 아니라면 String 리터럴로 문자열을 취급하는 것이 효율적이다.

while vs for

  • while => 반복 횟수가 명확하지 않아 특정 조건일 때까지 반복문을 실행할 때 유리
  • for => 반복 횟수가 명확하고, 회수 index로 작업하는 경우가 있을 때 유리

일반적으로 간단한 상황일 때 for문을 쓰는 것이 더 가독성이 좋다