운영체제나 하드웨어에 의존하지 않도록 설계된 객체 지향 언어
Modifier | Class | Package | Subclass | World |
---|---|---|---|---|
public | Y | Y | Y | Y |
protected | Y | Y | Y | N |
default | Y | Y | N | N |
private | Y | N | N | N |
class OuterClass {
...
class InnerClass {
...
}
static class StaticNestedClass {
...
}
}
집약성과 코드 가독성을 위해, 클래스 안에 클래스를 선언하는 표현
하나의 메소드만을 갖는 익명 클래스를 간단히 정의하기 위한 표현
ContainingClass::staticMethodName
: static 메소드 참조containingObject::instanceMethodName
: 인스턴스 메소드 참조ContainingType::methodName
: 특정 타입의 임의 객체 메소드 참조ClassName::new
: 클래스의 생성자 참조java.util.function
)Function
: 인자와 반환 값을 가짐Consumer
: 인자만을 가지며 void를 반환함Predicate
: 인자를 가지며 boolean을 반환함Supplier
: 인자가 없고 반환 값만을 가짐@FunctionalInterface
: 인터페이스가 람다로 활용되기 위해, 단일 메소드만 갖도록 강제하는 애너테이션상수를 미리 정의하기 위한 열거형 데이터 타입
프로그램에 대한 데이터를 제공하는 메타데이터 표현
추상 클래스와 인터페이스는 모두 인스턴스화 할 수 없고, 구현이 없는 메소드를 정의할 수 있음
원시 타입을 감싸는 클래스
문자열을 효율적으로 생성하는 클래스
파라매트릭 다형성을 Type-safe하게 다루기 위한 표현
<T extends B1 & B2 & B3>
인자 타입의 형식을 제한하기 위한 표현
extends
키워드로 상한(upper bound)을 제한함 (특정 타입을 부모로 갖도록 강제)
Generic 코드에서, 알 수 없는 타입을 정의하기 위한 표현
public static double sumOfList(List<? extends Number> list) { /* ... */ }
List<Double> ld = Arrays.asList(1.2, 2.3, 3.5);
System.out.println("sum = " + sumOfList(ld));
? extends T
형식으로, 인자 타입의 상한(upper bound)을 정하기 위한 표현
public static void printList(List<?> list) {
for (Object elem: list)
System.out.print(elem + " ");
System.out.println();
}
?
형식으로, 인자 타입의 상한을 Object로 정하기 위한 표현
public static void addNumbers(List<? super Integer> list) {
for (int i = 1; i <= 10; i++) {
list.add(i);
}
}
? super S
형식으로, 인자 타입의 하한(lower bound)을 정하기 위한 표현
메소드 내 오류를 반환하고 처리하기 위한 객체
Catch or Specify Requirement
를 항상 만족해야 함Catch or Specify Requirement
를 만족할 필요 없음Error
와 RuntimeException
이 해당함Catch or Specify Requirement
: 예외를 try
문으로 잡거나, 메서드 정의에 throws
문으로 명시해야 함데이터가 이동하는 I/O 작업을 추상화한 클래스들 (e.g. InputStream
, OutputStream
)
Serializable
인터페이스를 구현한 객체를 대상으로 함파일 시스템을 추상적으로 다루기 위한 API
Path
: 파일을 식별하는 경로 클래스File
을 대체함Files
: 파일과 디렉토리의 읽기와 쓰기, 조작 기능을 지원하는 클래스FileSystem
: 파일 시스템을 추상화한 클래스자바의 스레드를 표현하는 클래스
Thread.sleep(long)
: 일정 시간동안 스레드 대기Thread.join()
: 스레드가 끝날 때까지 현재 스레드 대기Thread::invoke()
메소드로 스레드를 중단함InterruptedException
을 catch하거나, Thread.interrupted()
로 인터럽트 발생 여부를 확인해야 함
스레드가 갖는 상태
NEW
: 스레드가 시작하지 않은 상태RUNNABLE
: JVM이 스레드를 실행하는 상태BLOCKED
: 스레드가 잠금을 획득하기 위해 기다리는 상태WATINIG
: 스레드가 다른 스레드를 기다리는 상태 (wait()
이후 notify()
를 기다림)TIMED_WAITING
: 타임아웃을 갖고 다른 스레드를 기다리는 상태TERMINATED
: 스레드가 종료된 상태자바에서 멀티스레딩 시 동기화를 위한 방법들
synchronized
메소드: 해당 객체를 잠궈 원자성을 지킴 (intrinsic locking)synchronized
블록: 특정 객체를 잠궈 원자성을 지킴 (intrinsic locking)Lock
인스턴스: tryLock()
메소드를 통해 잠금을 시도할 수 있음BlockingQueue
: 가득 찬 큐에 원소를 넣을 때, 혹은 빈 큐에서 원소를 꺼낼 때 Blocking하는 큐ConcurrentMap
: 원자적인 메소드들을 메소드들을 제공하는 MapAtomicInteger
, AtomicReference
)ThreadLocal
: 스레드마다 하나의 변수를 갖도록 하는 래퍼 클래스비동기 작업을 추상적으로 실행하기 위한 인터페이스
ExecutorService
: Executor를 상속하며, 작업의 life cycle을 관리하는 기능을 지원함ScheduledExecutorService
: ExecutorService를 상속하며, 작업을 주기적으로 실행 기능을 지원함Executors
: Executor를 생성하는 팩토리 메소드를 지원함newFixedThreadPool(int)
: 고정 크기의 스레드 풀 생성newCachedThreadPool()
: 가변 크기의 스레드 풀 생성 (단기 작업을 많이 수행할 때 활용)newSingleThreadExecutor()
: 단일 스레드로 작동하는 Executor 반환
여러 자료 구조를 추상화된 인터페이스와 함께 제공하는 프레임워크
중복을 허용하지 않고, 순서가 없는 자료 구조 (내부적으로 Map을 활용하여 구현)
HashSet
: 해시 테이블을 통한 구현TreeSet
: 트리를 통해 정렬을 보장하는 구현 (SortedSet
)LinkedHashSet
: 해시 테이블과 연결 리스트를 통한 구현 (원소의 순서를 삽입 순으로 유지)EnumSet
: 배열을 통해 Enum에 최적화된 구현CopyOnWriteArraySet
: 배열 복사로 원소 수정에 대응하는 배열을 통한 구현 (잠금 없이 thread-safe)중복을 허용하고, 순서를 갖는 자료 구조
ArrayList
: 가변 배열을 통한 구현LinkedList
: 연결 리스트를 통한 구현CopyOnWriteArrayList
: 배열 복사로 원소 수정에 대응하는 배열을 통한 구현 (잠금 없이 thread-safe)FIFO 방식으로 작동하는 자료 구조
LinkedList
: 연결 리스트를 통한 구현PriorityQueue
: 우선순위 큐를 통한 구현BlockingQueue
: push 혹은 pop이 불가능한 상황에 Blocking하는 큐 인터페이스 (큐 크기를 고정할 수 있음)LinkedBlockingQueue
: 연결 리스트를 통한 구현head
와 tail
)로 분산해 처리율이 비교적 높음ArrayBlockingQueue
: 고정 크기 배열을 통한 구현PriorityBlockingQueue
: Blocking이 적용된 우선순위 큐 구현DelayQueue
: 우선순위 큐로 스케줄을 관리하는 구현SynchronousQueue
: 원소 삽입과 제거가 서로 Blocking하는 구현중복을 허용하고, 순서를 갖는 자료 구조
ArrayDeque
: 가변 배열을 통한 구현LinkedList
: 연결 리스트를 통한 구현LinkedBlockingQueue
: 빈 큐에서 원소를 꺼낼 때 Blocking하는 구현key-value 쌍의 원소를 다루는 자료 구조
HashMap
: 해시 테이블을 통한 구현 (Self-balancing BST를 통한 Separate chaining 방식)TreeMap
: 트리를 통해 정렬을 보장하는 구현 (SortedMap
)LinkedHashMap
: 해시 테이블의 원소를 연결 리스트로 관리하는 구현 (원소의 순서를 삽입과 접근 순으로 유지)EnumMap
: 배열을 통해 Enum에 최적화된 구현ConcurrenthMap
: 원자적인 메소드들을 제공하는 Map 인터페이스ConcurrentHashMap
: 해시 테이블을 통한 구현Collections.synchronized
: 동기화가 적용된 컬렉션 래퍼 반환 (intrinsic locking)Vector
나 Hashtable
등의 레거시 컬렉션에 비해, 더 완성도 있는 스레드 안정성을 보장함Collections.unmodifiable
: 불변성이 적용된 컬렉션 래퍼 반환Collections.checked
: 컬렉션을 원하는 타입으로 checked 형변환하여 반환Arrays.asList
: 배열로 불변 List 생성Collections.nCopies
: n개의 특정 원소로 이루어진 불변 컬렉션 생성Collections.singleton
: 1개의 특정 원소로 이루어진 불변 Set 생성Collections.empty
: 비어 있는 불변 컬렉션 생성컬렉션에 대한 파이프라이닝 명령을 추상적으로 처리하는 API
reducing
: 새로운 값을 만드는 말단 명령 (e.g. average
, sum
, min
, max
, count
)collecting
: 존재하는 값을 수정하는 말단 명령 (e.g. 처리 결과를 담은 컬렉션 생성)런타임 환경에서 수행할 수 있는 매우 확장적인 기능을 제공하는 API
데이터베이스의 테이블에 접근하기 위한 API (Java Database Connectivity)
DriverManager
: JDBC Driver에 연결하기 위한 클래스DataSource
: Connection을 위해 데이터베이스를 추상화한 클래스Connection
: JDBC 연결을 추상화한 클래스Statement
: 데이터베이스에 전송되는 SQL을 추상화한 클래스PreparedStatement
: 효율적으로 실행하기 위해 미리 캐싱하는 Statement데이터베이스 커넥션 풀 (Database Connection Pool)
Connection
의 생성 비용을 줄이기 위한 방법Connection
을 생성하기 위해서는 JDBC Driver에 요청해야 함Connection
을 생성하고 닫는 일은 비효율적임FastList
, ConcurrentBag
등