주니어 자바 개발자를 위한 인터뷰 질문이란 게시물을 보게 되어서 딱 나에게 알맞은 내용이라 생각하여 이것에 대한 답변을 정리해서 작성해보려고 한다.
또한 답변을 작성하면서 추가적으로 궁금한 내용을 '📌'을 통해 적어두고 추후에 다른 포스트로 정리해 보려고 한다.
JDK(Java Development Kit)는 자발 애플리케이션을 개발하기 위한 환경을 지원하며 JRE, 컴파일러(javac), javadoc, jar 등 개발에 유용한 도구들을 포함하고 있는 자바 개발 도구이다.
JRE(Java Runtime Environment)는 자바 실행 환경으로 JVM, Java binaries, Java 클래스 라이브러리 등을 포함하고 있어 자바 프로그램의 실행을 지원한다.
하지만 컴파일러나 디버거 등의 도구는 포함하지 않는다.
JRE의 구성
JDK와 JRE 비교
JDK, JRE, JVM 관계
📌JVM에 대해서
사진출처: https://www.geeksforgeeks.org/difference-between-jdk-and-jre-in-java/
"=="는 객체의 주소값을 비교하는 연산자이고 equals는 값 자체를 비교하는 Object 클래스의 메서드이다.
String 변수 생성 시 리터럴을 이용한 방식, new 연산자를 이용한 방식이 있다.
String을 리터럴로 선언할 경우 String constant pool이라는 영역에 존재하고 new를 통해 String을 생성하면 Heap영역에 존재하게 된다.
이렇게 객체가 같은 값이더라도 주소값이 다를 수 있어서 String을 비교한다면 equals를 사용하여 비교해주어야 한다.
📌힙(Heap)과 스택(stack)에 대해서
사진출처: https://tecoble.techcourse.co.kr/post/2020-07-29-equals-and-hashCode/
String은 기본 데이터 타입이 아닌 클래스타입이이다.
하지만 String 클래스 구성 내부 요소를 보자면, 결국 String도 char[] 배열로 이루어진 데이터 자료라고 볼수 있다.
📌자바 자료형에 대해서
문자열을 다루는 대표적인 클래스로 String, StringBuffer, StringBuilder가 있다.
String과 다른 두개의 가장 큰 차이점은 String은 불변(immutable)의 속성을 갖고 StringBuffer, StringBuilder는 가변성의 속성을 가진다는 점이다.
따라서 StringBuffer와 StringBuilder는 가변성을 가지기 때문에 append(), Delete() 등의 API를 이용하여 동일 객체 내에서 문자열을 변경하는것을 가능하게 한다.
String의 경우 객체의 값을 변경할 경우 동일 객체 내에서 문자열이 변경이 되는 것이 아니라 새로운 메모리에 인스턴스가 생기고 기존의 메모리가 삭제되는 방식으로 작동한다.
StringBuffer와 StringBuilder의 차이점은 동기화의 유무로써 StringBuffer는 동기화를 지원하여 멀티쓰레드 환경에서 안전하지만 StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지않고 단일쓰레드에서의 성능은 StringBuffer보다 뛰어나다.
동작에 있어서 추상 클래스는 추상 메서드가 없어도 동작 할 수 있다.
추상 클래스의 모든 메서드가 일반 메서드여도 추상 클래스로 선언할 수 있다.
추상 클래스의 사용 목적은 클래스의 공통 사항을 한 곳에서 관리하여 개발 및 유지 보수가 편해지고 추상 메서드를 이용하여 표준화의 정도를 높이며 필수적으로 구현해야하는 부분을 지정하려는 의도를 가지고 사용한다. 하지만 추상 메서드가 아닌 일반 메서드로 추상 클래스를 구현 했을 경우 이러한 사용 목적을 잃어버리기에 추상 메서드가 필수적이진 않지만 추상 메서드를 구현하지 않고 추상 클래스를 사용한다는 것은 목적에 부합하지 않는다고 할 수 있다.
📌추상클래스와 인터페이스에 대해서