(면접 답변 기준으로 작성)
Java
- JVM이란?
- JVM은 자바 프로그램이 어떤 운영체제에서도 실행될 수 있도록 도와주는 가상의 실행 환경입니다.
- 자바 컴파일러가 생성한 바이트코드를 읽어 운영체제에 맞는 기계어로 변환해 실행합니다.
- 주요 구성 요소는 클래스 로더, 실행 엔진, 메모리 영역 (heap, stack, method area)등이 있습니다.
- Java의 실행방식
- 크게 세 단계로 나뉩니다.
- 1단계는 자바 소스코드 (.java)를 javac 컴파일러를 통해 바이트코드(.class)로 변환하는 과정입니다.
- 2단계는 변환된 바이트코드를 JVM이 로딩하고, 클래스 로더와 메모리 할당을 진행합니다.
- 3단계는 JVM 내 실행 엔진이 바이트코드를 실행하는 단계로, 인터프리터 방식으로 한 줄씩 해석하거나, JIT(Just-In-Time) 컴파일러를 통해 성능 최적화를 위해 기계어로 변환해 실행합니다.
- 이 덕분에 자바는 ‘한 번 작성하면 어디서나 실행된다’는 플랫폼 독립성을 가집니다.
- GC
- 자바에서 더 이상 참조되지 않는 객체를 자동으로 찾아서 메모리에서 제거해주는 기능입니다.
- 덕분에 개발자가 직접 메모리를 관리하지 않아도 되어 편리하고, 메모리 누수를 줄일 수 있습니다.
- JVM의 Heap 영역에서 동작합니다.
- GC가 너무 자주 발생하거나 오래 걸리면 시스템 응답 속도가 느려질 수 있어서 상황에 따라 GC 튜닝이 필요할 수 있습니다.
- 오버로딩 vs. 오버라이딩
- 오버로딩은 같은 이름의 메서드를 매개변수만 다르게 정의하는 것으로, 한 클래스 내에서 여러 방식으로 메서드를 사용할 수 있게 해줍니다.
- 오버라이딩은 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것입니다.
- (오버로딩은 컴파일 타임에 결정, 오버라이딩은 런타임에 동작한다는 차이도 있습니다.)
- String, StringBuilder, StringBuffer
- String: 불변객체(한 번 생성되면 값을 바꿀 수 없음), 문자열을 수정하게 되면 새로운 객체가 생성되어 메모리 사용이 늘어날 수 있습니다.
- StringBuilder: 가변객체(문자열을 효율적으로 수정할 수 있어 반복적인 문자열 처리에 적합), 싱글쓰레드 환경
- StringBuffer: 가변객체(문자열을 효율적으로 수정할 수 있어 반복적인 문자열 처리에 적합), 멀티쓰레드 환경
- (차이는 쓰레드 안전성인데, StringBuffer는 멀티쓰레드 환경에서 안전하게 동작하지만, 동기화 비용 때문에 상대적으로 느립니다.)
- final, static, this, super
- final: 변수에 값 한 번만 할당 가능하며 클래스나 메서드에도 적용되어 상속 또는 오버라이딩 방지 가능
- static : 클래스단위로 공유되는 변수나 메서드를 정의할 때 사용, 객체 생성없이도 접근이 가능(유틸 클래스나 공통 데이터 관리에 자주 쓰임)
- this: 현재 객체 자신을 참조, 같은 클래스 내 지역 변수와 멤버 변수를 구분할 때 주로 사용
- super: 부모 클래스의 멤버나 생성자 호출할 때, 오버라이딩한 메서드에서 부모의 원래 기능을 호출할 때 사용
- interface, abstract
- interface : 구현없이 선언만 존재, 주로 클래스들이 공통으로 따라야 하는 규약을 정의할 때 사용 (Comparable, Runnable 같은 기능 계약 표현시)
- abstract : 공통 속성이나 기능을 일부 구현한 후 상속받는 클래스들이 이를 재사용할 수 있도록 함, 추상 메서드와 일반 메서드를 함께 가질 수 있음.
- 공통 규약만 필요하면 interface, 공통 속성과 기본 구현도 공유하고 싶다면 abstract class를 사용하는 것이 일반적인 기준.
- 동등성(equality), 동일성(identity) (equals(), ==)
- 동일성은 객체의 주소를 비교하는 것이고, 동등성은 객체의 같음을 비교하는 것입니다.
- 기본적으로 자바에서는 Object 클래스에 정의된 equals() 메소드가 동등성 비교를 합니다. 따라서, 개발자는 원한다면 equals() 메소드를 오버라이딩해서 동등성의 판단 기준을 정의해주면 됩니다.
- (== 연산자는 동일성 비교로 같은 객체를 참조하고 있는지 즉, 주소가 같은지 확인. equals()는 동등성 비교로 두 객체의 내용이 같은지를 확인)
- compile error, runtime error
- runtime error가 더 치명적입니다.
- compile error는 문법적 오류로 실행 자체가 불가하지만 발견 즉시 수정 가능함
- runtime error는 발견과 디버깅이 어렵고 실행 중 발생해서 사용자에게 직접 영향을 미칠 수 있어 더 치명적임 (0으로 나누거나 null을 참조할 때 발생하는 오류)
- Checked Exception, Unchecked Exception
- RuntimeException의 상속 유무 따라 구분됨
- Checked Exception은 RuntimeException을 상속받지 않는 예외, 컴파일러가 에러 처리를 강제하는 예외, 예외가 발생할 가능성이 높은 코드에서 반드시 try-catch or throws로 처리해야 함. IOException, SQLException 등이 있음.
- Unchecked Exception은 RuntimeException을 상속받는 예외, 컴파일러가 예외 처리를 강제하지 않으며 주로 개발자의 실수로 발생. (NullPointerException, IndexOutOfBOundsException)
- 직렬화, 역직렬화
- 직렬화: 자바 객체를 저장하거나 네트워크로 전송하기 위해 바이트 스트림 형태로 변환하는 과정
- 역직렬화: 바이트 스트림을 다시 자바 객체로 복원하는 과정
- 예를 들어, 파일로 객체 상태를 저장하거나, 서버와 클라이언트 간에 객체를 주고받을 때 사용합니다.
- (객체 → 텍스트(JSON/XML): 직렬화의 일정, 텍스트 → 객체 (역직렬화))
- 원시타입, 참조타입
- 자바에서 원시타입은 int, double, boolean처럼 값 자체를 저장하는 타입. 총 8가지가 있으며 메모리에 직접 값을 저장한다.
- 참조타입은 배열, 클래스, 인터페이스 등과 같이 객체의 주소(참조)를 저장하는 타입. 실제 메모리는 Heap에 있고 변수는 그 주소만 참조한다.
- 원시타입은 성능이 빠르고 메모리 사용이 적지만, 참조타입은 더 복잡하고 유연한 데이터 구조를 표현할 수 있다.
'CS 및 면접복기' 카테고리의 다른 글
| 20250807 - ALL (3) | 2025.08.07 |
|---|---|
| 20250806 - ALL (3) | 2025.08.06 |
| 20250805 - DB(1) (4) | 2025.08.05 |
| 20250804 - Java(2) (4) | 2025.08.04 |
| 20250802 (7) | 2025.08.02 |