•
Java의 특징에 대해서 설명해주세요.
◦
객체 지향에 특화된 언어이고, JVM을 통해 실행되기 때문에 WORA(Write Once, Read Anywhere) 특성을 가진 플랫폼에 독립적인 언어입니다.
◦
GC를 활용해서 자동 메모리 관리에도 장점이 있고, 나온지 오래돼서 관련 생태계나 라이브러리 활용에 강점이 있습니다.
•
Java의 단점에 대해서 설명해주세요.
◦
최근에 많이 개선되었다고는 하지만 일단 JVM위에서 돌아가는 만큼 C계열 언어에 비해서 속도가 느리고, JVM, GC 같이 백그라운드에서 메모리를 잡아먹는 부분이 많아서 메모리 사용량이 많습니다.
•
Java 실행 과정에 대해서 설명해주세요.
1.
Java Compiler가 Java로 작성된 소스 코드 .java 파일을 .class 파일인 Byte Code로 컴파일합니다.
2.
Byte Code를 기계어로 변환시키기 위해 가상 CPU가 필요한데, 이것이 JVM의 역할입니다.
3.
JVM이 Byte Code를 기계어(Binary Code)로 변환합니다.
4.
이렇게 JVM에 의해 컴파일된 기계어는 바로 CPU에서 실행되어 사용자에게 서비스를 제공합니다.
•
Java Bytecode에 대해서 설명해주세요.
◦
자바 소스코드를 JVM이 이해할 수 있게 변환한 코드입니다.
•
Java의 인터프리터(interpreter) 방식과 JIT 컴파일(compile) 방식에 대해서 설명해주세요.
◦
기존의 자바는 인터프리터 방식으로 명령어를 하나씩 실행하게끔 이루어져 있어 실행 속도가 느렸습니다.
◦
이에 비해서 JIT 컴파일러는 같은 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱합니다. 이후에는 바뀐 부분만 컴파일하고 나머지는 캐싱된 코드를 사용합니다.
동적 번역(dynamic translation)이라고도 불리는 이 기법은 이전의 자바 해석기 방식보다 성능이 10배 ~ 20배 정도 더 좋다.
•
사용해본 Java 버전과 특징 그리고 왜 그 버전을 사용했는지 설명해주세요.
◦
Java 11이랑 17버전 써봤습니다. 11은 Tomcat이랑 JSP로 간단한 서비스 개발해보고 싶은데 지원하는 버전 때문에 썼었던 것 같고, 17은 SpringBoot 쓰면서 최신 문법 쓰려고 썼었습니다.
•
Java 8, 11, 17 버전에 대해 아는대로 설명해주세요.
◦
자바 8은 람다식이랑 스트림 등의 문법적인 부분이 많이 추가되었고,
◦
11은 HttpClient 표준화,
◦
17은 가비지컬렉션 개선이 있습니다.
•
JDK와 JRE에 대해서 설명해주세요.
◦
JDK는 Java Development Kit이고, JRE는 Java Runtime Environment입니다. JDK가 JRE를 포함하고 있고, JDK에는 JRE에서 컴파일러, 개발 툴 같은게 추가된 것입니다.
◦
간단히, Java로 프로그램을 개발하려면 JDK가, 컴파일 된 Java 프로그램을 실행시키려면 JRE가 필요하다고 보면 된다.
•
동일성과 동등성에 대해 설명해 주세요.
◦
동일성은 두 객체가 메모리 상 같은 인스턴스를 참조하는가? ==
◦
동등성은 두 객체의 내용이 같은가? .equals()
•
equals()와 ==의 차이점은 무엇일까요?
◦
equals는 내용 비교 (String에서 사용)
◦
==는 메모리 주소(객체 참조)를 비교
•
HashCode를 설명하고, equals() 와 hashCode() 의 차이점에 대해 설명해 주세요.
◦
hashCode는 해시맵이나 해시셋 같은 거에서 빠르게 객체를 찾기 위한 정수값을 반환합니다.
◦
equals는 논리적 비교이고, hashCode는 숫자값을 반환합니다.
•
왜 equals() 외에 hashCode() 도 재정의해야 하나요?
◦
해시맵 같은 컬렉션 데이터 구조는 먼저 hashCode로 후보군을 좁히고, 이후 equals로 비교합니다. 때문에 중복 저장 오류를 방지하기 위해서 hashCode도 정의해야합니다.
•
toString()에 대해서 설명해주세요.
◦
객체를 문자열로 바꿔주는 메서드입니다.
•
자바에서 메인 메서드는 왜 static으로 되어 있을까요?
◦
main은 프로그램 진입점이라 객체 생성 없이 바로 실행되어야 하기 때문입니다. 그래서 static으로 선언해서 JVM이 클래스 로딩 후 곧바로 호출할 수 있게 설계했습니다.
•
상수(Constant)와 리터럴(Literal)에 대해서 설명해주세요.
◦
상수는 final을 써서 선언한 값 변경이 불가능한 변수이고,
◦
리터럴은 코드에 직접 작성되어 선언된 고정값입니다. ex) a = 5;, word = “hello”;
•
Primitive Type과 Reference Type에 대해서 설명해주세요.
◦
기본 자료형은 실제 값 자체를 저장합니다. int, boolean 등이 있구요, JVM의 스택 메모리에 저장됩니다.
◦
참조 자료형은 객체를 참조하는 주소값을 저장하고, Integer, String, List 같은게 있고 힙 메모리에 저장됩니다.
•
Java는 Call by Value 일까요? 아님 Call by Reference 일까요?
◦
Call by Value 입니다. 객체를 넘길때도 참조 “값”을 복사해서 넘기는 식으로 작동합니다.
•
Java 직렬화(Serialization)에 대해서 설명해주세요.
◦
직렬화는 객체를 바이트 스트림으로 변환하는 기술입니다. Serializable 인터페이스를 호출해서 구현이 가능합니다. JsonSerializable 처럼 다양한 형식의 데이터로 직렬화 및 역직렬화도 가능합니다.