Java
Java 스레드(Thread), 동기화(synchronized), 스레드풀(ThreadPool) 완벽 이해하기
프로그램 / 프로세스 / 스레드프로그램(Program)은 컴퓨터에 저장된 실행파일이고, 프로세스는 컴퓨터에서 실행 중인(CPU에 올라간) 프로그램입니다. 이런 프로세스 작업을 스레드 단위로 작업을 할 수 있습니다. 즉, 스레드를 사용함으로써 하나의 프로세스에서 두 가지 이상의 작업을 동시에 실행할 수 있습니다. 이를 멀티 스레드라고 합니다. 멀티 프로세스와 멀티 스레드의 차이는 무엇일까요? 1. 멀티 프로세스이름 그대로 여러 프로세스를 사용하여 처리하는 방식입니다. 여러 개의 프로세스들은 동시에 실행되는 거처럼 보이지만 사실은 매우 빠르게 돌아가면서 실행되고 있습니다. 하나의 프로세스가 CPU 위에서 돌고 있고, 다른 프로세스가 실행된다면, 기존에 실행되던 프로세스는 준비 상태가 됩니다. 마찬가지로 다른..
Java Enum 완벽 이해하기: 상수 관리를 위한 도구
Enum이란?제목에 Enum은 상수 관리를 위한 도구라고 지었습니다. 사실 Enum은 단순한 상수를 관리하는 도구를 넘어서, 타입 안정성과 가독성을 보장하는 방식으로 객체 지향적으로 상수를 관리하는 해결책입니다. 이에 관한 설명을 하기 위해서 Enum이 도입되기 전 상수가 어떻게 정의되었었는지 알아보겠습니다. 과거에는 어떻게 상수를 정의했을까?1. final 키워드를 이용한 상수자바에서 상수를 정의하는 가장 전통적인 방법은 final 키워드를 사용하는 것입니다. 이는 변수를 상수로 만들어 한 번 초기화되면 변경되지 않도록 보장하는 방식입니다. 여기에 static을 함께 사용하여 클래스 로드 시 한 번만 메모리에 할당되게 만들어 효율성을 높일 수 있습니다.public class Constants { ..
Java 제네릭(Generic) & 와일드카드 완벽 이해하기
제네릭이란?제네릭이란 클래스나 메서드 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법입니다. 제네릭을 통해 다양한 타입을 처리할 수 있습니다. 제네릭을 사용하면 컴파일 타임에 타입을 지정할 수 있어, 타입 안정성이 보장되고, 형변환에 대한 부담이 줄어듭니다. 예시: 제네릭을 사용하지 않은 경우와 제네릭을 사용하는 경우 비교// 제네릭스를 사용하지 않은 경우List list = new ArrayList();list.add("Hello");list.add(123); // 문자열과 정수를 동시에 저장 가능, 타입 안정성 없음String str = (String) list.get(0); // 형변환 필요// 제네릭스를 사용하는 경우List list = new ArrayList();list.add("..
Java 멀티스레드 환경에서 Collection 사용: 동기화된 컬렉션과 Concurrent 컬렉션
동기화된 컬렉션자바의 기본적인 컬렉션 클래스들은(ArrayList, HashSet, HashMap 등) 싱글 스레드 환경에서 사용할 수 있도록 설계되었습니다. 때문에 이런 컬렉션 클래스들은 멀티 스레드 환경에서 안전하지 않기 때문에, 여러 스레드가 동시에 접근할 때 데이터 불일치나 비정상적인 동작이 발생할 수 있습니다. 이를 방지하기 위해 동기화된 컬렉션을 사용합니다. Java에서는 Collections 유틸리티 클래스에서 동기화된 컬렉션을 쉽게 생성할 수 있도록 여러 메서드를 제공합니다.Collections.synchronizedList() Collections.synchronizedSet() Collections.synchronizedMap()// 동기화된 ListList syncList = Coll..
Java 컬렉션 프레임워크 완벽 이해하기
Java 컬렉션 프레임워크는 데이터를 효율적으로 저장하고 관리하기 위한 구조와 인터페이스의 집합입니다. 여러 데이터 구조를 제공하여 데이터를 다루기 쉽게 만들어주기 때문에 Java 개발 시 알아두어야 합니다. 컬렉션 프레임워크 계층도Iterable 인터페이스Iterable은 Java에서 반복 가능한 객체를 나타내는 최상위 인터페이스로, 컬렉션이 요소들을 순차적으로 탐색할 수 있도록 정의한 인터페이스입니다. 컬렉션을 foreach로 사용할 수 있게 하는 것이 바로 이 인터페이스 덕분입니다.List fruits = Arrays.asList("Apple", "Banana", "Cherry");for (String fruit : fruits) { System.out.println(fruit); // App..
Java 날짜 및 시간 포맷 다루기. SimpleDateFormat, DateTimeFormatter, FastDateFormat
날짜와 시간을 문자열로 변환하거나, 문자열을 날짜와 시간 객체로 변환할 때 포맷을 지정해 줍니다. 이를 위해 Java에서는 여러 가지 포맷 클래스가 제공됩니다. 각 클래스는 기능, 성능, 스레드 안전성 등에 차이가 있기 때문에 적절하게 선택해주어야 합니다. 클래스스레드 안전성포맷팅파싱Java 버전SimpleDateFormatXOOJava 7 이하DateTimeFormatterOOOJava 8 이상FastDateFormatOOX모든 버전 SimpleDateFormat (Java 7 이하)simpleDateFormat은 Java 7 이하에서 많이 사용되던 날짜/시간 포맷 클래스입니다. 이는 스레드 안전하지 않다는 단점이 있어서, 멀티스레드 환경에서 사용할 때 주의가 필요합니다. Java 8에서 더 좋은 대안..
Java 날짜 시간 다루기: LocalDateTime, Instant, OffsetDateTime, ZonedDateTime의 차이. Duration, Period
Date와 Calendar를 사용하지 않는 이유?Java에서 날짜와 시간을 다룰 때, Calendar와 Date 대신 LocalDateTime을 사용합니다. LocalDateTime은 Java 8에서 도입된 java.time 패키지에 포함된 클래스로, Java 8 이전의 Date와 Calendar 클래스는 몇 가지 단점이 있었습니다.불변성 부족: Date와 Calendar는 setter가 존재하여 mutable(변경 가능) 하기 때문에, 날짜 객체를 공유할 때 상태가 변할 수 있어 멀티스레드 환경에서 오류가 발생할 가능성이 큽니다.복잡한 API, 가독성 문제:Date와 Calendar 클래스에서 1월을 0부터 표기하고, 요일을 지정할 때도 일관성이 없습니다. 또한 Date와 Calendar의 API는 복..
Java 예외 처리 완벽 이해하기
Java 예외 처리Java 프로그램이 실행 중 에러 또는 오류가 발생하면 프로그램이 예기치 않게 종료될 수 있습니다. 이러한 문제를 방지하기 위해 Java 프로그래밍에선 예외 처리를 해주는 것이 매우 중요합니다. 예외 처리를 통해 코드가 실행 중에 발생할 수 있는 오류를 처리함으로써, 애플리케이션이 갑작스럽게 종료되는 것을 방지하고 프로그램의 안정성을 높일 수 있습니다. 예외 계층 구조Java에서는 실행 시 발생할 수 있는 에러(error)와 예외(exception)를 클래스로 정의하였습니다. Java에서 에러(error)와 예외(exception)는 Throwable 클래스를 상속받는 객체입니다. 즉 Throwable 클래스를 상속받는 자식 클래스로 Error와 Exception 클래스가 있습니다.Er..