Java의 특징에 대해서 설명해주세요
OS에 상관 없이 이식성이 좋다. write once run anywhere
- 한 번 코드를 작성하고 컴파일 하면, OS에 맞는 jvm 설치 후 어디서나 실행할 수 있다.
- OS 호환성은 jvm 이 제공하기 때문에 사용자는 jvm 설치 후 자바 프로그램을 실행하기만 하면 된다.
JVM (자바 가상 머신) 이 메모리를 관리해준다. -> jvm 가비지 컬렉션 기능
- c언어와는 달리, 자바는 참조되지 않는 heap 영역을 발견하면 자동으로 메모리에서 해제해준다.
- 따라서 메모리 누수 문제를 어느정도 줄일 수 있다.
Java의 단점에 대해서 설명해주세요
- 자바 프로그램 실행을 위해 jvm 을 먼저 로드하고 초기화 해야 하므로 시작시간이 느린 편이다.
- jvm 위에서 실행해야 하므로 c, c++ 같은 네이티브 언어보다 실행 시간이 느릴 수 있다.
- 타 언어들에 비해 강타입 언어이며 문법이 많은 편이다.
- 비교적 코드량이 장황한 편이라 코딩량이 많을 수 있다.
- 프론트, ui 개발에 한계를 가진다.
Java 실행 과정에 대해서 설명해주세요
자바 프로그램은 컴파일 후 실행 가능하다.
1. 개발자가 .java 파일을 작성한다.
2. 자바 컴파일러가 소스 코드를 컴파일 하여 .java 파일이 .class 파일로 컴파일 된다.
3. 자바 소스 코드를 바이트코드로 변환하여 jvm 에서 더 빠르게 실행되도록 최적화 한다.
4. jvm 이 자바 프로그램을 실행해준다.
Java Bytecode에 대해서 설명해주세요.
자바 컴파일러(javac)가 .java 파일을 컴파일해서 .class 파일로 변환한다.
.class 파일을 바이트코드라고 하고, JVM이 이해할 수 있는 형식이다.
자바 프로그램 실행 시, JVM이 바이트 코드를 로드하고 해석하여 실행한다.
Java의 인터프리터 방식과 JIT 컴파일 방식에 대해 설명해주세요
- JVM은 두 방식을 함께 사용한다.
- 처음 프로그램이 실행될 때 바이트코드를 한 줄씩 읽어서 즉시 실행한다.
- JVM은 자주 사용되는 코드를 모니터링하고 해당 코드는 네이티브 기계어로 컴파일하여 캐시에 저장해둔다.
- 같은 코드가 실행될 때 인터프리터 대신 컴파일된 코드가 실행된다.
사용해본 Java 버전과 특징 그리고 왜 그 버전을 사용했는지 설명해주세요.
자바 17 버전
- 이전 버전에 비해 컨테이너 환경을 위한 최적화가 향상됬다.
- JIT 컴파일러 최적화로 전반적인 실행 속도가 향상됬다.
- record class, sealed class 등의 새로운 기능으로 코드 작성이 간결해졌다.
record class
- 생성자, getter, toString(), equals(), hashCode() 를 전부 자동으로 생성해준다.
- 불변 객체를 간편하게 만들 수 있다.
sealed class
- 해당 부모클래스를 상속 가능한 클래스를 제한할 수 있다.
- 의도하지 않은 상속 구조를 방지할 수 있다.
Java 8, 11, 17 버전에 대해 아는대로 설명해주세요.
java 가 지원하는 대표적인 LTS(Long-Term Support) 버전이다.
(일반적으로 3년마다 LTS 버전이 출시된다)
JDK 와 JRE에 대해서 설명해주세요.
JRE: java runtime environment
자바 프로그램이 실행되기 위한 환경
JDK: java development kit
자바 개발에 필요한 모음이다
개발을 위해 런타임은 꼭 필요하므로 JRE 를 포함한다.
동일성과 동등성에 대해 설명해주세요
동일성: 같은 메모리 주소를 가진 똑같은 인스턴스인지 여부
동등성: 같은 타입인지 여부 또는 같은 수준인지 여부
equals() 와 == 의 차이점은 무엇일까요?
== 연산자는 물리적으로 똑같은 주소를 가진 인스턴스인지 비교한다. 동일성을 비교한다
equals() 는 기본적으로 동일성을 비교하지만, 특정 값을 비교하도록 사용자가 오버라이딩 할 수 있다.
예를 들어, 클래스마다 동등성에 대한 기준이 다를 것이기 때문에 equals 오버라이딩 해서 써야한다.
HashCode 를 설명하고, equals() 와 hashCode() 의 차이점에 대해 설명해주세요
- HashCode 란, 데이터를 해시함수에 넣은 결과값 숫자를 뜻한다. 해시 함수의 결과값.
- 모든 자바 클래스의 부모 클래스인 Object 클래스는 hashCode() 메서드를 구현해놨다.
- 이 메서드를 그대로 사용하기 보다는 오버라이딩(재정의) 하여 사용한다.
- Object 클래스의 equals() 기본 구현은 == 연산자로 참조값를 비교한다.
- Object 클래스의 hashCode() 기본 구현은 객체의 참조값을 기반으로 해시 코드를 생성한다.
- 즉, 인스턴스가 다르면 해시 코드도 다르다.
왜 equals() 외에 hashCode() 도 재정의해야 하나요?
개발자가 hashCode() 를 재정의 하지 않으면, Object 클래스에 정의된 Object.hashCode() 가 호출된다.
즉, 객체의 참조값을 기반으로 해시코드를 리턴하는 것이다.
HashSet 의 경우, hashCode() 값을 기반으로 비교하는데, 값이 아니라 참조값으로 비교하게 되버린다.
toString() 에 대해서 설명해주세요.
객체의 정보를 문자열로 제공하는 메서드
→ 디버깅과 로깅에 활용할 수 있다.
자바에서 메인 메서드는 왜 static 으로 되어 있을까요?
JVM이 프로그램을 실행할 때 가장 처음으로 메인 메서드를 찾는다.
따라서 런타임에 이미 자바 메서드 영역에 올라와 있어야 찾을 수 있으므로 static 으로 되어 있다.
상수와 리터럴에 대해서 설명해주세요.
상수는 변하지 않는 변수를 의미한다.
final 키워드를 붙여서 재할당 할 수 없게 한다.
리터럴은 고정된 구체적인 값을 의미한다.
상수와는 달리 변수가 아니라서 그 값 자체를 의미한다.
Primitive Type과 Reference Type 에 대해서 설명해주세요
primitive type 는 정해진 메모리 크기 만큼 할당하는 타입이다.
int, double, boolean 같은 기본 자료형이다.
reference type 은 참조값이다. 객체 자체가 복사되는 것이 아니라, 참조 주소를 가진 복사본이 전달된다.
참조 자체를 변경해도 원본 객체는 영향받지 않는다.
자바는 Call by Value 일까요? 아니면 Call by Reference 일까요?
자바는 기본적으로 값에 의한 호출이다. 메서드에 인자로 전달된 변수의 값만 복사해서 호출한다.
참조에 의한 호출은 참조값을 인자로 전달하는 것이다. 이 경우, 참조하는 객체를 변경하면 원본 객체도 변경.
자바 직렬화에 대해서 설명해주세요.
자바 객체를 바이트 스트림으로 변환하는 과정이다. 파일 전송 시 필요하다.
역직렬화는 바이트 스트립을 다시 객체로 변환하는 과정이다.
자바 직렬화는 꽤 리소스가 소모되는 되는 작업이라 속도라 느리다.
그래서 JSON, XML 같은 직렬화 방식을 자주 쓴다.