Java
104 posts
[Java] Stream.concat(), 스트림 합치기

Java 스트림(Stream)에서 은 두 개의 스트림 a와 b를 연결하여 새로운 스트림을 리턴합니다. 리턴된 새로운 스트림은 스트림 a와 b가 갖고 있는 모든 요소들을 발생시킵니다. Stream.concat() 예제1. 두개의 스트림을 하나의 Stream으로 연결 예제 2. 3개의 Stream을 하나의 Stream으로 연결 예제 3. Stream을 합치면서 중복 요소는 제거 예제 4. 병렬 Stream을 concat()으로 합치기 Stream.concat() 아래와 같이 두개의 Stream a와 b를 인자로 받습니다. 리턴 값은 a와 b가 합쳐진 새로운 Stream을 리턴합니다. 예제1. 두개의 스트림을 하나의 Stream으로 연결 아래 예제는 과 를 연결하여 새로운 스트림을 리턴합니다. 합쳐진 의 요소들을 출력해보면 두개의 스트림의 모든 요소들이 출력되는 것을 볼 수 있습니다. Output: 예제 2. 3개의 Stream을 하나의 Stream으로 연결 2개 보다 많은 Stream…

[Java] Stream Optional 개념/예제

Optional은 Java Stream과 함께 도입된 컨셉이며, 어떤 이유로 사용하는지 개념과 예제를 소개합니다. Stream Optional Optional 객체 생성 Optional.isPresent() : non-null 값을 갖고 있는지 확인 Optional.orElse() : null 객체에 대한 기본 값 Optional.orElseGet() : 함수 결과를 기본값으로 Optional.orElseThrow() : 기본 값 대신에 Exception 발생 Stream Optional Optional은 어떤 객체를 보관하는 컨테이너 클래스이며, null 체크 같은 간단한 기능을 제공합니다. Optional 객체는 non-null(null이 아닌) 객체이지만, 대신 어떤 값을 갖고 있는데 그 값이 null일 수 있고, 또는 null이 아닐 수 있습니다. 기존엔 객체에 대한 null check 코드를 직접 구현하고 예외처리를 했다면, Optional은 이런 기본적인 기능과 예외처리…

[Java] 스레드 setPriority() 우선순위 설정

Java 스레드의 우선순위(Priority)에 대해서 설명하고, 함수를 이용하여 우선순위를 변경하는 방법에 대해서 알아보겠습니다. 1. Thread 우선순위(Priority) 2. Thread 우선순위 확인 3. Thread 우선순위 변경 1. Thread 우선순위(Priority) 스레드 우선순위(Thread Priority)는 스레드 스케줄링에 사용되는 개념입니다. 스레드 스케줄링은 여러 스레드가 동시에 실행될 때 어떤 스레드가 얼마나 자주 실행되는지 결정하는 것인데요, 스레드 우선순위가 높으면 스레드 스케줄링 알고리즘에 의해 다른 스레드보다 자주 실행됩니다. 반대로 우선순위가 낮으면, 다른 스레드보다 적게 실행됩니다. Thread의 우선순위의 범위는 1부터 10이며, 숫자가 높으면 우선순위가 높아서 더 자주 스케줄링이 됩니다. Thread 클래스는 기본적으로 Min, Normal, Max Priority 값에 대한 상수를 제공합니다. Thread.MIN_PRIORITY = …

[Java] Try with resources로 여러 파일 열기/닫기

Try with resources는 파일을 사용하고 자원을 해제할 때, 명시적으로 해제하지 않아도 자동으로 해제해줍니다. 이 방식은 파일을 읽을 때 자원 해제 코드를 따로 구현해줄 필요가 없어서 자주 사용하고 있습니다. 이 글에서 구문을 사용하는 이유와, 여러 파일을 동시에 사용하는 방법에 대해서 알아보겠습니다. 1. try-with-resources가 없을 때 발생하는 일 만약 를 사용하지 않으면, 아래 예제처럼 구분을 사용하여 파일을 열고 닫아야 합니다. BufferedReader로 파일 열었으면, 꼭 닫아줘야 함 일반적으로 try에서 파일을 열면 finally 구문에서 를 호출하여 파일을 닫음 파일을 닫을 때 try-catch로 IOException의 예외 처리를 추가해야해서 코드가 길어짐, 또한 실수로 파일 닫는 것을 잊어먹을 수 있음 2. try-with-resources로 파일 1개 열기 다음과 같이 를 사용하여 위의 예제를 다시 구현해보았습니다. 의 구문이 끝날 때…

[Java] 현재 프로젝트 경로 가져오는 방법

현재 프로젝트의 파일 경로, 즉, 작업 디렉토리(Working directory)의 패스를 코드로 가져오는 방법에 대해서 알아보겠습니다. 1. System 프로퍼티를 이용한 방법 2. File을 이용한 방법 3. Paths를 이용한 방법 1. System 프로퍼티를 이용한 방법 시스템 프로퍼티는 현재 작업 경로가 저장되어있습니다. 아래와 같이 시스템 프로퍼티를 통해 작업 디렉토리를 가져올 수 있습니다. Output: 2. File을 이용한 방법 처럼, 현재 디렉토리에 대한 파일을 상대 경로로 생성할 수 있습니다. 생성된 파일의 경로가 현재 작업 디렉토리 경로와 같습니다. Output: 3. Paths를 이용한 방법 File과 같은 방식으로, 현재 경로에 대한 Path를 생성하고 그 패스를 가져오면 작업 디렉토리를 구할 수 있습니다. Output:

[Java] JSON 파일 생성, 저장 방법

Java에서 라이브러리를 사용하여 JSON 형식의 파일을 생성, 저장하는 방법에 대해서 알아보겠습니다. 1. org.json 라이브러리 2. key-value 구조의 JSON 생성 및 파일 저장 3. 배열을 갖고 있는 JSON 생성 및 파일 저장 4. 좀 더 복잡한 JSON 생성 및 파일 저장 1. org.json 라이브러리 이 글에서는 라이브러리를 사용하여 JSON 데이터 생성 및 파일을 저장합니다. 예제를 소개하기 전에, Maven 또는 Gradle 프로젝트에서 라이브러리를 사용하려면 아래 내용을 참조하여 설정하시면 됩니다. 라이브러리 설정 (Maven 프로젝트) 라이브러리 설정 (Gradle 프로젝트) 2. key-value 구조의 JSON 생성 및 파일 저장 가장 간단한 값들을 갖고 있는 JSON 파일을 생성하는 예제입니다. 에 함수로 key-value 값들을 추가 으로 데이터를 JSON 형식의 문자열로 변환 FileWriter를 통해 JSON 문자열을 파일로 저장…

[Java] 문자열 첫번째 문자 제거

문자열에서 첫글자, 첫번째 문자를 제거하는 방법에 대해서 알아보겠습니다. 1. substring()을 이용한 방법 2. StringBuilder를 이용한 방법 1. substring()을 이용한 방법 는 문자열에서 index부터 마지막까지 잘라서 리턴합니다. 즉, 첫번째 글자(index 0)만 제거된 문자열이 리턴됩니다. : 첫글자를 제거한 문자열을 다시 input 변수에 할당 Output: 2. StringBuilder를 이용한 방법 는 StringBuilder가 갖고 있는 문자열에서 index 문자를 제거합니다. : 첫글자(index 0) 제거 : StringBuilder가 갖고 있는 문자열을 String 객체로 리턴 Output:

[Java] 문자열 마지막 문자 제거

문자열에서 마지막 문자를 제거하는 방법에 대해서 알아보겠습니다. 1. String.substring()을 이용한 방법 2. StringBuilder.deleteCharAt()를 이용한 방법 1. String.substring()을 이용한 방법 는 문자열에서 index1부터 index2까지의 문자열을 잘라서 리턴합니다. 즉, 마지막 글자(length - 1)만 제거된 문자열이 리턴됩니다. : 마지막 문자가 제거된 문자열을 다시 input 변수에 할당 Output: 2. StringBuilder.deleteCharAt()를 이용한 방법 는 StringBuilder가 갖고 있는 문자열에서 index 문자를 제거합니다. : 마지막 글자(length - 1) 제거 : StringBuilder가 갖고 있는 문자열을 String 객체로 리턴 Output:

[Java] 문자열 왼쪽 0 제거, 3가지 방법

처럼 왼쪽이 0으로 채워진 문자열이 있을 때, 이 문자열을 제거하는 방법을 알아보겠습니다. 1. Integer.parseInt()를 이용한 방법 2. 정규표현식을 이용한 방법 3. substring()을 이용한 방법 1. Integer.parseInt()를 이용한 방법 문자열이 숫자로만 되어있다면 로 str을 int 타입으로 변환할 수 있습니다. int로 변환되면 왼쪽 0은 모두 제거되며, int를 다시 String으로 변환하면 왼쪽 0이 제거된 문자열을 얻을 수 있습니다. : int를 String으로 변환 Output: 2. 정규표현식을 이용한 방법 정규표현식으로 왼쪽에 있는 연속적인 0을 찾아서 제거할 수 있습니다. : 0으로 시작하는 연속적인 0 패턴 찾고, ""으로 변환하여 제거 replaceFirst는 문자열에 일치하는 패턴이 여러개라도 1개의 패턴만 다른 문자열로 변환함 패턴에서 는 문자열 시작을 의미, 는 앞의 패턴이 1개 이상 Output: 3. substrin…

[Java] 배열 크기 변경, 3가지 방법

배열의 크기(길이)를 동적으로 늘리는 방법에 대해서 알아보겠습니다. 사실 Java에서 배열의 크기를 늘리는 것은 기본적으로 불가능합니다. 배열의 크기는 생성 시 고정되기 때문입니다. 이런 이유로, 배열 크기를 변경하려면 새로운 배열을 생성하고, 기존 배열의 데이터를 복사해야 합니다. 1. Arrays.copyOf()를 이용한 방법 2. List를 이용한 방법 3. for문을 이용한 방법 1. Arrays.copyOf()를 이용한 방법 는 newSize 크기의 배열을 생성하고, array의 요소들을 새로운 배열에 복사합니다. 원본 배열의 크기보다 새로운 배열의 크기가 크면, 빈 공간은 0 또는 null로 채워집니다. 원본 배열의 크기보다 새로운 배열의 크기가 작으면, 새로운 배열의 길이만큼만 복사합니다. 아래와 같이 기본 배열보다 크기가 증가한, 또는 감소한 새로운 배열을 만들 수 있습니다. Output: 2. List를 이용한 방법 List는 동적으로 크기 증가, 감소가 가능한 자…

[Java] 문자열 마지막 콤마 제거

문자열의 마지막 문자가 콤마(”,“)인 경우, 이 문자를 제거하는 방법에 대해서 알아보겠습니다. 1. String.substring()을 이용한 방법 는 문자열에서 Index start에서 (end - 1)까지 범위의 문자열을 잘라서 리턴합니다. 다음과 같이 마지막 콤마 문자를 제거할 수 있습니다. : input 문자열의 마지막이 문자로 끝나면 true 리턴 : Index 0에서 Index (length -1) 이전 문자까지만 잘라서 리턴, 즉, 마지막 문자만 제거 Output: 2. StringBuilder.deleteCharAt()을 이용한 방법 는 StringBuilder가 갖고 있는 문자열에서 index의 문자를 제거합니다. : 문자열 마지막 Index(length - 1) 문자 제거 아래와 같이 마지막 문자열을 제거할 수 있습니다. Output: 3. 정규표현식을 이용한 방법 정규표현식을 이용하여 문자열의 마지막 문자가 인 경우를 찾을 수 있습니다. 그리고 을 이용…

[Java] 배열 역순(거꾸로) 변환 및 출력

배열의 요소 값 위치를 역순으로 변환하는 방법에 대해서 알아보겠습니다. 1. Collections.reverse()를 이용한 방법 2. for문을 이용한 방법 1. Collections.reverse()를 이용한 방법 는 list에 저장된 요소들의 순서를 반대로 변경합니다. 이것을 이용하여 다음과 같이 배열의 순서를 뒤집을 수 있습니다. : 배열을 리스트로 변환 : 리스트의 순서 뒤집기 : 리스트를 배열로 변환 Output: 2. for문을 이용한 방법 for문을 이용하여 아래와 같이 배열의 순서를 거꾸로 뒤집을 수 있습니다. 원본 배열의 마지막에서 앞으로 순회하면서, 다른 배열의 Index 0부터 끝까지 복사합니다. 이렇게 하면 역순으로 변환된 배열을 생성할 수 있습니다. Output:

[Java] 소수점 둘째자리까지 반올림, 4가지 방법

float 또는 double을 소수점 둘째자리까지 반올림하는 방법에 대해서 알아보겠습니다. 이것을 응용하여 소수점 n자리까지 반올림하도록 구현할 수 있습니다. 1. String.format()을 이용한 방법 2. Math.round()를 이용한 방법 3. DecimalFormat을 이용한 방법 4. BigDecimal을 이용한 방법 1. String.format()을 이용한 방법 처럼 숫자 number를 소수점 2자리까지 표시할 수 있습니다. 는 소수점 n자리까지 표시하며, n+1 자리에서 반올림 Output: 2. Math.round()를 이용한 방법 는 숫자 n을 반올림하여 정수로 만듭니다. 소수점 3자리 이상 있는 실수를 2자리까지 반올림하려면, 숫자에 100을 곱하고 로 반올림하고 다시 100으로 나누면 됩니다. 예를 들어, 이고, 이 됩니다. 다시 100으로 나누면 이 됩니다. Output: 3. DecimalFormat을 이용한 방법 : 소수 2자리까지 반올림하는 포…

[Java] 일정 시간 지난 후 코드 실행

일정 시간이 지난 후, 특정 코드를 실행시키는 방법에 대해서 알아보겠습니다. 1. Timer를 이용한 방법 2. Executors를 이용한 방법 1. Timer를 이용한 방법 특정 시간 후, 한번 실행 는 delay 시간 후에 TimerTask의 함수를 실행시킵니다. TimerTask는 람다식으로 전달할 수 있음 delay의 시간 단위는 ms 아래 예제는 5초 뒤에 함수가 실행됩니다. Output: 특정 주기로 반복 실행 는 delay 뒤에 TimerTask의 함수가 실행되며, 그 이후에 period 시간 주기로 반복 실행됩니다. 아래 예제는 5초 후에 처음 함수가 호출되며, 그 이후에 10초 간격마다 함수가 주기적으로 호출됩니다. Output: 2. Executors를 이용한 방법 특정 시간 후, 한번 실행 ScheduledExecutorService를 이용하여 특정 시간 후에 코드를 실행시킬 수 있습니다. 은 delay 후에 Runnable의 함수를 호출합니다. TimeUn…

[Java] Comparator로 문자열 정렬

Java에서 Comparator로 문자열 리스트를 정렬할 수 있습니다. Comparator는 어떻게 정렬할지에 대한 내용이 구현되어있는 객체입니다. 이 객체를 리스트의 함수에 전달하면 Comparator의 규칙에 맞게 정렬됩니다. Comparator 는 함수형 인터페이스이고, 메소드를 갖고 있습니다. 는 인자 o1과 o2 객체를 비교하고 결과를 리턴 비교 결과는 음수, 0, 양수 중에 하나이며, 각각 의미는 다음과 같습니다. 비교 결과로 리스트를 정렬을 할 수 있습니다. 음수 : o1이 o2보다 작음 0 : o1과 o2와 같음 양수 : o1이 o2보다 큼 Comparator는 다음과 같이 구현하여 사용할 수 있습니다. 클래스 파일을 만들고 구현을 추가할 수 있지만, 1회성으로 사용된다면 익명 클래스나, 람다식 또는 메소드 레퍼런스로 구현하여 인자로 전달함 대신에 를 사용할 수도 있음 Comparator로 문자열 리스트 정렬 아래 예제는 Comparator를 구현하여 문자열 리…

[Java] 배열 n개씩 나누기, 2가지 방법

하나의 배열을 n개의 배열로 잘라서 나누는 방법에 대해서 알아보겠습니다. 1. for문으로 직접 나누는 방법 분할할 배열 개수만큼 for문으로 돌면서, 기존 배열의 값을 새로운 배열에 분리해서 나눌 수 있습니다. : 새로운 배열의 크기 : n개로 나누고 남은 개수는 remainder에 저장하고, 배열에 나누서 할당 for문으로 원본 배열을 순회하면서, n개 또는 n+1개의 새로운 배열을 할당하고 값 복사 : originalArray의 startIndex에서 개수만큼 subArray의 Index 0부터 복사 분리된 배열의 길이가 같거나, remainder에 의해 1개 차이가 있을 수 있음 Output: 2. Stream을 이용한 방법 Stream과 Collectors.groupingBy()를 이용하여 여러 배열로 분리할 수 있습니다. 대신, 위에서 순차적으로 고정된 개수로 자르는 것이 아닌, 요소 값에 따라서 정해진 그룹으로 분리됩니다. : 의 값이 같은 것들끼리 그룹을 만…

[Java] List filter 예제, 3가지 방법

리스트에 저장된 요소들을 특정 기준으로 필터링하는 방법 및 예제를 소개합니다. 1. Stream.filter()를 이용한 방법 2. for문을 이용한 방법 3. List.removeIf()를 이용한 방법 1. Stream.filter()를 이용한 방법 리스트를 Stream으로 변환할 수 있으며, 으로 리스트의 요소들을 필터링할 수 있습니다. : 리스트 numbers를 Stream으로 변환 : 짝수인 요소만 필터링 : Stream 결과를 리스트로 변환 Output: Stream과 메소드 레퍼런스를 이용한 방법 위 예제에서 에 람다식을 전달하지 않고, 아래와 같이 메소드 레퍼런스를 전달할 수도 있습니다. 실행 결과는 동일합니다. 2. for문을 이용한 방법 다음과 같이 for문을 이용하여 리스트를 순회하면서 필터링할 수 있습니다. 필터링된 요소들은 다른 리스트에 저장합니다. Output: 3. List.removeIf()를 이용한 방법 리스트에서 특정 조건에 해당하는 요소들을 모…

[Java] List for문으로 탐색/순회

Java에서 for문을 이용하여 리스트를 탐색, 순회하는 방법에 대해서 알아보겠습니다. 1. for문을 이용한 방법 2. 향상된 for문을 이용한 방법 3. Iterator를 이용한 방법 4. Stream을 이용한 방법 5. Java 8의 forEach를 이용한 방법 1. for문을 이용한 방법 기본적인 for 루프입니다. for문에서 index를 리스트 크기까지 증가시키면서 리스트의 모든 요소를 순회합니다. : 인자로 전달된 객체들을 갖고 있는 리스트 생성 Output: 2. 향상된 for문을 이용한 방법 와 같은 형태를 향상된 for문이라고 합니다. 리스트의 모든 요소들이 순회하면서 fruit에 대입됩니다. 만약 index가 필요하다면 일반적인 for문을 사용해야 합니다. Output: 3. Iterator를 이용한 방법 리스트의 Iterator 객체를 얻고, Iterator를 통해서 리스트의 모든 요소를 순회할 수 있습니다. 아래 예제는 while을 사용하여 Iterato…

[Java] 리스트 랜덤 정렬, 3가지 방법

리스트의 요소들 순서를 랜덤으로 정렬하는 방법에 대해서 알아보겠습니다. 1. shuffle()을 이용한 방법 2. for문으로 직접 구현하는 방법 3. Stream을 이용한 방법 1. shuffle()을 이용한 방법 는 list의 요소들을 무작위로 섞습니다. 아래와 같이 리스트를 랜덤하게 정렬시킬 수 있습니다. Output: 2. for문으로 직접 구현하는 방법 아래 예제는 for문을 이용하여 shuffle을 구현하였습니다. Random을 이용하여 루프를 돌면서 무작위 수를 뽑고, 리스트의 값들을 변경하였습니다. : 0 ~ i 범위의 랜덤 숫자(index) 뽑음 리스트의 끝에서 앞으로 순회하면서 랜덤하게 swap Output: 3. Stream을 이용한 방법 아래와 같이 를 이용하여 랜덤하게 요소들을 정렬할 수 있습니다. : 0에서 3미만의 숫자 중에 랜덤하게 뽑음, 즉, 중에 하나가 랜덤으로 뽑힘 : -1, 0, 1 중에 랜덤하게 하나 뽑음, 에서 리턴 값 -1은 a가 작…

[Java] LocalDate를 문자열로 변환

Java에서 LocalDate 객체를 String으로 변환하는 다양한 방법에 대해서 알아보겠습니다. 1. toString()을 이용한 방법 2. DateTimeFormatter와 format()을 이용한 방법 3. 다른 날짜 형식으로 변환 1. toString()을 이용한 방법 LocalDate의 은 날짜 값을 문자열로 변환합니다. 아래 코드의 실행 결과를 보면 형식으로 출력됩니다. Output: 2. DateTimeFormatter와 format()을 이용한 방법 DateTimeFormatter와 format()을 이용하여 LocalDate를 문자열로 변환할 수 있습니다. 은 인자로 전달된 format에 맞게 문자열을 만들고 리턴합니다. 는 형식으로 문자열 생성 Output: 3. 다른 날짜 형식으로 변환 에서 기본으로 제공하는 패턴 대신에, 으로 Custom pattern을 전달할 수도 있습니다. 아래 예제에서는 패턴으로 formatter를 생성하여 날짜 문자열을 변환하였…

[Java] Map(HashMap) for문으로 탐색/순회

Java에서 HashMap 등, Map의 모든 요소들을 for문으로 탐색, 순회하는 방법에 대해서 알아보겠습니다. 1. for문과 Entry로 Map 순회 2. forEach()로 Map 순회 3. Map의 Key만 순회 4. Map의 Value만 순회 5. Stream의 forEach()로 Map 순회 1. for문과 Entry로 Map 순회 는 Entry 리스트를 리턴하며, Entry는 Map 요소의 쌍을 의미합니다. 아래와 같이 Entry 리스트를 순회하면서, Map의 모든 key와 value를 탐색할 수 있습니다. Output: 2. forEach()로 Map 순회 Map은 함수를 제공하며, 아래와 같이 key와 value를 순회할 수 있습니다. : forEach는 key와 value를 인자로 전달하고 리턴 값이 없는 함수를 인자로 받음 Output: 3. Map의 Key만 순회 는 Map의 모든 key 값을 갖고 있는 리스트를 리턴합니다. 아래와 같이 key들만 순…

[Java] 리스트 두개 합치기, 3가지 방법

Java에서 리스트 2개를 하나의 리스트로 합치는 방법에 대해서 알아보겠습니다. 1. List.addAll()을 이용한 방법 2. Stream을 이용한 방법 3. Collections.addAll()을 이용한 방법 1. List.addAll()을 이용한 방법 는 list1에 list2의 모든 요소를 추가합니다. list1에 list2의 요소가 추가되며, list2의 데이터는 변경되지 않음 Output: 원본 리스트는 변경 없이, 새로운 리스트에 병합 원본 리스트 list1과 list2의 데이터는 변경하지 않고, 새로운 리스트에 두개 리스트의 모든 요소를 합칠 수 있습니다. 새로운 리스트를 만들고 두개의 리스트에 대해서 로 합치기 2. Stream을 이용한 방법 을 이용하여 두개 리스트를 하나의 리스트로 합칠 수 있습니다. : list1과 list2를 Stream으로 만들고 하나로 병합 : 합쳐진 내용을 리스트로 리턴 list1과 list2의 데이터는 변하지 않고, 두개 리스트의…

[Java] Map 두개 합치기, 3가지 방법

HashMap 등, Map 2개를 하나의 Map으로 합치는 방법에 대해서 알아보겠습니다. 1. Map.putAll()을 이용한 방법 2. Map.merge()를 이용한 방법 3. Stream을 이용한 방법 1. Map.putAll()을 이용한 방법 은 map1에 map2의 모든 key-value 값을 추가합니다. : map1의 key-value 값을 갖고 있는 새로운 Map 객체 생성 : mergedMap에 map2의 모든 key-value 값 추가 동일한 key가 존재할 때, 늦게 추가되는 map의 key-value로 업데이트 (map1의 “C”-1의 경우, map2의 “C”-3으로 업데이트됨) Output: 2. Map.merge()를 이용한 방법 를 이용하여 두개의 Map을 합칠 수 있습니다. : map1에 entry의 key와 value를 key-value로 추가, 은 동일한 key 값이 추가될 때, 이전에 추가된 값(v1)을 사용하겠다는 의미. 아래 예제에서는 “C”…

[Java] 람다식과 메소드 참조(Method references)

Java에서 람다식과 함께 메소드 참조 방식을 사용할 수 있습니다. 메소드 참조 방식은 람다식 대신에 사용할 수 있으며, 코드가 짧아서 구현이 간단합니다. 메소드 참조 방식에 대해서 알아보겠습니다. 1. 메소드 참조(Method References) 2. 정적 메소드 참조(Static Method References) 3. 인스턴스 메소드 레퍼런스(Instance Method References) 4. 클래스 생성자 레퍼런스(Constructor References) 1. 메소드 참조(Method References) 메소드 참조(Method References)는 람다식을 더 간단하고 가독성 있게 작성할 수 있게 해줍니다. 즉, 간단한 방법으로 람다식을 표현하는 것이 메소드 참조라고 할 수 있습니다. 주로 함수형 인터페이스를 사용할 때 사용됩니다. 메서드 레퍼런스는 기호를 사용하여 표현하며, 메서드 이름과 클래스 또는 객체를 가리킵니다. 예를 들어, 아래 코드는 리스트의 모든 …

[Java] Multi thread, join()으로 종료 대기

Java에서 은 쓰레드의 종료를 기다릴 때 사용합니다. 멀티 스레드를 사용할 때, 으로 대기하는 방법에 대해서 알아보겠습니다. 1. Thread.join() 함수 2. 첫번째 스레드 종료 대기 후, 다른 스레드 실행 3. 2개 스레드 동시 실행 및 종료 대기 1. Thread.join() 함수 함수는 스레드가 종료될 때까지 대기하며, 종료 후 다음 코드가 실행됩니다. 아래 예제처럼 로 스레드가 실행된 후에, 을 호출하면 완료될 때까지 메인 스레드는 대기를 합니다. : 스레드 실행 (스레드가 생성되도 가 호출되지 않으면 동작하지 않음) : thread1의 작업이 완료될 때까지 대기, InterruptedException가 발생할 수 있으니 try-catch로 예외처리 필요 Output: 2. 첫번째 스레드 종료 대기 후, 다른 스레드 실행 두개의 스레드 Thread1과 Thread2가 있을 때, 두개를 동시에 실행시키지 않고 아래와 같이 순차적으로 실행시킬 때 을 이용할 수 있…

[Java] 정규표현식(Regular Expression) 사용법

자바에서 정규표현식(Regular Expression)을 사용하는 방법에 대해서 알아보겠습니다. 1. 정규표현식(Regular Expression) 2. 패턴 생성 방법 3. 패턴 매칭 방법 4. 문자열 패턴 매칭 5. String.replaceAll()의 정규표현식 6. String.split()의 정규표현식 7. 다른 정규표현식 예제 8. 정규표현식 문법 1. 정규표현식(Regular Expression) 정규표현식, 정규식은 어떤 패턴을 갖고 있는 문자열 집합을 표현하는 방법입니다. 기본적으로 아래 두가지 과정을 거쳐, 문자열에서 정규표현식과 일치하는 패턴을 찾을 수 있습니다. 패턴 생성 패턴 매칭 2. 패턴 생성 방법 는 regex에 대한 객체를 생성합니다. Pattern 객체로 문자열 매칭을 하여 regex와 일치하는 문자열을 찾을 수 있습니다. 3. 패턴 매칭 방법 기본적으로 패턴 매칭은 Matcher를 이용합니다. Matcher는 으로 생성할 수 있습니다. 이렇게 생…

[Java] 현재 날짜, 시간 가져오기

Java에서 현재 날짜와 시간을 가져오는 방법에 대해서 알아보겠습니다. 1. 현재 날짜, 시간 가져오기 2. 날짜, 시간의 형식 변경 3. 다른 지역의 현재 날짜, 시간 가져오기 1. 현재 날짜, 시간 가져오기 다음 함수들을 이용하여 현재 날짜와 시간 정보를 갖고 있는 객체를 생성할 수 있습니다. : 현재 날짜를 갖고 있는 LocalDate 객체 리턴 : 현재 시간을 갖고 있는 LocalTime 객체 리턴 : 현재 날짜와 시간을 갖고 있는 LocalDateTime 객체 리턴 Output: 년/월/일/시/분/초 정보 가져오기 LocalDateTime, LocalDate, LocalTime에서 아래와 같은 메소드를 제공하며 다음과 같은 정보를 리턴합니다. 물론 LocalDate의 경우 시간 정보는 없기 때문에 같은 시간 함수는 제공하지 않습니다. 또한, LocalTime의 경우 날짜 정보 함수를 제공하지 않습니다. : 년도 값 리턴 : 월 값 리턴 : 일 값 리턴 : 시…

[Java] 현재 시간 초단위, 밀리세컨드로 가져오기

현재 날짜/시간 값을 초 단위 또는 밀리세컨드 단위로 변환하는 방법에 대해서 알아보겠습니다. 1. System.currentTimeMillis()를 이용한 방법 2. LocalDateTime.toEpochSecond()를 이용한 방법 1. System.currentTimeMillis()를 이용한 방법 는 현재 시스템의 시간을 밀리초(milliseconds) 단위 값으로 리턴합니다. 이 값은 UTC 시간으로, 즉, 1970년 1월 1일 00:00:00 UTC (협정 세계시)로부터 현재까지 경과한 시간입니다. 이 값을 이용하여 시스템의 상대적인 시간을 계산하거나 비교할 수 있습니다. : UTC 시간을 밀리세컨드 단위로 리턴 Output: 초 단위로 변경 위에서 가져온 밀리세컨드 값을 1000으로 나눠서 초 단위로 변환할 수 있습니다. 2. LocalDateTime.toEpochSecond()를 이용한 방법 는 LocalDateTime의 시간을 Epoch(UTC) 시간으로 변환합니다.…

[Java] 함수형 인터페이스(Functional Interface)

함수형 인터페이스(Functional Interface)는 하나의 추상 메서드만을 가지며, 람다식 또는 메서드 참조를 이용해 함수 객체를 생성할 수 있는 인터페이스입니다. Java는 Java 8부터 함수형 인터페이스를 통해 함수형 프로그래밍을 지원합니다. 함수형 인터페이스 생성 함수형 인터페이스 사용 방법 함수형 인터페이스를 익명 클래스로 구현 Java의 기본 함수형 인터페이스 Runnable: () -> void Supplier: () -> T Consumer: T -> void Function: T -> R Predicate: T -> boolean BiFunction: (T, U) -> R UnaryOperator: T -> T BinaryOperator: (T, T) -> T 함수형 인터페이스 생성 함수형 인터페이스는 아래와 같이 1개의 추상 메소드가 있어야 합니다. 어노테이션은 이 인터페이스가 함수형 인터페이스라는 것을 표시 : 인자 1개를 받고 리턴 값이 있는 추상…

[Java] 파일명 확장자 분리, 가져오기

파일의 이름은 파일 이름과 확장자로 되어있는데, 파일명과 확장자를 분리하여 가져오는 방법에 대해서 알아보겠습니다. 예를 들어, 파일에서 example과 txt를 따로 얻는 것입니다. 1. lastIndexOf()로 파일명, 확장자 얻기 2. 파일 경로에서 파일명, 확장자 얻기 1. lastIndexOf()로 파일명, 확장자 얻기 파일 이름을 변수로 가져왔다고 가정하고, 파일명과 확장자를 분리하는 코드를 작성하였습니다. : fileName 문자열의 오른쪽에서 문자를 찾고 index를 리턴 : 문자열에서 index부터 마지막 Index 범위의 문자열을 잘라서 리턴 : 문자의 다음 위치부터 마지막 문자까지 잘라서 리턴 파일 이름에서 문자가 없으면 잘못된 파일로 처리 Output: 2. 파일 경로에서 파일명, 확장자 얻기 파일 경로의 경우, 위와 같은 방식으로 파일명과 확장자를 분리할 수 없습니다. 의 경우, 위처럼 분리하면 아래처럼 됩니다. 파일명: 확장자: 이것을 해…

[Java] 하위 폴더 파일 목록 가져오기

어떤 디렉토리 아래에 있는 모든 파일/폴더들을 가져오는 방법에 대해서 알아보겠습니다. 1. File을 이용하여 하위 파일 리스트 가져오기 2. Path와 Files를 이용하여 하위 파일 리스트 가져오기 1. File을 이용하여 하위 파일 리스트 가져오기 File과 재귀함수를 이용하여 아래와 같이 디렉토리 하위 파일들을 모두 출력할 수 있습니다. : 파일이 디렉토리라면, 바로 아래 경로에 있는 모든 파일 리스트를 File 배열로 리턴 : file이 디렉토리라면, 하위 경로의 파일 목록을 출력하기 위해 재귀함수 호출 Output: 2. Path와 Files를 이용하여 하위 파일 리스트 가져오기 Java 7에서 추가된 Path와 Files를 이용하면 더 간단히 하위 파일, 폴더 리스트를 가져올 수 있습니다. 는 인자로 전달된 디렉토리의 하위 모든 파일/폴더에 대해서 탐색하며 콜백으로 Path 객체를 받을 수 있습니다. Path를 통해 File 객체를 얻을 수도 있습니다. : 하위 …

[Java] 파일 용량 체크, 2가지 방법

자바에서 File의 용량(크기)을 가져오는 방법에 대해서 알아보겠습니다. 1. File.length()를 이용한 방법 2. Files.size()를 이용한 방법 1. File.length()를 이용한 방법 는 File의 크기를 바이트 단위로 리턴합니다. 1024로 나누면 KB로 변환할 수 있으며, 다시 1024로 나누면 MB로 변환할 수 있습니다. Output: 2. Files.size()를 이용한 방법 Java 7 이상에서, Path와 Files를 이용하여 파일 크기를 가져올 수 있습니다. : Path의 용량을 바이트로 리턴 바이트를 1024로 나누어 KB, MB 단위로 변환할 수 있음 Output:

[Java] 배열에서 랜덤 값 뽑기, 3가지 방법

배열의 요소들 중에 랜덤으로 하나의 값을 추출하는 방법에 대해서 알아보겠습니다. 1. Random()을 이용한 방법 2. Math.random()을 이용한 방법 3. ThreadLocalRandom을 이용한 방법 1. Random()을 이용한 방법 는 0에서 length 미만의 숫자들 중에 하나를 랜덤으로 리턴합니다. 따라서, 배열 길이 범위 내에서 무작위로 index를 뽑고, 그 index로 배열 값을 가져올 수 있습니다. : 0 ~ (length - 1) 범위의 무작위 값 뽑음 Output: 2. Math.random()을 이용한 방법 은 0에서 1사이의 무작위 난수를 뽑습니다. 여기에 배열 길이를 곱하면 0에서 배열 길이 사이의 난수가 생성됩니다. 이것을 index로 사용하여 랜덤 배열 값을 가져올 수 있습니다. : 0 ~ 4 범위의 랜덤 index 생성 Output: 3. ThreadLocalRandom을 이용한 방법 ThreadLocalRandom는 Java 7에서 사…

[Java] 문자열 위치 찾기 (indexOf/lastIndexOf)

문자열에서 특정 문자열의 위치(index)를 찾는 함수는 와 가 있습니다. 이 함수들을 사용하여 문자열 위치를 찾는 방법에 대해서 알아보겠습니다. 1. indexOf(), lastIndexOf() 2. 특정 Index 부터 문자/문자열 찾기 1. indexOf(), lastIndexOf() 두개의 함수는 문자 또는 문자열을 찾고 index를 리턴하지만, 탐색 방향이 다릅니다. : 문자열의 왼쪽에서 오른쪽 방향으로 문자를 찾고 문자열의 첫 글자 Index 리턴 : 문자열의 오른쪽에서 왼쪽 방향으로 문자를 찾고 문자열의 첫 글자 Index 리턴 문자(char)의 index 찾기 는 왼쪽부터 탐색하며, 가장 먼저 찾은 문자의 Index를 리턴합니다. 아래 예제는 문자열의 왼쪽에서 오른쪽 방향으로 문자 를 찾고, Index 4를 리턴 문자를 못찾으면 -1을 리턴 Output: 는 오른쪽에서 왼쪽 방향으로 탐색하며, 가장 먼저 찾은 문자의 Index를 리턴합니다. 아래 예제는 오른쪽에서…

[Java] 리눅스 명령어 실행

Java에서 코드로 리눅스 명령어(shell command)를 실행하는 방법에 대해서 알아보겠습니다. 1. 단순한 명령어 실행 2. 명령어 실행 및 결과 받기 3. ProcessBuilder로 명령어 실행, 결과 받기 1. 단순한 명령어 실행 를 이용하여 명령어를 실행할 수 있습니다. 실행 결과를 확인하지 않고 명령어만 실행합니다. 실행 결과를 읽는 방법은 다음에 소개합니다. : command를 실행 : 명령어 실행이 완료될 때까지 기다리며 정상적으로 종료되면 0을 리턴 Output: 2. 명령어 실행 및 결과 받기 으로 명령어를 실행하고, 리턴된 로 실행 결과를 읽을 수 있습니다. : 명령어 실행 결과에 대한 InputStream 리턴 : 실행 결과를 한 줄씩 리턴 : 명령어 실행이 완료될 때까지 기다리며 정상적으로 종료되면 0을 리턴 Output: 3. ProcessBuilder로 명령어 실행, 결과 받기 ProcessBuilder를 사용하여 명령어를 실행할 수 있으며…

[Java] 천단위 콤마, 쉼표 넣기

천단위 숫자마다 콤마(,)를 넣는 방법에 대해서 알아보겠습니다. 아래와 같이 숫자에, 읽기 쉽게 천단위 마다 쉼표를 추가하려고 합니다. 1. DecimalFormat를 이용한 방법 2. String.format()을 이용한 방법 3. NumberFormat을 이용한 방법 1. DecimalFormat를 이용한 방법 double 자료형의 숫자를 천단위마다 쉼표를 넣고 문자열로 변경하는 예제입니다. 소수가 있는 경우, 소수 2자리까지 출력하도록 했습니다. : 천단위마다 쉼표 추가, 소수 2자리의 숫자로 변환하는 포맷 소수점 이하 숫자를 버리고 정수만 허용하려면 포맷을 사용하면 됨 : number에 포맷을 적용한 문자열 리턴 Output: 2. String.format()을 이용한 방법 로 숫자에 포맷을 적용할 수도 있습니다. : 포맷 적용한 문자열 리턴, 천단위마다 쉼표 추가, 소수 2자리까지 : 천단위마다 쉼표 추가, 소수는 버림 Output: 3. NumberFormat을…

[Java] 날짜/시간에 년, 월, 일, 시간 더하기 빼기

LocalDate, LocalDateTime 등의 날짜/시간 객체에 년, 월, 일, 시, 분, 초를 더하고 빼는 방법에 대해서 알아보겠습니다. 1. LocalDateTime의 날짜/시간 계산 2. 두 LocalDateTime 객체의 더하기/빼기 1. LocalDateTime의 날짜/시간 계산 날짜/시간 더하기 LocalDateTime는 아래와 같은 메소드를 제공하며, 각각 인자로 전달된 월, 일, 시간, 분, 초 값을 LocalDateTime 객체에 더합니다. plusYears() : 년 더하기 plusMonths() : 월 더하기 plusDays() : 일 더하기 plusHours() : 시간 더하기 plusMinutes() : 분 더하기 plusSeconds() : 초 더하기 Output: 날짜/시간 빼기 LocalDateTime는 아래와 같은 메소드를 제공하며, 각각 인자로 전달된 월, 일, 시간, 분, 초 값을 LocalDateTime 객체에서 뺍니다. minusYears(…

[Java] 배열 교집합 구하기, 3가지 방법

두개의 배열에서 공통 요소(교집합)를 구하는 방법에 대해서 알아보겠습니다. 1. Set를 이용한 방법 2. for문을 이용한 방법 3. Stream을 이용한 방법 1. Set를 이용한 방법 Set는 이라는 함수가 있습니다. 는 set1에서 set2와의 교집합 요소들만 남기고 다른 요소들을 모두 삭제합니다. 이 함수를 이용하여 교집합을 구할 수 있습니다. 먼저 배열을 Set로 변환 : set1과 set2의 공통 요소만 남기고 모두 제거 : Set를 배열로 변환 Output: 2. for문을 이용한 방법 2중 for문으로 두개의 배열을 순회하면서 공통 요소를 다른 리스트에 저장할 수 있습니다. 교집합 연산이 끝나고, 리스트는 다시 배열로 변환할 수 있습니다. Output: 3. Stream을 이용한 방법 Set를 이용한 방법과 동일한데, 배열을 Set로 변환할 때 Stream을 사용하여 짧은 코드로 변환할 수 있습니다. : array1을 Set로 변환 Output:

[Java] 배열 랜덤 정렬, 2가지 방법

배열의 요소 순서를 랜덤하게 정렬하는 방법에 대해서 알아보겠습니다. 1. Collections.shuffle()을 이용한 방법 2. 직접 구현하는 방법 1. Collections.shuffle()을 이용한 방법 은 list를 랜덤하게 섞어서 정렬합니다. : array의 모든 요소 값들을 문자열로 리턴 이것을 이용하여, 배열을 리스트로 먼저 정렬 후에 shuffle()로 랜덤 정렬하고, 다시 리스트를 배열로 변환하는 방법이 있습니다. Output: 2. 직접 구현하는 방법 아래 예제는 for문을 이용하여 shuffle을 구현하였습니다. Random을 이용하여 루프를 돌면서 무작위 수를 뽑고, 배열의 값들을 변경합니다. : 0 ~ i 범위의 랜덤 숫자(index) 뽑음 배열의 뒤에서 앞으로 순회하면서 랜덤하게 swap Output:

[Java] String 날짜, 시간 비교

문자열(String)로 표현된 날짜, 시간들을 비교하는 방법을 알아보겠습니다. 날짜/시간을 비교하면 어떤 시간이 빠른지, 느린지 알 수 있습니다. 1. 날짜, 시간 문자열 비교 2. 시간 문자열 비교 1. 날짜, 시간 문자열 비교 SimpleDateFormat과 Date를 이용한 방법 아래와 같이 SimpleDateFormat과 Date를 이용하여 문자열로 된 날짜, 시간 문자열을 파싱할 수 있습니다. 파싱된 Date 객체는 와 함수를 이용하여 시간 선, 후 관계를 비교할 수 있습니다. : A가 B보다 이전 시간일 때 true 리턴 : A가 B보다 이후 시간일 때 true 리턴 before()와 after()가 모두 false일 때는 같은 시간 Output: LocalDateTime을 이용한 방법 대신에 로 날짜, 시간 문자열을 파싱하여 LocalDateTime 객체로 만들 수 있습니다. 대신, 인자로 문자열과 SimpleDateFormat 객체를 전달합니다. 파싱된 Loc…

[Java] CompletableFuture 사용법

Java 8에서 소개된 CompletableFuture는 비동기(Async) 및 병렬 작업을 수행하는데 사용되는 클래스입니다. CompletableFuture로 비동기 연산을 수행하고 해당 작업이 완료될 때 콜백 함수를 호출하여 다른 작업을 수행시킬 수도 있습니다. 예제를 통해 CompletableFuture의 사용 방법에 대해서 알아보겠습니다. 1. 기본적인 비동기 작업 생성 2. supplyAsync(), runAsync()로 비동기 작업 생성 3. 연속적인 비동기 작업 정의 : thenApply(), thenAccept(), thenRun() 4. 순차적인 비동기 작업 정의 : thenCompose() 5. 병렬 처리 : thenCombine() 1. 기본적인 비동기 작업 생성 아래 예제는 CompletableFuture를 사용하여 비동기 작업을 기다리고 결과를 받아서 출력하는 예제입니다. 두개의 스레드 thread1과 thread2가 있을 때, thread1은 Future를…

[Java] 2차원 배열 1차원 배열로 변환, 2가지 방법

2차원 배열을 1차원 배열로 변환하는 것을 평탄화(flatten)라고 하는데, 어떻게 하는지 알아보겠습니다. 1. for문을 이용한 방법 2. Stream을 이용한 방법 1. for문을 이용한 방법 2중 for문을 사용하여 2차원 배열을 1차원 배열로 변환할 수 있습니다. 먼저 2차원 배열의 요소 개수만큼의 1차원 배열 생성 2중 for문으로 2차원 배열을 순회하면서 1차원 배열에 값 할당 Output: 2. Stream을 이용한 방법 Stream의 를 사용하여 2차원 배열을 평탄화 할 수 있습니다. 2차원배열을 Stream으로 만듬 : 2차원 배열을 평탄화 : 결과를 배열로 변환 Output:

[Java] 각 단어의 첫 글자 대문자로 변환

각 단어의 첫 글자만 대문자로 변환하는 방법에 대해서 알아보겠습니다. 1. 각 단어의 첫 글자 대문자로 변환 2. 문장의 첫 글자 대문자로 변환 1. 각 단어의 첫 글자 대문자로 변환 먼저 문자열을 공백 기준으로 분리하여 단어 단위로 분리합니다. 그리고 단어의 첫 글자만 대문자로 변환하고 나머지는 그대로 둡니다. : 문자열을 공백으로 분리하여 배열로 리턴 : 단어의 첫 글자를 대문자로 변환 : 첫 글자를 제외한 나머지 문자열만 잘라서 저장, 는 문자열의 index부터 끝까지 잘라서 리턴 : 대문자로 변환한 첫글자와 나머지 부분을 다시 합침, 마지막에 공백 문자도 추가 : 문자열 앞, 뒤에 추가된 공백을 모두 제거 Output: 2. 문장의 첫 글자 대문자로 변환 문장의 첫 글자만 대문자로 변환하고 나머지는 그대로 두려면, 위에서 처리한 것과 동일하게, 문장의 첫 글자를 가져와서 대문자로 변환하고, 첫 글자를 제외한 나머지 문자열을 잘라냅니다. 그리고 첫글자와 나머지 문장을…

[Java] LocalDateTime Timestamp(Epoch) 변환

LocalDateTime을 Timestamp(Epoch time, UTC millis)으로 변환하거나 Timestamp를 LocalDateTime으로 변환하는 방법에 대해서 알아보겠습니다. 1. LocalDateTime과 Timestamp 2. LocalDateTime을 Timestamp로 변환 3. Timestamp를 LocalDateTime으로 변환 1. LocalDateTime과 Timestamp LocalDateTime LocalDateTime은 Java8에서 추가된 클래스로, 날짜와 시간 정보를 다루는 클래스입니다. Timestamp Timestamp는 Epoch time 또는 Unix Epoch time라고도 하며, 1970년 1월 1일 00:00:00 UTC(협정 세계시)를 기준으로 현재까지 경과한 시간을 나타냅니다. Java에서 으로 현재 시간의 Epoch time을 millisecond로 얻을 수 있습니다. 2. LocalDateTime을 Timestamp로 변환 …

[Java] 2차원 배열 복사

깊은 복사를 이용하여 2차원 배열을 복사하는 방법에 대해서 알아보겠습니다. 1. Arrays.copyOf()를 이용한 방법 2. System.arraycopy()를 이용한 방법 3. for문을 이용한 방법 1. Arrays.copyOf()를 이용한 방법 은 array 배열의 Index 0부터 n개 까지 복사한 배열을 만들어서 리턴합니다. 따라서, 아래와 같이 for문을 이용하여 2차원 배열을 복사할 수 있습니다. : 2차원 배열의 행(row) 복사 for문으로 모든 행(row) 복사 깊은 복사를 하였기 때문에, 원본 배열의 값을 변경해도 복사된 배열에 영향을 주지 않음 Output: 2. System.arraycopy()를 이용한 방법 는 src 배열의 srcIndex에서 length 개수만큼의 값들을 des 배열의 desIndex부터 (desIndex + length -1) 인덱스까지 복사합니다. : 배열의 행(row) 복사 for문으로 모든 행(row) 복사 깊은 복사 Ou…

[디자인패턴] 싱글턴 패턴 (Singleton)

싱글턴 패턴은 소프트웨어 디자인 패턴 중 하나로, 특정 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하는 패턴입니다. 이 패턴은 전역 변수를 사용하지 않고 객체를 전역적으로 액세스할 수 있게 해줍니다. 싱글턴 패턴의 목적 및 장점 싱글턴 패턴은 다음과 같은 목적과 장점이 있습니다. 1개의 객체 생성 보장: 싱글턴 패턴을 사용하면, 클래스의 인스턴스가 하나만 생성되는 것을 보장할 수 있음 전역 접근: 싱글턴 패턴을 사용하면, 객체를 인자로 전달하지 않아도 어디서든지 접근할 수 있음. 객체 생성 지연 : 싱글턴 객체는 필요할 때 생성됨. 데이터 공유 : 1개의 객체에서 모든 작업이 처리되기 때문에, 자원을 공유할 수 있음 시스템 디자인 측면에서 주의할 점 싱글턴 패턴이 디자인에 미치는 단점으로, 아래와 같은 내용을 주의해야 합니다. 유연성 저하: 싱글턴 패턴은 OOP의 원칙 중 하나인 “개방/폐쇄 원칙”을 위반할 수 있습니다. 확장이 어렵고 변경이…

[디자인패턴] 전략 패턴 (Strategy Pattern)

전략 패턴(Strategy Pattern)은 알고리즘을 캡슐화하여, 동적으로 알고리즘을 교체 가능하도록 하는 디자인 패턴입니다. 예를 들어, 결제 방법이 여러가지가 있다고 가정하면, 상황에 따라서 어쩔 때는 카드로 결제하고, 어쩔 때는 현금으로 결제할 수 있는데요. 다양한 결제 방법을 객체들로 만들고, 결제를 처리하는 곳에서 결제 방법을 동적으로 교체하여 어떤 알고리즘을 수행시킬 수 있습니다. 따라서, 어떤 작업을 수행할 때 다양한 알고리즘이 존재하며 상황에 따라 특정 알고리즘을 사용하여 처리해야한다면 전략 패턴이 사용될 수 있습니다. 전략 패턴 전략 패턴은 다음과 같습니다. 다양한 알고리즘(family 알고리즘 - 비슷한 목적으로 사용되는)을 정의 각각의 알고리즘을 캡슐화 각각의 알고리즘을 동적으로 변경하여 수행시킬 수 있음 클래스 다이어그램을 보면, Strategy(알고리즘)를 추상화하고 상속을 통해 알고리즘을 구현합니다. 즉, 상속을 통해 확장을 합니다. 전략 패턴 특징 유…

[Java] 소수점 n자리까지 출력, 3가지 방법

float을 소수점 2자리까지 표시하여 출력하는 방법에 대해서 알아보겠습니다. 1. String.format()을 이용한 방법 2. DecimalFormat을 이용한 방법 3. Math.round()를 이용한 방법 1. String.format()을 이용한 방법 처럼 숫자 number를 소수점 n자리까지 표시할 수 있습니다. 는 소수점 n자리까지 표시하며, n+1 자리에서 반올림 Output: 2. DecimalFormat을 이용한 방법 처럼 소수점 n자리까지 표기할 수 있습니다. 소수점 n+1자리에서 반올림하여 소수점 n자리까지 표시됩니다. 은 문자열을 리턴 처럼 double로 변환할 수 있음 Output: 3. Math.round()를 이용한 방법 는 숫자 n을 반올림하여 정수로 만듭니다. 예를 들어, 소수점 3자리 이상 있는 실수를 2자리까지 반올림하려면, 숫자에 100을 곱하고 로 반올림하고 다시 100으로 나누면 됩니다. Output:

[Java] Default Method(기본 메소드)

디폴트 메소드(Default Method) 또는 기본 메소드는 Java 8에서 추가된 기능 중 하나입니다. 디폴트 메소드는 인터페이스의 메소드에서 기본적으로 구현 기능을 제공하는 것인데요, 자세히 알아보겠습니다. 1. 디폴트 메소드(Default Method) 2. 특징: 기본 구현 제공 3. 특징: 기존 코드와의 호환성 4. 특징: 다중 상속 지원 1. 디폴트 메소드(Default Method) 디폴트 메소드는 아래와 같이 인터페이스에서 메소드를 구현하는 것을 말합니다. 이전에는 인터페이스는 메소드를 선언만 할 수 있고, 구현할 수 없었음. 구현은 이것을 구현(implements)하는 클래스에서 할 수 있었음 인터페이스에서 메소드 선언과 동시에 기본 구현을 정의할 수 있음 디폴트 메소드는 아래와 같은 특징이 있습니다. 아래에서 각 특징에 대해서 알아보겠습니다. 기본 구현 제공: 인터페이스에 기본 구현을 제공합니다. 이로 인해 해당 인터페이스를 구현(implements)하는 클래스…

[Java] Stream.sorted(), 정렬하기

Java에서 는 스트림의 요소들을 정렬하는데 사용하는 메소드입니다. 이 메소드를 사용하여 스트림의 요소들을 정렬할 수 있습니다. Stream.sorted()로 스트림 정렬 예제 1. 내림차순으로 정렬 예제 2. 문자열 스트림을 sorted()로 정렬 예제 3. Custom class의 스트림 정렬 예제 4. Comparable이 구현된 Custom class Stream.sorted()로 스트림 정렬 아래 예제는 동일한 스트림에 대해서, 한번은 를 사용하지 않고 요소들을 출력하고, 한번은 사용하고 출력합니다. 를 호출함으로써, 스트림의 요소들이 오름차순으로 정렬되는 것을 볼 수 있습니다. Output: 예제 1. 내림차순으로 정렬 스트림에 인자 없이 를 호출하면 객체에 정의된 Comparator를 사용하여 비교합니다. 일반적으로 오름차순으로 정렬되도록 구현되어있습니다. 만약 내림차순으로 정렬하고 싶다면, 정렬 규칙을 의미하는 Comparator를 직접 구현하여 에 인자로 전달해야 …