본문 바로가기

자바

(14)
java.util.ConcurrentModificationException 원인과 해결 Map 에서 특정 키에 대한 값을 제거하는 로직을 구현하는 경우가 있었다.그 과정에서 java.util.ConcurrentModificationException 에러를 만나게 되었다. 그래서 원인과 해결한 과정을 정리해보려고 한다.문제 상황Map map = new HashMap();map.put(1L, "item1");map.put(2L, "item2");Set keySet = map.keySet();for (Long key : keySet) { if (key == 1L) map.remove(key);}map.entrySet().stream().forEach(System.out::println);Exception in thread "main" java.util.ConcurrentModificatio..
자바 람다식 람다식함수를 간략하게 표현할 수 있는 표현 방식이다. 함수의 이름, 반환타입, 파라미터 타입을 생략할 수 있어 익명 함수의 한 종류라고 볼 수 있다.void print(int value) { System.out.println(value);}위의 함수를 람다식을 통해서 다음과 같이 표현할 수 있다.value -> System.out.println(value);반환값이 있는 함수들은 아래와 같이 변환할 수 있다.double pow(double base, double exponent) { return Math.pow(base, exponent);}(base, exponent) -> Math.pow(base, exponent); // return 생략 가능// or(base, exponent) -> { ..
자바 제네릭 제네릭이란?클래스나 인터페이스, 메소드를 선언할 때에 파라미터나 반환 타입을 고정해두지 않고 해당 클래스, 인터페이스를 사용할 때에 타입을 지정할 수 있는 기능을 말한다.즉, 하나의 클래스, 인터페이스 등으로 여러 타입을 지정하여 사용할 수 있도록 한다. 제네릭을 이용한 클래스, 인터페이스를 제네릭 타입이라고 칭한다.제네릭 사용 이유제네릭 이전에는 개발자가 컬렉션에서 객체를 꺼낼 때 타입 변환을 수동으로 해주었는 데 제네릭을 사용하면 그 수고를 하지 않아도 된다. 컴파일러가 타입을 이미 알고 있기 때문에 실수로 다른 타입으로 형변환하여 오류가 생기는 일을 미리 막아주어 객체 타입의 안정성을 높여준다. 또한 타입을 국한하기 때문에 매번 새롭게 타입 변환하지 않아도 돼서 성능상의 이점이 있다.제네릭 사용법제..
자바 I/O Stream / Buffer / Channel 기반의 I/OI/O 는 input, output 의 줄임말로써 줄여서 입출력이라고 한다. 콘솔창에서 입출력을 할 수도 있고, 파일 같은 곳에서도 입출력을 할 수도 있다.기본적으로 stream 기반으로 동작한다.Stream I/O데이터가 흐르는 통로이다. 바이트 단위로 데이터가 흐른다.FIFO(First-In-First-Out) 구조로 동작하며 양방향으로 동작하지 않는다. 즉, 입력할 때는 입력 stream, 출력할 때는 출력 stream을 사용해야 한다.하나의 stream 으로 입출력을 할 수 없다.Stream I/O 는 데이터 하나씩 처리하기 때문에 성능 이슈가 있다. 또한, 양방향 구조를 사용할 수 없는 특징도 있다.이러한 점들을 개선하기 위해 Buffe..
자바 애노테이션 프로세서 컴파일 타임에 애노테이션을 읽고 애노테이션에 해당하는 로직을 처리하는 기능을 한다. 예를 들면, 코드를 생성하거나 수정할 수 있다. 그래서, 애노테이션 프로세서를 잘 사용하면 개발하는 데에 이점이 있다. 애노테이션만 적당히 잘 사용하면 반복적인 코드 작성을 줄일 수 있기 때문이다. 대표적으로, lombok 같은 라이브러리가 있다. 이제 lombok 같은 라이브러리를 한 번 만들어보자. 다음의 코드가 있다고 해보자. public interface Book { @Deprecated default String getCategory() { return "book"; } } @Collection(category = "novel") public interface Novel extends Book { } 내가 하고자..
자바 애노테이션 1. 자바 애노테이션 애노테이션은 주석이라는 의미를 가진다. 정식 코드는 아니고 메타 정보를 나타낸다. JDK 1.5 버전부터 사용 가능하고, 아래 예시처럼 @ + ‘애노테이션 이름’ 을 붙여서 사용한다. public class PoetryBook extends Book { @Override // @ 기호를 붙여서 사용한다. public String getCategory() { return "poetry"; } } 2. 애노테이션 종류 2-1. 내장 애노테이션 @Override 해당 메소드가 오버라이드된 메소드라는 것을 나타낸다. 상위 클래스에 해당 메소드가 없다면 컴파일 에러가 발생한다. public class PoetryBook extends Book { // Book 클래스에 getPrice 메소드..
Enum enum 정의하는 방법 enum 이란? 열거형 타입을 의미한다. 특정 값만 들어올 수 있도록 하기 위해서 사용한다. (type-safe) 다음과 같이 기본적인 정의를 할 수 있다. enum WEEK { MONDAY,TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } enum 내부에서 변수 선언이나 함수 등을 선언할 수 있다. 아래와 같이 변수 선언을 할 수 있고 enum 이 생성될 때 값을 초기화해 줄 수 있다. public enum WEEK { MONDAY(true), TUESDAY(true), WEDNESDAY(true), THURSDAY(true), FRIDAY(true), SATURDAY(false), SUNDAY(false), ; @Getter..
멀티쓰레드 프로그래밍 1. Thread 클래스와 Runnable 인터페이스 쓰레드란? 프로그램의 실행의 최소 단위이다. 쓰레드를 생성 및 실행하는 방법이 크게 두 가지가 있다. 1-1. Thread 클래스 자바에서 Thread 클래스를 이용하여 스레드 생성 및 관리를 할 수 있다. Thread 클래스를 상속받고, run 메소드를 오버라이딩하면 된다. public class ThreadImpl extends Thread { @Override public void run() { System.out.println("new thread with Thread"); } } public static void main(String[] args) { Thread thread = new ThreadImpl(); thread.start(); }..
예외처리 자바에서 예외 처리 방법 (try, catch, throw, throws, finally) try/catch exception이 발생했을 때, 따로 처리하고 싶을 때 사용한다. 아래와 같이 사용할 수 있다. try { System.out.println("here is try block"); // 예외가 발생할 만한 블락 // 예외를 잡아서 처리하고 싶은 부분 } catch (RuntimeException e) { // 해당하는 예외가 발생했을 경우 // RuntimeException 에 대한 예외 처리 } catch (Exception e) { // Exception 에 대한 예외 처리 } // multi catch 문은 위에서부터 작은 exception 을 선언해야 한다. // 아래로 갈수록 범위가 큰..
자바 패키지 package 클래스와 인터페이스의 리스트를 포함한다. 다음의 종류가 있다. Interfaces Classes Enums Exceptions Errors Annotation Types package 키워드 파일의 위치를 나타낸다. “.” 을 구분자로 사용한다. 아래와 같이 표현될 수 있다. me 라는 package 밑에 skrew 라는 패키지 밑에 javademostudy 패키지 밑에 이 JavaDemoStudyApplication 클래스 파일이 존재한다는 것을 나타낸다. 일반적인 파일 시스템처럼 클래스 파일의 위치를 나타내는 역할을 한다. package me.skrew.javademostudy; public class JavaDemoStudyApplication {} package 키워드를 사용함으로써..