ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java
    면접준비 2025. 3. 21. 15:01
    Java 컴파일 과정

     

    출처: https://gyoogle.dev/blog/computer-language/Java/%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EA%B3%BC%EC%A0%95.html

     

     

    1. 개발자가 자바 소스코드 (.java)를 작성한다.
    2. 빌드한다.
    3. Java Compiler가 자바 소스파일을 컴파일한다. javac 명령어를 통해 자바 바이트코드 (.class) 를 생성한다.
    4. 컴파일된 바이트 코드를 JVM의 Class Loader에게 전달한다. Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역 (JVM의 메모리)에 올린다.
    5. 실행엔진 (Execution Engine)을 통해 JVM 메모리에 올라온 바이트 코드들을 실행한다.
    인터프리터 - 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다.
    - 하나하나의 실행은 빠르지만, 전체적인 실행 속도는 느리다.
    JIT 컴파일러 (Just-In-Time Compiler) - 인터프리터의 단점을 보완하기 위해 도입된 방식
    - 바이트 코드 전체를 컴파일 → 바이너리 코드로 변경
    - 바이너리 코드로 직접 실행하는 방식
    - 전체적인 실행속도는 인터프리팅 방식보다 빠르다.

     

     

    compiler vs interpreter

     

     

    String, StringBuilder, StringBuffer의 차이점
    String - 불변 객체
    - 문자열을 변경하는 작업 ( + 연산, concat(), replace())를 수행하면 새로운 String 객체가 생성되고 기존 객체는 변경되지 않음
    - 문자열을 자주 변경하는 경우, 메모리 낭비와 성능 저하가 발생할 수 있음
    - 사용 적합 사례: 상수 문자열, 로그 메시지
    StringBuilder - 가변 객체
    - 비동기 방식 → 싱글스레드 환경에서 문자열이 변경될 경우에 사용함
    - 내부적으로 배열을 직접 수정하므로 String 보다 속도가 빠르고 메모리 사용량이 적음
    - 멀티스레드 환경에서 안전하지 않음. 여러 스레드가 동시에 접근할 경우 문제가 발생할 수 있음.
    - 사용 적합 사례: JSON 생성, XML 파일 파 
    StringBuffer - 가변 객체
    - 동기 방식 → 멀티스레드 환경에서 문자열이 변경될 경우에 사용함
    - 내부적으로 동기화 (Synchronization) 처리가 되어있어 여러 스레드가 접근해도 안전함.
    - 성능이 다소 느림
    - 사용 적합 사례: 로그파일 저장

     

    thread safe

     

    Java String이 불변 객체인 이유

     

    Java의 접근 제어자
    접근제어자 외부 패키지에서 사용 상속 관계에서 사용 외부 클래스에서 사용 같은 클래스에서 사용
    public O O O O
    protected X O O O
    default X X O O
    private X X X O
    • public: 어떤 클래스에서라도 접근 가능
    • protected: 동일 패키지 내의 클래스 / 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근 가능
    • default: 접근 제어자를 별도로 설정하지 않는 경우의 기본 접근 제어자. 동일 패키지 내에서만 접근 가능
    • private: private 변수, 메소드는 해당 클래스에서만 접근 가능

     

    OOP의 4가지 특징
    1. 추상화 (Abstraction)
    2. 캡슐화 (Encapsulation)
    3. 상속 (Inheritance)
    4. 다형성 (Polymorphism)
    캡슐화와 은닉화의 차이

     

    OOP의 5대 원칙 (SOLID)

     

    JVM 구조

     

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

     

    interface와 abstract class의 차이

    - 인터페이스는 확장과 관련이 있고, 추상 클래스는 공통된 부분을 추상화해서 

    CheckedException과 UnCheckedException의 차이

     

    Call by Reference와 Call by Value의 차이

     

    자바는 Call by Reference와 Call by Value 중 어디에 해당하는가?

     

    오버로딩과 오버라이딩의 차이

     

    HashMap vs HashTable vs ConcurrentHashMap
    HashMap - 동기화 (thread-safe) 보장 안됨
    - null 허용
    - 비동기 (Non-Synchronized) 자료구조
    - 멀티스레드 환경에서 안전하지 않지만, 단일스레드에서 가장 빠름
    HashTable - 동기화 (thread-safe) 보장
    - null 허용 안함
    - 동기 (Synchronized) 자료구조로, 멀티스레드 환경에서 안전하지만 성능이 낮음
    - 요즘은 ConcurrentHashMap을 더 많이 사용
    ConcurrentHashMap - 동기화 (thread-safe) 보장
    - null 허용 안함
    - 부분 동기화 (Segment Locking, 버킷 수준 락) 사용 → 동시 접근이 가능, 성능이 뛰어남
    - HashTable 보다 훨씬 빠르고, HashMap 보다 안전함
    - 동시 읽기 가능, 일부 쓰기도 병렬로 처리 가능

     

    Java 불변 객체 (Immutable Object)
    • 불변 객체는 생성 후 그 상태를 바꿀 수 없는 객체
    • 재할당은 가능하지만, 한번 할당하면 내부 데이터를 변경할 수 없는 객체
    • 예시: String, Integer, Boolean
    String str = "a";
    str = "b";

    // "b" 라는 새로운 객체를 만들고, 그 객체를 str이 참조하는 방식이다
    • 장점
      • 객체에 대한 신뢰도가 높아짐
      • 생성자, getter에 대한 방어 복사가 필요 없음
      • 멀티스레드 환경에서 동기화 처리 없이 객체를 공유할 수 있음
    • 단점
      • 객체가 가지는 값마다 새로운 객체가 필요함
      • 메모리 누수와 새로운 객체를 계속 생성해야함 성능 저하를 야기할 수 있음
      •  * 메모리 누수: 더 이상 사용되지 않는 객체들이 Garbage Collection에 의해 소멸되지 않고 누적되는 현상
    Java String이 불변 객체인 이유

     

    new String( ) 과 "" 방식의 차이

     

    Reflection vs Java Dynamic Proxy

     

    Java Garbage Collector의 동작 과정, 알고리즘

     

    Generic이란 무엇이고 왜 사용하는지?

     

    현업에서 System.out.println 메소드를 사용하지 않는 이유는?

     

    스레드는 왜 써야하는 것인지?

     

    프로세스 vs 스레드

     

    0이 들어있는 변수에 10개의 스레드가 동시에 접근해서 ++ 연산을 하면 우리 예상과 다르게 10이 나오지 않습니다. 왜 그럴까요?

     

    Java에서 동시성과 관련된 키워드는?
    • synchronized
    • volatile
    • atomic

    '면접준비' 카테고리의 다른 글

    ✨좋은 사이트, 영상✨  (0) 2025.03.24
    Web  (1) 2025.03.24
    Spring Framework  (0) 2025.03.21
    DB  (0) 2025.03.21
Designed by Tistory.