이론 공부!/기술 면접 준비

[JAVA 개발 지식] 면접 질문 대비

TutleKing 2022. 8. 24. 21:30

컴파일 과정에 대해 설명해보라

  1. 개발자가 .java파일을 생성한다
  2. build를 한다.
  3. java compiler의 javac의 명령어를 통해 바이트코드(.class)를 생성 (Compiler)
  4. class loader를 통해 jvm내로 로드 (Interpreter)
  5. 실행 엔진을 통해 컴퓨터가 읽을수 있는 기계어로 해석되어 Runtime Data Area에 배치
    1. Runtime Data Area : JVM 메모리 영역 (Heap + Stack + PC 레지스터 등)
  • JVM 메모리 구조
    • 스레드별 : PC register , JVM Stack , Native Method Stack
      • PC 레지스터 : 현재 수행중인 JVM 명령어가 들어가 있고 다음 명령어의 주소를 가지고있다
      • JVM Stack : 호출된 메소드의 매개변수, 지역변수, 리턴 정보들이 저장됨
      • Native Method Stack : 자바 외의 언어인 C나Cpp를 수행하기 위한 영역
    • 공통 : Method Area, Heap
      • Method Area : 클래스별로 전역변수, 정적 변수, 메소드 정보들이 저장
      • Heap : 런타임중 생성되는 객체들이 동적으로 할당되는 곳
  • JVM 메모리 구조란? (JAVA)
 

JVM 메모리 구조란? (JAVA)

안녕하세요? 코딩 중독입니다. 오늘은 JVM 메모리 구조에 대해 알아보겠습니다. JVM이란? JVM 메모리 구조를 설명하기 전에 JVM이 무엇인지 알아야 합니다. JVM은 Java Virtual Machine의 약자로, 자바 가상

steady-coding.tistory.com



Compiler vs Interpreter

  • 고급 언어를 기계어로 번역하여 프로그램을 실행하는 것은 동일하다.
  • Complier
    • 고급언어를 한번에 번역을한다. → 번역 시간이 오래걸림
    • 그러나 한번만 번역을 하고 나면 실행만 하면 되기때문에 실행시간이 빠름
    • 하드웨어에 종속적
  • Interpreter
    • 고급언어를 한줄씩 번역을 한다. → 번역 시간은 빠른 편
    • 그러나 실행 파일을 생성하지 않았기 때문에 매번 번역해야함 → 실행 속도가 느림
    • 하드웨어에 종속적이지 않음


String, StringBuilder, StringBuffer의 차이

  • String
    • 객체 불변이기 때문에 변하지 않는 문자열은 String을 사용
    • java String 불변객체인 이유
      • heap에 프로그램 사용중에 선언했던 String의 객체 값이 사라지지않고 heap에서 존재하고있다.
      • 문자열이 가장 많이 사용되는 변수이기 때문에 heap을 절약하기 위해 불변성을 가지고 사용
      • 캐싱기능, 보안 기능. 스레드 안정성
  • StringBuilder
    • 비동기방식이기 때문에 single thread 환경하에서, 변화되는 문자열에 사용됨
    • 처리속도가 빠름
  • StringBuffer
    • 동기방식으로 저장되기 때문에 멀티스레드로 접근하거나 문자열이 변경될때 사용



자바의 접근 제어자와 특징

  • public
    • 어떤 클래스에서라도 접근이 가능
  • protected
    • 동일 패키지내의 클래스 또는 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근 가능
  • default
    • 동일 패키지 내에서만 접근이 가능
  • private
    • 해당 클래스에서만 접근이 가능
💡 private < default < protected < public 순으로 접근 범위 넓음 



Garbage Collector가 무엇인가?

  • GC는 JVM에서 메모리를 관리해주는 모듈이다
  • Heap 메모리를 재활용 하기 위해 더이상 참조되지 않은 객체를 메모리에서 제거
  • 개발자의 개발 속도는 향상되지만 Mark and Sweep 이라는 과정에서 참조되지 않은 객체를 찾는 과정이 있는데, 이때 스레드가 중단되는 시점이 있어 성능이 떨어지는 단점도 있다.



클래스, 객체, 인스턴스의 차이

  • Class
    • 연관되어있는 변수와 메서드의 집합
    • 객체를 만들어 내기 위한 틀
  • Object
    • 소프트웨어 세계에 구현할 대상
  • Instance
    • 구현되어 메모리에 올라간 구체적인 실체
    • 인스턴스는 객체에 포함된다
💡 객체 vs 인스턴스 클래스 타입으로 선언되었을 때 객체라고 부르고 그 객체가 메모리에 할당되어 실제로 사용될때 인스턴스라고 부름
💡 클래스 vs 객체 클래스는 설계도 , 객체는 설계도로 구현한 모든 대상



Interface와 abstract class 차이 (목적의 차이)

  • Interface : 확장, 함수의 구현을 강제해 같은 동작을 하도록 하는 목적
  • abstract class : 공통된 부분을 모으는 것 , 상속 & 재사용



Call by Reference 와 Call by Value의 차이

  • 직접 참조 와 복사의 차이
  • 자바는 어디에 해당하는가?
    • Call by Value



HashMap vs HashTable vs ConcurrentHashMap의 차이

  • HashMap
    • 동기화(thread-safe) 보장 안됨
    • null 허용
  • HashTable , ConcurrentHashMap
    • 동기화 보장
    • null 허용 x
    • 성능은 ConcurrentHashMap이 더 우수하다
      • 두 개의 구현 방식이 다르기 때문에
        • HashTable : 메소드 전체에 락을 걸어서 사용
        • ConcurrentHashMap : 세그먼트 별로 락을 사용



java immutable Object (불변객체)

  • 불변객체는 재할당은 가능하지만, 한번 할당하면 내부 데이터를 변경할 수 없는 객체
  • 장점
    • 객체에 대한 신뢰도가 높아진다. 객체가 한번 생성되어 변경되지 않으면 transaction내에서 변경이 없다라고 할 수 있기 때문
    • 생성자, 접근 메소드에 대한 방어 복사가 필요없다.
    • 멀티스레드 환경에서 동기화 처리 없이 객체를 공유할 수 있음
  • 단점
    • 객체가 가지는 값마다 새로운 객체가 필요함
      • 따라서 메모리 누수와 새로운 객체를 계속 생성해야하기 때문에 성능 저하 발생
  • 불변 class 만드는 방법
    • 모든 class field 변수는 final로 선언
    • 모든 class field 변수의 setter 메서드 선언 X
    • class를 상속하지 못하도록 선언(class를 final로 선언 / 생성자를 private로)
    • 모든 field 변수가 final이 아닐때, 즉 가변객체타입의 필드 변수가 있을 경우 그 가변객체타입의 필드 변수에 대해 직접적으로 접근하지 못하도록
    • copy객체를 생성하여 새로운 인스턴스를 반환하도록 방어적 복사본 전략 사용


new String() 과 “ ”으로의 선언 차이

  • 리터럴을 이용한 방식 : String s1 = “”;
    • string constant pool 영역에 생성
    • String의 intern()메소드 호출
      • intern() : 주어진 문자열이 pool에 존재하는지 검색하고, 있다면 주소값 반환 / 없다면 pool에 넣고 새 주소값 반환
  • new 연산자를 이용한 방식 : String s2 = new String(””);
    • heap영역에 생성



java ==와 equals의 차이

  • “==” : 비교하고자 하는 두 개의 대상의 주소값을 비교
  • String 클래스의 equals메소드 : 비교하고자 하는 두개의 대상의 값 자체를 비교
    • 자바에서 문자열을 비교하기 위해서는 equals를 사용해야함

 

 

제네릭이란? , 왜 쓰는지?

  • 제네릭을 지원하기전에는 컬렉션에서 객체를 꺼낼때마다 형변환을 해야했다
  • 제네릭을 사용하면 컬렉션이 담을 수 있는 타입을 컴파일러에 알려준다
  • 컴파일 과정에서 오류를 차단 할 수 있다(안전하고 명확한 프로그래밍 가능)

 

라이브러리와 프레임워크의 차이 

  • 라이브러리는 개발자가 필요한 기능만 사용해도 된다
  • 프레임워크는 개발 주도권이 프레임워크에게 있음
    • 프레임워크가 정해놓은 개발 방법대로 그대로 따라야함

 

지식 출처 

https://www.youtube.com/watch?v=a-f0HxYRNiM

 

반응형