-
Java 컴파일 과정
- 개발자가 자바 소스코드 (.java)를 작성한다.
- 빌드한다.
- Java Compiler가 자바 소스파일을 컴파일한다. javac 명령어를 통해 자바 바이트코드 (.class) 를 생성한다.
- 컴파일된 바이트 코드를 JVM의 Class Loader에게 전달한다. Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역 (JVM의 메모리)에 올린다.
- 실행엔진 (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가지 특징
- 추상화 (Abstraction)
- 캡슐화 (Encapsulation)
- 상속 (Inheritance)
- 다형성 (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