Q. 객체란? 객체지향이란?
실재하는 대상을 의미합니다. 실세계에 존재하는 사물 뿐만이 아니라 느낌이나 감정과 같은 유/무형의 모든 대상을 객체로 표현할 수 있습니다.
Q. SOLID 원칙에 대해 설명해보세요
객체지향 프로그래밍을 위한 설계 원칙입니다.
Q. 다형성에 대해 설명해보세요
다형성은 하나의 타입이 여러개의 객체를 가질 수 있는 것을 의미합니다. 이를 통해 객체의 변경이 필요할 때 타입을 변경할 필요없이 객체 주입만을 통해 수정을 할 수 있습니다. 다형성은 크게 3가지로 구현할 수 있습니다.
Q. Garbage Collection이란?
힙 영역에서 더이상 사용되지 않는 메모리를 정리하는 작업입니다. Garbage Collector에 의해 동작하여 자바 프로세스가 한정된 메모리 공간을 효율적으로 사용할 수 있도록 합니다. 힙 영역은 크게 Young Generation과 Old Generation 영역으로 나눌 수 있는데, Garbage Collection의 대상에서 제외된 횟수가 많을수록 점차 Old Generation영역으로 이동하게 되고, 이 객체들은 GC의 대상이 되는 경우가 점차 줄어들게 됩니다. 이를 Minor GC(일부만 GC)와 Major GC(Old Generation까지 full GC)라고 합니다. 이때 Garbage Collection의 대상은 참조되고 있는지 여부에 따라 갈리게 됩니다.(Reachable)
GC의 가장 기본은 Mark & Sweep과 Stop the World입니다. Root Space(Stack, Method Area, Native Method Stack)으로부터 Reachable한 객체들을 Mark하고, 이를 제외한 객체들을 Sweep한 뒤, Compaction하는 동작입니다. 이때 Full GC를 하는 경우 프로세스를 멈추어 GC를 해야하는데 이것을 Stop the World라고 합니다.
Q. GC 알고리즘 종류는?
Q. 박싱, 언박싱, 오토박싱이란?
박싱은 원시타입을 참조타입으로 변환하는 것, 언박싱은 반대의 의미입니다. 오토박싱은 박싱과 언박싱이 자동으로 이루어지는 것을 의미합니다. 하지만 이때 오토박싱은 참조타입이 null을 가리키면 예외가 발생할 수 있고, 계산 시 언박싱을 한 후 돌아오기 때문에 속도가 느립니다. 또한 객체 생성이기 때문에 GC의 대상이므로 메모리 오버헫드도 발생합니다.
Q.자바의 컬렉션 프레임워크란? 지네릭으로 작성된 이유는?
자바에서 컬렉션이란 여러 데이터를 담을 수 있는 자료구조를 의미합니다. 자바에서 컬렉션 프레임워크 내에서는 List, Map, Set 인터페이스를 통해 컬렉션을 지원합니다. 지네릭은 메서드나 클래스를 구현할 때 타입을 지정하지 않고 실행 시에 지정하는 것을 의미하는데, 이를 통해 여러 데이터 타입을 자료구조 안에 담을 수 있어 지네릭으로 지정됩니다.
Q. Stream API란?
다양한 데이터타입을 표준화된 방식으로 다루기 위해 등장한 개념입니다. 스트림은 Read-Only 방식으로 기존 컬렉션의 수정은 불가능합니다. 내부 반복을 통해 컬렉션 내의 데이터에 접근 가능하므로 기존에 비해 간결한 코드가 가능합니다. 또한 Lazy 연산을 하므로 성능이 최적화됩니다. parallel연산을 통해 병렬처리도 쉽게 가능합니다. 오토박싱과 언박싱의 비용을 줄이기 위해 Intstream과 같이 타입이 지정된 stream도 존재합니다.
Q. 함수형 인터페이스와 람다란?
함수형 인터페이스란 추상메서드가 1개인 인터페이스를 의미합니다. 추상 메서드 외에 정적메서드, 기본메서드는 여러개 가질 수 있습니다. 하지만 함수형 인터페이스를 클래스를 통해 구현하게 된다면 타입 별로 구현체를 만들어야 하기 때문에 람다식을 통해 구현을 합니다. 람다식은 익명함수로 다른 객체에 모두 적용가능한 일급객체입니다. 파라미터를 지정해 주거나 리턴값을 받을 때 사용가능합니다.
Q. 깊은 복사와 얕은 복사의 차이는?
깊은 복사는 실제 값을 메모리 공간에 복사하는 것이고, 얕은 복사는 주소값을 복사하는 것이 차이입니다. object.clone()은 얕은 복사이기 때문에 깊은 복사를 위해서는 오버라이딩을 통한 재정의가 필요합니다.
Q. Thread Safe의 의미와 ArrayList는 Thread Safe한가?
Thread Safe라는 의미는 멀티스레드 환경에서 어떠한 변수나 함수, 객체에 여러 스레드가 접근해도 어플리케이션이 정상적으로 동작하도록 설계한 것을 의미합니다. JAVA에서는 Synchronized나 Lock, Concurrent 패키지를 통해 Thread safe한 환경을 구축할 수 있습니다. ArrayList역시 Thread Safe하지는 않고 sychronized 메서드(전체 lock)나 concurrent 패키지(부분 lock)의 컬렉션들을 이용하여 멀티스레드 환경에서도 안전하게 처리할 수 있습니다.
Q. 접근제어자 종류는?
자바의 접근제어자는 클래스나 변수, 메서드에 접근할 수 있는 범위를 제한하기 위해 지정합니다.
Q. 정적바인딩과 동적바인딩이란?
바인딩은 프로그램의 구성요소의 실제 값이나 파라미터를 결정하는 것을 의미합니다.
Q. 동등성(Equality)와 동일성(Identity)의 차이는?
동일성은 두 객체가 완전히 동일하다는 의미로 같은 메모리 공간을 가리키는 두 객체를 의미합니다. 동등성은 두 객체가 같은 의미를 가진다는 것으로, 참조하고 있는 주소가 다르더라도 그 안의 내용이 동일한 경우 동등하다고 합니다.
Q. Eqauls와 Hashcode는?
Equals는 두 객체가 동일성을 가지는 지 비교하기 위한 메서드입니다. 이를 오버라이딩하여 동등성을 비교하도록 변경할 수 있습니다. 해시코드는 각 객체가 같는 고유의 해시값으로 보통은 메모리 주소를 가집니다. Equals를 오버라이딩 한다면 반드시 해시코드 값을 오버라이드 해야 동일성을 유지할 수 있습니다. Hashcode는 HashMap이나 HashSet과 같은 자료구조에서 호출되는데, equals만 오버라이딩한다면 동일하다고 판단한 객체도 다른 값으로 인식하기 때문입니다. 또한 JPA와 같은 Lazy Loading 방식을 이용한다면 equals를 getter로 구현해야 실제 데이터를 가져올 수 있습니다.
Q. Java11과 Java17의 차이는?
JDK11과 JDK17은 모두 LTS 버전으로 가장 많이 사용되는 자바 버전 중 하나입니다. 자바 11의 가장 큰 특징은 reactive stream의 추가와 G1 GC를 기본 GC 알고리즘으로 도입했다는 점입니다. 그리고 자바 17의 특징은 Record Data Class라는 불변객체타입이 추가되었고, M1이상의 프로세서를 지원한다는 점입니다. 자바 17로 넘어가는 큰 이유는 Spring Boot 3.0이 자바 17이상 버전을 지원하기 때문입니다.
Q. JRE와 JDK의 차이는?
JRE는 Java Runtime Environment로 자바 실행환경을 위한 JVM과 라이브러리, 바이너리 파일을 포함합니다. 하지만 단지 실행환경이기 때문에 Compiler나 디버거 등의 도구는 가지고 있지 않습니다. 반면 JDK는 Java Development Kit로 자바 개발을 위해 필요한 JRE뿐만 아니라 javac, javadoc, jar등 개발에 필요한 여러 도구들이 포함되어 있습니다.
Q. GraalVM이란?
GraalVM프로젝트의 결과물로 더 빠르게 컴파일하고 JVM에서 지원하는 언어의 성능 향상을 위해 만들어진 JVM이나 JDK입니다. 빠른 성능의 자바로 작성된 JIT 컴파일러, 네이티브 실행 파일 빌드를 위한 AOT 컴파일러, 다국어 지원을 합니다. 어플리케이션 전체의 실행 없이도 자바와 JVM 지원 언어를 실행할 수 있습니다. 또한 AOT 컴파일러를 통해 자바 언어를 기계어로 미리 컴파일하면서 실행시간을 단축시킵니다. 이는 초기 JIT 컴파일러가 최적화가 되지 않은 시점에서 빠른 동작에 유리합니다.