Open
Description
java의 리플렉션이란
- 자바에서 이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩(Dynamic Loading)하여 생성자(Constructor), 멤버 필드(Member Variables) 그리고 멤버 메서드(Member Method) 등을 사용할 수 있는 기법이다.
- 클래스의 패키지 정보, 접근 지정자, 수퍼 클래스, 어노테이션(Annotation) 등을 얻을 수 있다.
- 컴파일 시간(Compile Time)이 아니라 실행 시간(Run Time)에 동적으로 특정 클래스의 정보를 객체화를 통해 분석 및 추출해낼 수 있는 프로그래밍 기법이다.
Stream이란
- 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다.
- 선언형이란 데이터를 처리하는 구현 코드 대신, 질의로 표현하는 것이다.
- 또한 멀티 스레드로 구현하지 않아도 데이터를 투명하게 병렬적으로 수행할 수 있다.
특징
- 파이프라이닝
- 대부분의 스트림 연산은 스트림 연산끼리 커다란 파이프라인을 구성하기 위해 자신을 반환한다.
- 덕분에 laziness, short-circuiting 등과 같은 최적화를 얻을 수 있다.
- 내부 반복
- 반복자를 이용해서 명시적으로 반복하는 컬렉션과 달리 스트림은 내부 반복을 지원한다.
Java8의 특징
- Java8에서는 Lambda식, Stream API, Optional, 날짜 시간 API, StringJoiner 등이 추가되었습니다.
- lambda는 함수형 프로그래밍을 지원하기 위한 기능이고, Stream API는 고차함수를 지원합니다. Optional은 Null-safety를 제공하며, Stream과 사용법이 유사합니다. 날짜 시간 API는 Joda-time등의 라이브러리에서 영향을 받아 괜찮은 API가 되었으며, StringJoiner는 문자열을 간단하게 구분자로 합칠 수 있는 기능을 제공합니다.
HashMap과 HashTable의 차이
- 가장 큰 차이는 Thread-safe
- HashTable의 모든 데이터 변경 메소드는 sycronized로 선언되어있음. 메소드 호출 전 스레드 간 동기화 락을 통해 멀티 스레드 환경에서 데이터의 무결성을 보장.
- HashMap은 Thread-safe 하지 않기때문에 멀티 스레드 환경에서 동시에 데이터를 조작하는 경우 데이터가 깨질 수 있음
- 동기화가 필요하다면, ConcurrentHashMap 사용. HashTable은 구형버전이기에 HashMap에 비해 느림.
HashSet
- 객체 그 자체를 저장
- 중복된 값을 허용하지 않고, 저장한 순서가 보장되지 않음
컬렉션 프레임워크에 대해서 설명해주세요.
- Java Collection은 널리 알려져 있는 자료구조를 바탕으로 객체, 데이터들을 효율적으로 관리 할 수 있는 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 합니다.
- List, Set은 Collection 인터페이스을 상속받지만, Map 인터페이스는 구조상의 차이라 별도로 정의합니다.
List, Set, Map의 특징
- List 인터페이스 (순서 O, 중복 O)
- Set 인터페이스 (순서X, 중복X)
- Map 인터페이스 (순서X, 중복 키 X / 중복 데이터 O)
Generic이란
- 데이터의 타입을 클래스 내부에서 지정하지 않고 외부에서 사용자에 의해 지정되는 것이다.
- 보통 하나하나의 타입에 따라 클래스를 생성하는 것이 비효율적일 때 사용한다.
- 제네릭을 적용하고 잘못된 타입이 지정되면 컴파일 단계에서 방지할 수 있다.
- 클래스 외부에서 타입을 지정하기 때문에 타입 관리가 편하다.
- 비슷한 기능을 하는데 타입만 다른 경우 코드의 재사용성이 높아진다.
super와 extends의 차이와 와일드 카드
extends T
는 상한 경계이고? super T
는 하한 경계이다.- extends는 T와 T의 자손 타입만 가능
- super는 T와 T의 조상 타입만 가능
- 와일드카드
<?>
은 Java 최상위 타입인 Object와 같으므로 어떤 타입이든 지정할 수 있다.
Default 메소드와 static 메소드
Interface
- abstract method
- 구현부가 없는 메소드
- default method (Java 8 이후 추가)
- 인터페이스를 상속한 구현체에 공통으로 들어갈 코드를 default method 에 작성해 반복을 줄임
- equals(), hashCode() 같은 Object의 메소드 정의한건 디폴트 메소드로 제공 불가
- 구현체에서 오버라이딩 가능
- static method (Java 8 이후 추가)
- default method 처럼 인터페이스에서 구현 가능
- 구현체에서 오버라이딩 불가능
- static 이니까 Class.method()로 호출 가능. 객체에서 호출도 가능
인터페이스와 추상클래스의 차이점에 대해 설명해주세요.
- 추상클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용합니다. 단일 상속만 가능합니다. 추상클래스를 상속하는 집합간에는 연관관계가 있습니다.
- 인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용합니다. 다중 상속이 가능합니다. 인터페이스를 구현하는 집합간에는 관계가 없을 수 있습니다.
왜 클래스는 단일 상속만 가능한데, 인터페이스는 2개 이상 구현이 가능할까요?
- 다중 상속 시 충돌 문제**,** 어느 부모의 메서드를 상속받아야할 지 파악할 수 없게 됨
- 다이아몬드 문제 - 다중 상속을 지원하게 되면 하나의 클래스가 여러 상위 클래스를 상속받을 수 있다. 이런 특징 때문에 발생하게 되는 문제가 '다이아몬드 문제’
- 즉 선언된 형태의 메서드만 가지는 인터페이스는, 동일 시그니처의 메서드를 얼마든 상속받아도 아무런 문제가 발생하지 않음
동기화 클래스
CountDownLatch
- Latch의 사전적 의미는 걸쇠이다.
- 원하는 지점에서 await() 메서드를 호출하고 코드의 진행을 중단시킨다.
- 다른 스레드에서 설정한 횟수만큼 countDown() 메서드를 호출하면 다시 코드를 진행한다.