Java의 특징에 대해서 설명해주세요.
Java는 플랫폼 독립성을 제공하며, "Write Once, Run Anywhere"(WORA)를 지향합니다. 객체 지향 언어로 캡슐화, 상속, 다형성을 지원합니다. 자동 메모리 관리를 위한 Garbage Collection을 제공합니다. 멀티스레딩, 강력한 보안, 풍부한 API 등도 주요 특징입니다.
- 객체지향 언어 -> 유지보수가 쉽고 확장성이 높다.
- 멀티 스레드 구현이 쉽다 -> 스레드 생성 및 제어와 관련된 라이브러리 API를 제공한다.
Java의 단점에 대해서 설명해주세요.
Java는 C/C++에 비해 실행 속도가 느릴 수 있습니다. Garbage Collection으로 인해 메모리 사용량이 높고, JVM 초기화로 인해 애플리케이션 시작 시간이 느릴 수 있습니다.
- C/C++: 소스 코드 → 기계어(즉시 실행)
- Java: 소스 코드 → 바이트코드(.class 파일) → JVM 해석 및 실행
- JVM 초기화 비용
- 클래스 로더: 클래스 파일 동적으로 로드)
- 메모리 관리: JVM 내부 Heap, Stack 메모리 공간 준비
- JIT 컴파일: 자주 호출되는 코드를 기계어로 변환해 캐싱하는 과정
Java 실행 과정에 대해서 설명해주세요.
1. 소스 코드 작성(.java 파일)
2. 컴파일러(javac)로 컴파일 -> 바이트 코드(.class 파일 생성)
3. JVM 클래스 로더가 바이트코드 로드
4. Execution engine의 인터프리터/컴파일러(JIT)가 기계어로 변환하여 실행
Java Bytecode에 대해서 설명해주세요.
Bytecode는 JVM이 실행할 수 있는 중간 언어입니다. 플랫폼 독립적인 코드 형태로, .class 파일에 저장됩니다. JVM이 이를 해석하여 실행합니다.
Java의 인터프리터(interpreter) 방식과 JIT 컴파일(compile) 방식에 대해서 설명해주세요.(재검토)
인터프리터는 바이트코드를 한 줄씩 해석하며 실행합니다. 초기 실행 속도가 빠르지만 전체 실행은 느립니다. JIT 컴파일러는 자주 실행되는 코드를 기계어로 변환해 캐싱하여 실행 속도를 높입니다.
사용해본 Java 버전과 특징 그리고 왜 그 버전을 사용했는지 설명해주세요.
- Java 8: 람다식, 스트림 API, Optional 등으로 생산성을 높일 수 있어 사용했습니다. Spring Boot 2.x.x와 호환성을 위해 주로 사용했습니다.
- Java 11: LTS 지원, 새로운 String 메서드와 HttpClient API 사용을 위해 도입했습니다.
- Java 17: 최신 LTS 버전으로, 패턴 매칭과 sealed 클래스와 같은 새로운 기능 활용을 위해 사용했습니다. Spring Boot 2.x.x와의 호환성을 고려해 도입했습니다.
Java 8, 11, 17 버전에 대해 아는대로 설명해주세요.
Java 8
- 2014년 출시, LTS 버전(~2030.12 지원)
- 대규모 릴리즈, Lambda, Stream API 제공
- Optional, 새로운 날짜,시간 API 제공 (ex: LocalDateTime)
- Oracle이 Java를 인수한 후 첫번째 LTS 출시 버전
Java 11
- 2018년 출시, LTS 버전(~2032.01 지원)
- String과 File 기능 향상
- String: isBlank(), strip() File: writeString(), readString()
- var 키워드 사용 가능
- Open JDK와 Oracle JDK가 통합
Java 17
- 2021년 출시, LTS 버전(~2029.09 지원)
- Spring Boot 3.x.x 버전은 JDK 17 이상 부터 지원
- Switch에 대한 패턴 매칭 (Preview), recode class도입, 텍스트 블록 기능(""" 사용)을 추가해 코드를 간결하고 효율적으로 작성할 수 있도록 도움
JDK와 JRE에 대해서 설명해주세요.
JDK는 Java Development Kit의 약자로, 개발에 필요한 컴파일러, 디버거 등 도구를 포함합니다. JRE는 Java Runtime Environment로, JVM과 Java 라이브러리를 포함하여 실행 환경만 제공합니다.
동일성과 동등성에 대해 설명해주세요.
동일성은 두 객체의 메모리 참조가 같은지를 확인하는 것이고, 동등성은 객체의 내용이 같은지를 비교하는 것입니다.
equals()와 ==의 차이점은 무엇일까요?
==: 메모리 주소 비교
equals: 내용 비교(기본 Object는 동일성 기준)
HashCode를 설명하고, equals() 와 hashCode() 의 차이점에 대해 설명해 주세요.
- equals()는 객체의 내용 비교를 통해 동등성을 확인합니다.
- hashCode()는 해시 기반 컬렉션에서 객체를 효율적으로 저장하고 검색하기 위해 사용됩니다.
왜 equals() 외에 hashCode() 도 재정의해야 하나요?
해시 기반 컬렉션(HashMap, HashSet 등)은 hashCode()와 equals()를 모두 사용하여 객체를 구분합니다. 둘 중 하나만 재정의하면 컬렉션의 일관성을 보장할 수 없습니다.
toString()에 대해서 설명해주세요.
toString() 메서드는 객체를 사람이 읽기 쉬운 문자열로 변환합니다. 기본적으로 클래스 이름과 해시코드를 반환하지만, 재정의하여 의미 있는 정보를 제공할 수 있습니다.
자바에서 메인 메서드는 왜 static으로 되어 있을까요?
객체를 생성하지 않고 JVM이 직접 호출할 수 있어야 하기 때문입니다.
상수(Constant)와 리터럴(Literal)에 대해서 설명해주세요.
상수는 변하지 않는 값을 의미하며, final 키워드로 선언합니다. 리터럴은 코드에 직접 작성된 값을 의미합니다. 예: int x = 10;에서 10은 리터럴입니다.
Primitive Type과 Reference Type에 대해서 설명해주세요.
Primitive Type은 값 자체를 저장하며, int, double 등이 있습니다. Reference Type은 객체의 메모리 주소를 저장하며, 배열, 클래스 등이 이에 해당합니다.
Java는 Call by Value 일까요? 아님 Call by Reference 일까요?
Java는 Call by Value입니다. 메서드 호출 시 변수의 복사본을 전달하며, 객체를 전달할 때는 참조 값(주소)이 복사됩니다.
인수를 어떻게 전달하는지 차이
- Call by Value:
- 함수 호출 시, 값의 복사본이 전달
- 원본 데이터는 변하지 않는다.
- Call by Reference:
- 함수 호출 시, 변수의 참조(주소)가 전달
- 원본 데이터가 함수 내부 작업의 영향을 받는다.
Java 직렬화(Serialization)에 대해서 설명해주세요.
직렬화는 객체를 바이트 스트림으로 변환하여 저장하거나 전송할 수 있게 하는 기술입니다. Serializable 인터페이스를 구현하여 사용하며, 네트워크 전송이나 파일 저장에 활용됩니다.
'외부활동 > JSCODE 자바' 카테고리의 다른 글
자바 4주차: 동시성 프로그래밍 기초(작성 중) (0) | 2025.01.19 |
---|---|
자바 3주차: 컬렉션 기초(작성 중) (0) | 2025.01.17 |
자바 2주차: (작성 중) (0) | 2025.01.06 |
자바 1주차: 자바 객체 지향 (0) | 2025.01.03 |