Java - ".class" 파일을 Java 파일로 디컴파일하는 방법 (jd-cli decompiler)

Jar 파일은 zip으로 압축이 되어있습니다. 이 압축을 풀면 많은 .class 파일들이 있습니다. class 파일은 Java 파일을 바이트코드로 컴파일하면서 생성되는 산출물입니다. class 파일을 열면 Java 코드가 보이지 않기 때문에, 보고 싶다면 Java로 다시 디컴파일해야 합니다. IntelliJ IDE에서 디컴파일하는 방법, jd-cli 툴을 이용하여 디컴파일하는 방법이 있습니다.

19 Jul 2020

Java - final, finally, finalize의 차이점

Java의 final, finally, finalize는 전혀 다른 내용이지만, 이름이 비슷하여 헷갈릴 수도 있습니다. 이 글에서는 다음 내용들이 무엇인지, 어떻게 사용하는지 알아보겠습니다. final 키워드는 클래스, 메소드, 변수, 인자를 선언할 때 함께 사용할 수 있습니다. finally 키워드는 try-catch가 종료될 때 수행되는 block입니다. finalize()는 GC에 의해 호출되는 메소드입니다.

18 Jul 2020

Java - Static 키워드 이해하기

Java의 static keyword는 field, method, class에 적용할 수 있습니다. static 키워드의 공통점은 객체와의 분리입니다. 객체를 생성하지 않고 접근할 수 있습니다. 또한, 어떤 클래스 아래에 static 변수, 메소드, 클래스를 선언하여 관련있는 내용들을 한 곳에 모을 수 있습니다. static keyword를 사용하여 선언하였을 때 어떤 차이점이 있는지 알아보겠습니다.

18 Jul 2020

Java - Final 키워드에 대한 이해

클래스, 메소드, 변수에 final을 붙이면 시간이 지나도 처음 정의된 상태가 변하지 않는 것을 보장한다는 의미입니다. static 변수에도 final을 붙일 수 있으며, final 변수를 선언할 때 바로 초기화를 하지 않고 if문이나 생성자에서 초기화할 수 있습니다. Java8에서는 Effective final 기능이 추가되었으며 어떤 상황에서 일반 변수를 암묵적으로 final로 취급합니다.

04 Jul 2020

Java - Lambda, 익명 클래스에서 final 변수를 참조해야하는 이유

Lambda 또는 익명 클래스(Anonymous class)에서 외부에 정의된 변수를 참조할 때는 꼭 final, 또는 effective final 변수만 참조해야 합니다. non-final 변수를 참조하려고 하면 컴파일 에러가 발생하기 때문에 사용할 수도 없습니다. 왜 final을 써야 하는지에 그 이유에 대해서 알아보려고 합니다.

04 Jul 2020

Java - Random number(난수) 생성하는 방법

Math.random(), Random, Apache commons-math3 라이브러리 등을 이용하여 난수(random number)를 생성할 수 있습니다. 또한 특정 범위에서 난수를 생성하도록 경계를 설정할 수 있습니다. Plain Java에서는 Math.random()과 Random을 이용하면 되고 필요에 따라서 commons-math3 라이브러리를 사용하시면 됩니다.

30 Jun 2020

Java - 거듭제곱 계산, Math.pow()

Math.pow()를 이용하여 거듭제곱을 계산할 수 있습니다. pow는 power를 의미하고, power의 뜻은 거듭제곱입니다. pow() 인자 두개, a와 b를 전달하며, a의 b 제곱이 리턴됩니다. 즉, a를 b번 곱한 값이 리턴됩니다. 리턴 값은 double이며 DecimalFormat으로 소수점 몇번째 자리까지만 표시되도록 출력할 수 있습니다.

30 Jun 2020

Java - 제곱근(root) 계산, Math.sqrt()

Math.sqrt()로 제곱근을 구할 수 있습니다. sqrt는 Square root를 의미하며 제곱근이라는 뜻입니다. 인자로 0을 전달하면 0이 리턴됩니다. 인자로 음수나 NaN(Not a Number)를 전달하면 NaN이 리턴됩니다. 인자로 Infinity number를 전달하면 Infinity number가 리턴됩니다.

30 Jun 2020

Java - 문자열(String)을 비교하는 방법 (==, equals, compare)

보통 자바에서 equals()를 사용하여 문자열이 동일한지 확인합니다. ==는 object가 동일한지를 체크하기 때문에 object가 갖고 있는 문자열이 동일하다는 것을 보장하지 않습니다. 또한 compare 메소드를 이용하여 문자열이 동일한지, 어떤 문자열이 사전적인 순서로 앞서있는지 등을 비교할 수 있습니다. 이를 통해 오름차순이나 내림차순으로 정렬할 수 있습니다.

30 Jun 2020

Java - 문자열(String) 길이 계산

String의 length()는 문자열의 길이를 리턴합니다. Unicode 문자열의 길이를 리턴하기 때문에 다른 언어의 문자열에도 사용할 수 있습니다. 특정 길이만큼 문자열을 자르려면 subStirng()을 사용합니다. List 등의 Collections의 길이를 구할 때는 size()를 사용하며 Array의 길이를 구할 때는 length를 사용합니다.

30 Jun 2020

Java - 대소문자 변환 & 구분없이 비교 (toUpperCase, toLowerCase, equalsIgnoreCase)

String 클래스는 문자열을 대문자로 변경하거나 소문자로 변경하는 메소드를 제공합니다. toUpperCase()는 대문자로, toLowerCase()는 소문자로 변경해줍니다. 기본적으로 영어 문자열을 변경해주지만 인자로 Locale을 전달하면 해당 언어에 대해서 대소문자 변환을 해 줍니다. equalsIgnoreCase를 이용하여 대소문자 구분없이 비교를 할 수 있습니다.

30 Jun 2020

Java - System.identityHashCode()와 hashCode()의 차이점

System.identityHashCode()는 객체의 고유한 hashcode를 리턴하는 메소드입니다. hashCode()는 모든 객체의 부모 클래스인 Object 클래스에 정의되어있습니다. 그리고 하위 클래스가 이 메소드를 오버라이드할 수 있습니다. 그렇기 때문에 객체는 다르지만 hashcode는 동일한 값을 리턴하는 경우가 있습니다.

30 Jun 2020

Java - Thread 생성, 실행, 정지하는 방법

Java에서 Thread를 생성하고 실행, 정지하는 방법에 대해서 알아보겠습니다. Thread를 상속받아 구현할 수 있지만, Runnable을 Thread에 전달하여 동작하도록 할 수도 있습니다. join()으로 쓰레드의 작업이 완료될 때까지 기다릴 수 있습니다. 종료는 flag방식과 인터럽트 방식으로 구현할 수 있습니다. stop()은 쓰레드를 안전하게 종료하지 않아 사용하면 안됩니다.

17 Jun 2020

Java - CompletableFuture 사용 방법

CompletableFuture는 Future와 CompletionStage를 구현한 클래스입니다. Future이지만 supplyAsync(), runAsync()를 이용하여 직접 쓰레드를 생성하지 않고 async로 작업을 처리할 수 있습니다. 그리고 여러 CompletableFuture를 병렬로 처리하거나, 병합하여 처리할 수 있게 합니다. 또한 Cancel, Error를 처리할 수 있는 방법을 제공합니다.

16 Jun 2020

Java - CountDownLatch 사용 방법

CountDownLatch는 어떤 쓰레드가 다른 쓰레드에서 작업이 완료될 때 까지 기다릴 수 있도록 해주는 클래스입니다. countDown()이 호출되면 Latch의 수가 1개씩 감소하며, await()은 Latch의 숫자가 0이 될 때까지 기다립니다. 이 두개의 메소드를 이용하여 병렬처리, 멀티쓰레딩으로 작업을 처리하도록 만들 수 있습니다.

15 Jun 2020

Java - AtomicLong 사용 방법

AtomicLong은 Long 자료형을 갖고 있습니다. Thread-safe로 구현되었고, 멀티쓰레드에서 동시성 고려 없이 사용할 수 있습니다. volatile과 다르게 여러 쓰레드에서 값을 write해도 동시성이 보장됩니다. get, set, getAndSet, compareAndSet 등의 함수를 제공해 줍니다.

14 Jun 2020

Java - ArrayBlockingQueue 사용 방법

ArrayBlockingQueue는 Array로 구현된 BlockingQueue입니다. Queue의 크기가 정해져 있기 때문에 무한히 아이템을 추가할 수 없습니다. 추가되는 아이템은 순서가 있으며, FIFO(First In First Out) 순서를 따릅니다. ArrayBlockingQueue는 멀티 쓰레드 환경에서 사용하기 위해 구현되었으며 내부적으로 동시성에 안전합니다.

09 Jun 2020

Java - 배열 정렬(Sorting) (오름차순, 내림차순)

Arrays.sort()을 이용하면 쉽게 배열(Array)을 내림차순, 오름차순으로 정렬(sorting)할 수 있습니다. Integer, String 등 구분없이 모든 객체를 정렬할 수 있습니다. 또한, 클래스에 Comparable을 구현하면 객체 배열(Array)도 순서대로 정렬할 수 있습니다. 예제와 함께 Array를 sorting하는 방법에 대해서 알아보겠습니다.

07 Jun 2020

Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개

String.matches()로 특정 패턴의 문자열을 포함하는지 확인할 수 있습니다. 특정 패턴이란 정규표현식(Regex)를 의미합니다. Pattern.matches()도 동일한 역할입니다. 문자열에 해당 패턴이 일치한다면 결과를 boolean으로 리턴합니다. 이를 통해 내가 찾는 패턴으로 문자열이 구성되었는지 알 수 있습니다.

07 Jun 2020

Java - split, substring으로 문자열을 자르기 & 분리하기

String.split(), String.substring()으로 문자열을 자를 수 있습니다. 또한 Commons-io 라이브러리를 이용하여 문자열을 자를 수 있습니다. split은 정규표현식을 인자로 받으며, 그 문자열을 기준으로 String을 자를 수 있습니다. substring()는 index를 기준으로 문자열을 자릅니다.

24 May 2020

양방향 연결 리스트(Doubly Linked List) 설명과 예제 코드(Java)

Doubly Linked List는 양방향 연결 리스트로, Singly Linked List와 달리 node에 이전 node를 가리키는 prev라는 변수가 있습니다. node를 리스트에 add, remove하는 코드를 구현하면서 링크드 리스트에 대해서 자세히 알아보겠습니다. Leetcode에서 많은 테스트 케이스로 자신의 올바르게 구현이 되었는지 검증할 수도 있습니다.

21 May 2020

단일 연결 리스트(Singly Linked List) 설명과 예제 코드(Java)

링크드 리스트(Linked List, 연결 리스트)는 데이터의 집합을 저장하기 위해 사용되는 데이터 구조입니다. 연속적인 자료구조로 되어있고 배열과 비교하여 장단점이 있습니다. node를 리스트에 add, remove하는 코드를 구현하면서 자세히 알아보겠습니다. 또한, Leetcode를 통해 자신이 구현한 코드가 잘 동작하는지 검증할 수 있습니다.

19 May 2020

Java - 디렉토리(폴더), 파일 크기 계산하는 방법

Java에서 디렉토리, 파일 크기를 구하는 다양한 방법을 소개합니다. File, Files, Paths를 이용하여 파일 크기를 구할 수 있습니다. 또, Java8의 Stream을 이용하여 파일 크기를 구할 수 있습니다. 또한, Commons-io 라이브러리를 이용하면 더 짧은 코드로 File 크기를 계산할 수 있습니다.

01 May 2020

Java - 파일에서 확장자(File extension) 얻는 방법

Java에서 File 이름으로 부터 extension(확장자)를 가져올 수 있습니다. 마지막 '.' 문자열을 찾고 그 뒤의 문자열을 확장자라고 생각할 수 있습니다. Commons-io의 FilenameUtils.getExtension()를 사용하면 더 간단하게 확장자를 가져올 수도 있습니다.

01 May 2020

Java - 텍스트 파일 생성 방법

Java에서 File을 생성하는 다양한 방법을 소개합니다. File 클래스를 이용하여 파일을 생성하거나, Java7 nio package의 Path, Files를 이용하여 생성할 수도 있습니다. 또는 Commons-io 라이브러리의 FileUtils 클래스를 이용하여 특정 경로에 파일을 생성할 수 있습니다.

30 Apr 2020

Java - Text 파일을 읽는 방법

Text 파일을 읽는 다양한 방법이 있습니다. BufferedReader, Files 등을 이용할 수 있고, commons-io 라이브러리의 FileUtils를 이용하여 텍스트 파일을 읽을 수 있습니다. API에 따라서 List<String> 타입으로 받거나, String 타입으로 문자열을 받을 수 있습니다.

30 Apr 2020

Java - 파일 rename, move 하는 방법

Java에서 다양한 방법으로 파일의 이름을 변경하거나 이동시킬 수 있습니다. Java6의 File을 이용하거나, Java7의 NIO 패키지, Files와 Path를 이용할 수 있습니다. 또한 Guava나 Common IO 등의 방법을 이용할 수도 있습니다. 예제와 함께 File을 이동시키는 방법을 알아보겠습니다.

30 Apr 2020

Java - 파일에 Text(String)를 쓰는 방법

Java에서 파일에 text를 쓰는 다양한 방법을 소개합니다. File에 String을 입력할 때 BufferedWriter, PrintWriter, FileOutputStream, Files 클래스 등을 이용할 수 있습니다. 파일이 존재하지 않는 경우 파일을 만들고 문자열을 씁니다. 예제와 함께 알아보겠습니다.

30 Apr 2020

Java - 하위 폴더, 파일 모두 삭제하는 방법

File.delete()은 하위 파일들을 함께 삭제할 수 없습니다. 직접 재귀적으로 파일을 순회하여 삭제하도록 구현하거나 commons-io 라이브러리의 FileUtils를 사용하여 삭제를 해야 합니다. 또한 Java8의 Stream과 Files를 이용하여 하위 파일들을 순회하면서 삭제하도록 구현할 수도 있습니다.

29 Apr 2020

Java - Milliseconds를 Hours, Minutes, Seconds 단위로 변환

TimeUnit 클래스를 이용하면 Milliseconds를 쉽게 Hours, Minutes, Seconds 단위로 변환할 수 있습니다. 물론 Milliseconds를 직접 나눠서 시, 분, 초를 구할 수 있습니다. 예제를 어떻게 구현하는지 알아보겠습니다.

21 Apr 2020

Java - 특정 디렉토리의 파일 리스트 탐색 및 출력하는 방법

특정 디렉토리의 file list를 탐색 및 출력하는 방법을 소개합니다. listFiles(), listFiles(FilenameFilter), listFiles(FileFilter), list(), list(FilenameFilter) 를 이용하여 하위 폴더의 파일 목록을 받을 수 있습니다. 예제와 함께 구현 방법을 알아보겠습니다.

15 Apr 2020

Java - 두개의 List를 하나로 합치는 방법

두개의 List를 하나의 Lis로 합치는(join) 방법을 소개합니다. List.addAll(), Guava의 Iterables.unmodifiableIterable()와 Lists.newArrayList(), Apache의 ListUtils.union() 마지막으로 Stream을 이용하여 두개의 리스트를 하나로 합병할 수 있습니다.

14 Apr 2020

Java - Map을 정렬(sorting)하는 다양한 방법

HashMap 또는 Map을 정렬(sorting)하는 다양한 방법을 소개합니다. LinkedHashMap, TreeMap, List, Stream 등을 이용하여 Map을 정렬할 수 있습니다. 다양한 방법에 대해서 예제와 함께 알아보겠습니다.

14 Apr 2020

Java - Set를 List로, List를 Set로 변환하는 방법

Set를 List로, List를 Set로 변환, List를 Array로, Array를 List로 변환, Set를 Array로, Array를 Set로 변환하는 방법을 소개합니다. 또한 구글 자바 라이브러리 Guava를 이용한 예제도 소개합니다.

12 Apr 2020

Java - Generics에서 Covariance, Contravariance 개념 이해하기

Generics에서 Invariance, Covariance, Contravariance의 개념을 설명하고 어떤 상황에서 이런 개념을 사용하는지 설명하려고 합니다. 이런 개념들은 클래스들의 상속관계에 따라서 Generics에서 객체의 관계를 결정하는 것을 의미합니다.

10 Apr 2020

Java - 현재 시간, 날짜를 원하는 형식으로 출력

SimpleDateFormat으로 현재 시간, 날짜를 원하는 형식으로 출력할 수 있습니다. SimpleDateFormat는 Java8 이전 부터 사용되었으며, 시간을 특정 형식에 맞게 출력하거나 문자열을 파싱할 수 있습니다. 참고로, Java8에서는 DateTimeFormatter라는 클래스가 소개되었습니다.

10 Apr 2020

Java의 Effectively final이란 무엇인가?

Java8에서 final이 붙지 않은 변수의 값이 변경되지 않는다면, 그 변수를 Effectively final이라고 합니다. Effectively final은 익명 클래스 내부에서 접근할 수 있습니다. 개발자의 의도를 알 수 있게 명시적으로 final을 붙여주는 것이 좋을 것 같은데요. 요즘 트렌드에 맞춰 추가된 기능인 것 같습니다.

09 Apr 2020

Java - Map을 List로 변경하는 방법

Map은 keySet(), values()라는 메소드를 제공하며, 이 메소드를 이용하여 Map을 List로 변환할 수 있습니다. 생성자를 통해 변환하는 방법과 Stream을 이용하여 변환하는 방법이 있습니다. 예제를 통해 알아보겠습니다.

04 Apr 2020

Java - 문자열(String)에서 숫자(int)만 추출하는 방법

문자열(String)에서 숫자(int)만 추출하는 방법 여러가지 방법이 있습니다. 정규표현식(regex)를 사용하거나, for 또는 Stream을 사용하여 구현할 수 있습니다. 예제 코드와 함께 구현 방법을 알아보겠습니다.

04 Apr 2020

Java - 정규표현식(regex), 다양한 예제로 쉽게 이해하기

정규표현식(Regular expressions), Regex는 문자열에서 어떤 패턴을 찾는데 도움을 줍니다. Regex의 Metacharacters, Quantifiers, Grouping에 대해서 정리하였고 다양한 예제로 설명합니다. Regex는 대부분 알고 있지만, 적용할 표현들이 헷갈렸다면 이 글을 참고하시면 좋을 것 같습니다.

26 Jan 2020

Java - AtomicReference 사용 방법

AtomicReference는 V 클래스(Generic)의 객체를 wrapping 클래스입니다. AtomicReference 클래스는 멀티쓰레드 환경에서 동시성을 보장합니다. AtomicReference는 synchronized 보다 적은 비용으로 동시성을 보장할 수 있습니다.

17 Jan 2020

Java - Stack trace 출력하는 방법 (Throwable, Exception)

Java에서 Throwable 객체로 콜스택을 출력할 수 있습니다. 현재 코드 위치까지 어떤 함수들을 거쳐왔는지 보여주는 것을 Stack trace라고 합니다. Java 코드를 보면 Exception은 Throwable을 상속받습니다. Exception 객체도 Throwable의 메소드를 이용하여 Stack trace를 출력할 수 있습니다.

17 Jan 2020

Java - OpenCsv로 CSV 파일 읽고 쓰는 방법

Java에서 CSV 파일을 읽거나 쓸 때 OpenCsv라는 라이브러리를 사용할 수 있습니다. 저는 간단한 CSV 파일만 생성하려고 했기 때문에, 읽고/쓰는 방법만 구현해보았습니다. 사이트에 들어가서 예제를 보시면, 고급스러운 방법으로 효율적인 CSV 파일을 만들 수 있도록 가이드를 합니다.

15 Jan 2020

Java - Objects.equals() 사용 방법

Objects.equals()의 코드 및 사용방법을 알아보고 예제를 소개합니다. Objects.equals는 객체 비교에 사용되며 우리가 자주 구현하던 패턴을 util 클래스로 만들어둔 것 뿐입니다. 두개의 객체가 null일 때도 같은 객체라고 처리가 됩니다.

14 Dec 2019

Java - Thread 우선순위(Priority)를 설정하는 방법

쓰레드(Thread)마다 우선순위(Priority)를 다르게 설정할 수 있습니다. 시스템이 busy할 때 우선순위가 높은 쓰레드에게 먼저 CPU를 할당해 줍니다. 우선순위는 1부터 10까지의 숫자로 설정할 수 있으며 MIN_PRIORITY, NORM_PRIORITY, MAX_PRIORITY의 static 변수를 제공합니다.

17 Nov 2019

Java - FixedThreadPool(ThreadPoolExecutor), 고정된 쓰레드풀 사용 방법

newFixedThreadPool()로 고정된 쓰레드 개수의 쓰레드풀을 생성할 수 있습니다. ThreadPoolExecutor로 리턴되며, 이 Threadpool에 Task를 추가하여 병렬처리할 수 있습니다. shutdown(), shutdownNow(), awaitTermination() 등의 함수를 제공하여 작업이 완료되는 것을 기다릴 수 있습니다.

09 Nov 2019

Java - Runnable과 Callable의 차이점 이해하기

Thread는 Runnable과 Callable의 구현된 함수를 수행한다는 공통점이 있습니다. 하지만 Runnable은 어떤 객체도 리턴하지 않지만 Callable은 특정 타입의 객체를 리턴한다는 차이점이 있습니다. Thread 외에 ExecutorService도 이 둘을 구현 메소드를 수행할 수 있습니다.

03 Nov 2019

Java - ScheduledThreadPoolExecutor 사용 방법

ScheduledThreadPoolExecutor는 작업을 일정 시간 뒤에 수행하거나, 일정 dealy 간격으로 주기적으로 실행할 수 있습니다. schedule, scheduleAtFixedRate, scheduleWithFixedDelay 등의 메소드를 제공합니다. Callable이나 Runnable을 인자로 받으며 람다식(Lambda)으로 전달할 수 있습니다.

02 Nov 2019

Java - AtomicInteger 사용 방법

AtomicInteger는 int 자료형을 갖고 있는 wrapping 클래스입니다. 멀티쓰레드 환경에서 동시성을 보장합니다. volatile과 다르게 여러 쓰레드에서 값을 write해도 동시성이 보장됩니다. get, set, getAndSet, compareAndSet 등의 함수를 제공해 줍니다.

01 Nov 2019

Java - AtomicIntegerArray 사용 방법

AtomicIntegerArray는 int[] 자료형을 갖고 있는 wrapping 클래스입니다. 멀티쓰레드 환경에서 동시성을 보장합니다. volatile과 다르게 여러 쓰레드에서 값을 write해도 동시성이 보장됩니다. get, set, getAndSet, compareAndSet 등의 함수를 제공해 줍니다.

01 Nov 2019

Java - 시간(Time), 날짜(Date) 비교하는 방법

자바에서 시간(Time), 날짜(Date) 비교하는 방법을 소개합니다. Java8에서 LocalDateTime, LocalDate, LocalTime, ZonedDateTime가 제공됩니다. 이 API에서 날짜/시간을 비교할 수 있습니다. Java8 이전에 사용했던 Date, Calendar로 날짜/시간을 비교할 수 있습니다.

01 Nov 2019

Java - JSON을 파싱하는 가장 쉬운 방법

org.json 라이브러리를 사용하여 JSON을 파싱하는 방법을 소개합니다. JSON은 Object, Array, Key-Value 타입으로 이루어져 있으며 Value는 String, Int, Long, Boolean 등의 타입을 지원합니다.

01 Nov 2019

Java - LocalDateTime을 TimeStamp로 변경하는 방법

java.time.LocalDate, java.time.LocalDateTime을 java.sql.Timestamp으로 변경할 수 있습니다. LocalDateTime, LocalDate은 JAVA8에서 추가된 Time API입니다.

31 Oct 2019

Java - ZonedDateTime을 TimeStamp로 변경하는 방법

java.time.ZonedDateTime을 java.sql.Timestamp으로 변경할 수 있습니다. ZonedDateTime은 JAVA8에서 추가된 Time API입니다.

31 Oct 2019

Java - Char 배열을 String으로 변환하는 방법

Char 배열을 String으로 변환하는 방법입니다. String의 생성자, String.valueOf(), StringBuilder, Stream 등을 이용하여 String으로 변환할 수 있습니다.

31 Oct 2019

Java - String을 Char 배열로 변환하는 방법

String을 Char 배열로 변환하는 방법입니다. String.toCharArray(), Stream 등을 이용하여 Char 배열로 변환할 수 있습니다.

31 Oct 2019

Java - Comparable로 정렬(Sorting)하는 방법, Comparator와의 차이점

Comparable은 인터페이스로 이 인터페이스를 클래스가 구현하면 리스트 등을 정렬하는데 사용할 수 있습니다. compareTo() 메소드의 리턴 값은 음수, 양수, 0이 될 수 있습니다. 음수가 리턴되면 인자의 순서가 아래로 내려갑니다.

31 Oct 2019

Java - Comparator로 정렬(Sorting)하는 방법, Comparable과의 차이점

Comparator 객체를 생성하여 Collections나 배열 등을 정렬할 수 있습니다. Comparator는 익명 클래스 또는 람다식으로 만들 수 있습니다. compare()의 리턴 값은 음수, 양수, 0이 될 수 있습니다. 음수가 리턴되면 오른쪽 인자가 아래로 내려갑니다.

31 Oct 2019

Java - HashSet.add() 사용 방법 및 예제

HashSet의 add() 메소드는 인자로 전달된 아이템을 HashSet에 저장합니다. 그리고 HashSet에 존재하지 않는 아이템이라면 true, 존재하는 아이템이라면 false를 리턴합니다. 저장되는 아이템은 null이 허용되지만, 중복된 값은 허용되지 않습니다. 또한, 저장되는 순서는 보장되지 않습니다.

28 Oct 2019

Java - HashSet.remove() 사용 방법 및 예제

HashSet의 remove()는 인자로 전달된 아이템을 삭제합니다. removeAll()은 Collection의 아이템들을 모두 삭제하며, removeIf()는 람다식을 충족하는 아이템들을 모두 삭제합니다. 이 메소드들은 아이템을 삭제하면 true를 리턴하며 그렇지 않으면 false를 리턴합니다.

28 Oct 2019

Java - AtomicBoolean 사용 방법

AtomicBoolean는 boolean 자료형을 내부에 갖고 있는 wrapping class입니다. 멀티쓰레드 환경에서 동시성을 보장합니다. volatile과 다르게 여러 쓰레드에서 값을 write해도 동시성이 보장됩니다. get, set, getAndSet, compareAndSet 등의 함수를 제공해 줍니다.

27 Oct 2019

Java - HashMap 사용 방법 및 예제

HashMap은 Map의 일종으로 key와 value의 쌍으로 이루어진 데이터를 보관합니다. HashMap은 데이터의 저장순서를 보장하지 않으며 null을 허용합니다. 또한 put, putAll, get, remove, keySet, values 등의 API들을 제공합니다. 예제를 통해 어떻게 해시맵을 사용하는지 알아보겠습니다.

17 Oct 2019

Java - HashMap.forEach() 사용 방법 및 예제

HashMap을 순회할 때 forEach()를 사용할 수 있습니다. forEach()는 인자로 함수형 인터페이스를 받습니다. EntrySet.forEach()와 KeySet.forEach(), Values.forEach() 등도 forEach 메소드를 갖고 있습니다. 이것도 인자로 함수형 인터페이스를 받습니다.

17 Oct 2019

Java - HashSet 사용 방법

HashSet은 중복된 값을 허용하지 않고, 순서를 보장하지 않고, null 값을 저장할 수 있습니다. Set는 List와 다르게 순서가 보장되지 않는 자료구조입니다. 내부적으로 HashMap을 이용하여 데이터를 저장합니다. add(), remove(), removeIf(), removeAll() 등 각각의 메소드를 사용한 예제를 만들어보겠습니다.

16 Oct 2019

Java - Reflection 쉽고 빠르게 이해하기

자바의 리플렉션(Reflection)은 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경할 수 있고 메소드를 호출할 수도 있습니다. Reflection은 Class, Constructor, Method, Field와 같은 정보를 가져올 수 있습니다. 정보를 찾는 방법과 메소드 호출 및 변수를 변경하는 방법에 대해서 알아보겠습니다.

14 Oct 2019

Java8 - Interface의 Default Methods 이해하기

Java8에서 인터페이스에 디폴트 메소드(Default methods)라는 것이 생겼습니다. 디폴트 메소드를 사용하여 인터페이스의 메소드를 선언뿐만 아니라 구현도 할 수 있습니다. 디폴트 메소드를 정의하는 방법과 implements, extends될 때 고려해야할 부분에 대해서 알아보겠습니다. 추상클래스(abstract class)와의 차이점도 알아보겠습니다.

04 Oct 2019

Java8 - 함수형 인터페이스(Functional Interface) 이해하기

함수형 인터페이스는 1개의 추상 메소드를 갖고 있는 인터페이스를 말합니다. Single Abstract Method(SAM)라고 불리기도 합니다. 함수형 인터페이스를 사용하는 이유는 자바의 람다식은 함수형 인터페이스로만 접근이 되기 때문입니다. 자바는 Runnable, Supplier, Consumer, Function, Predicate 등의 기본 Functional Interface를 제공합니다.

04 Oct 2019

Java8 - 메소드 레퍼런스(Method Reference) 이해하기

메소드 레퍼런스(Method Reference)는 Lambda 표현식을 더 간단하게 표현하는 방법입니다. 메소드 레퍼런스는 사용하는 패턴에 따라 다음과 같이 분류할 수 있습니다. Static 메소드 레퍼런스, Instance 메소드 레퍼런스, Constructor 메소드 레퍼런스가 있습니다.

04 Oct 2019

Java8 - SummaryStatistics 예제 및 사용 방법 (count, min, max, average)

SummaryStatistics는 count, min, max, sum average 등의 statistics 정보를 계산해주는 클래스입니다. 그리고 스트림과 함께 사용할 수 있도록 디자인하였습니다. IntSummaryStatistics, LongSummaryStatistics, DoubleSummaryStatistics 클래스로 여러 자료형을 지원합니다.

03 Oct 2019

Java - Try-with-resources로 자원 쉽게 해제하기

try-with-resources는 try(...)에서 선언된 객체들에 대해서 try가 종료될 때 자동으로 자원을 해제해주는 기능입니다. 객체가 AutoCloseable을 구현하였다면 Java는 try구문이 종료될 때 close()를 호출해 줍니다. 코드를 간결하게 만들어 읽기 쉽고 유지보수가 좋은 코드를 작성할 수 있게 도와줍니다.

01 Oct 2019

Java - indexOf(), lastIndexOf()으로 문자열의 위치 찾기

자바 String의 indexOf()와 lastIndexOf()의 사용 방법에 대해서 정리하였습니다. indexOf와 lastIndexOf는 String에서 특정 문자열의 인덱스를 찾는데 사용하는 메소드입니다.

18 Jul 2019

Java - String의 startsWith(), endsWith() 사용 방법

자바 String의 startsWith(), endsWith() 메소드의 사용 방법 및 예제를 소개합니다. startsWith()는 어떤 String이 특정 문자열로 시작하는지를 boolean 타입으로 리턴해줍니다. 반대로 endsWith()는 특정 문자열로 끝나는지 boolean 타입으로 리턴해줍니다.

18 Jul 2019

Java - ArrayList.clone() 사용 방법 및 예제

ArrayList의 clone() 메소드는 ArrayList의 복사본을 리턴합니다. 내부의 아이템들은 얕은복사로 생성됩니다. 내부 코드를 보면 새로운 ArrayList를 생성하고, 리스트의 아이템들을 깊은 복사를 하지 않고 얕은 복사(shallow copy)로 새로운 ArrayList에 set합니다. 예제를 통해 알아보겠습니다.

29 Mar 2019

Java - ArrayList.clear() 사용 방법 및 예제

ArrayList의 clear()는 리스트의 객체를 모두 삭제하는데 사용되는 메소드입니다. 코드를 보면 내부의 배열을 모두 null로 초기화하고 size를 0으로 설정합니다. 예제를 통해 어떻게 사용하고 결과가 어떻게 되는지 알아보겠습니다.

28 Mar 2019

Java - ArrayList.contains() 사용 방법 및 예제

ArrayList의 contains()는 리스트 안에 어떤 객체가 있는지 확인하는데 사용하는 메소드입니다. 객체를 인자로 전달받고, 리스트에 그 객체가 존재하면 true를 리턴합니다. 그렇지 않으면 false를 리턴합니다. 객체 존재 유무로 boolean을 리턴하기 때문에, if와 함께 사용할 수 있습니다.

28 Mar 2019

Java - ArrayList.forEach() 사용 방법 및 예제

ArrayList의 forEach()는 리스트를 순회(iterate)하는데 사용되는 메소드입니다. Consumer 객체를 인자로 받으며 리스트의 모든 아이템에 대해서 Consumer.accept()가 수행되도록 합니다. 또한, 인자는 람다로 표현할 수 있어 코드를 더욱 간단하게 만듭니다. 예제로 알아보겠습니다.

28 Mar 2019

Java - ArrayList.get() 사용 방법 및 예제

ArrayList의 get()는 리스트에서 어떤 객체를 가져오는데 사용되는 메소드입니다. 만약 리스트 크기보다 큰 인덱스를 인자로 전달하면 IndexOutOfBoundsException를 발생시킵니다. 예제를 통해 어떻게 사용하고 어떨 때 예외가 발생할 수 있는지 알아보겠습니다.

28 Mar 2019

Java - ArrayList.indexOf() 사용 방법 및 예제

ArrayList의 indexOf()는 인자로 전달된 객체가 리스트에 존재한다면, 아이템의 인덱스를 리턴합니다. 앞쪽부터 인자와 동일한 객체가 있는지 찾으며, 존재한다면 그 인덱스를 리턴합니다. 없다면 `-1`을 리턴합니다. 동일한 객체가 2개 이상 존재할 때, 가장 앞에 위치한 객체의 인덱스를 리턴합니다.

28 Mar 2019

Java - ArrayList.lastIndexOf() 사용 방법 및 예제

ArrayList의 lastIndexOf()는 인자로 전달된 객체가 리스트에 존재한다면, 아이템의 인덱스를 리턴합니다. 리스트의 뒤쪽부터 인자와 동일한 객체가 있는지 찾으며, 존재한다면 그 인덱스를 리턴합니다. 없다면 -1을 리턴합니다. 리스트에 동일한 객체가 2개 이상 존재할 때, 가장 뒤쪽에 위치한 객체의 인덱스를 리턴합니다.

28 Mar 2019

Java - ArrayList.addAll() 사용 방법 및 예제

ArrayList의 addAll() 메소드는 인자로 전달되는 Collection 객체의 모든 아이템을 리스트에 추가합니다. ArrayList.addAll(Collection c)는 콜렉션의 모든 것을 리스트 마지막에 추가합니다. ArrayList.addAll(int index, Collection c)는 특정 인덱스부터 추가합니다.

27 Mar 2019

Java - ArrayList.remove() 사용 방법 및 예제

ArrayList의 remove()는 리스트의 객체를 삭제하는데 사용되는 메소드입니다. ArrayList.remove(int index)는 인자로 전달된 인덱스의 아이템을 리스트에서 삭제합니다. ArrayList.remove(Object o)는 인자와 동일한 객체를 리스트에서 삭제합니다. 예제를 통해 자세히 알아보겠습니다.

27 Mar 2019

Java - ArrayList.removeAll() 사용 방법 및 예제

ArrayList의 removeAll() 메소드는 인자로 전달된 Collection의 아이템들과 일치하는 객체를 리스트에서 삭제합니다. 인자로 콜렉션을 받으며 리스트에 콜렉션의 아이템과 동일한 객체가 있다면 모두 삭제해 줍니다. 예제를 통해 어떻게 사용하는지 알아보겠습니다.

27 Mar 2019

Java - ArrayList.removeIf() 사용 방법 및 예제

ArrayList의 removeIf() 메소드는 인자로 전달된 조건으로 리스트의 아이템들을 삭제합니다. ArrayList.removeIf(Predicate<? super E> filter)`는 인자로 Predicate를 받습니다. Predicate는 람다 표현식으로 전달할 수 있으며, 리스트에서 아이템을 필터링하는 조건을 표현하고 있습니다.

27 Mar 2019

Java - ArrayList.add() 사용 방법 및 예제

ArrayList의 add() 메소드는 인자로 전달된 객체를 리스트에 추가합니다. 인자가 다른 두개의 메소드가 있습니다. ArrayList.add(E e)는 리스트에 인자로 전달된 객체를 추가합니다. ArrayList.add(int index, E e) 인자의 인덱스에 해당하는 위치에 객체를 추가합니다.

25 Mar 2019

Java - 현재 작업 디렉토리(Working directory) 구하는 방법

프로그램 실행 중에 현재 작업 디렉토리를 가져올 수 있습니다. 첫번째는 System.getProperty("user.dir")로 작업 디렉토리에 대한 경로를 가져오는 방법이고, 두번째는 현재의 상대경로를 절대경로로 변환하는 방법이 있습니다. 두가지 방법에 대해서 알아보겠습니다.

23 Mar 2019

Java - Date에 년,월,일을 더하고 빼는 방법

Date에 날짜를 더하는 다양한 방법에 대해서 알아보겠습니다. Date 객체에 월, 일을 추가하는 방법을 알아보겠습니다. 그리고 두개의 Date 객체를 더하는 방법을 알아보겠습니다. Date는 1970년을 기반으로 측정된 시간이기 때문에 `Calendar`를 이용하여 날짜 연산을 하였습니다.

23 Mar 2019

Java - 현재 날짜, 시간 구하는 방법

현재 날짜, 시간을 가져오고 다양한 형식(Format)으로 출력하는 것을 알아보겠습니다. 이 글의 예제는 LocalDateTime와 DateTimeFormatter을 사용하여 날짜 및 시간을 출력하였습니다. 또한 DateTimeFormatter를 사용하여 다양한 형태로 날짜를 출력하고, 또는 자신이 원하는 형태로 날짜를 출력하도록 하였습니다.

23 Mar 2019

Java - String을 파싱하여 LocalDate로 변환하는 방법

LocalDate와 DateTimeFormatter 라이브러리를 이용하면 문자로 된 날짜를 Date 객체로 변환할 수 있습니다. 스트링을 Date객체로 변환하면 날짜 계산 등 데이터를 처리하는데 편리합니다. 예제를 통해 어떻게 문자열을 LocalDate 객체로 변환할 수 있는지 알아보겠습니다.

23 Mar 2019

Java에서 Map과 List를 순회하는 방법 (Loop, 반복문)

자바에서 List와 Map을 순회하는 방법은 여러가지입니다. Map은 Map.Entry를 가져오는 방법, key를 가져오는 방법 그리고 forEach와 람다표현식으로 간단히 루프 코드를 구현할 수 있습니다. List도 for로 순회를 하거나, forEach와 람다 표현식으로 구현할 수도 있습니다.

22 Oct 2018

Java8의 Stream Collect 사용 방법 및 예제

Collect는 Stream의 데이터를 변형 등의 처리를 하고 원하는 자료형으로 변환해 줍니다. List 또는 Set 자료형으로 변환하거나, joining 또는 Sorting하여 1개의 객체를 리턴하기도 합니다. 또는 아이템들의 평균 값을 리턴해주기도 합니다. Collectors는 collect를 보다 편하게 사용하게 도와주는 라이브러리입니다.

09 Oct 2018

Java8의 Stream reduction 사용 방법 및 예제

reduce는 Stream의 데이터를 변환하지 않고, 더하거나 빼는 등의 연산을 수행하여 하나의 값으로 만들 수 있습니다. 예를 들어 수열을 계산하는데 사용할 수 있습니다. 또한 병렬처리를 적용하여 연산 속도를 향상시킬 수 있습니다.

09 Oct 2018

Java8의 Stream find, match 사용 방법 및 예제

find는 스트림에서 찾은 아이템을 리턴해 줍니다. 관련 함수는 findFirst()와 findAny()가 있습니다. match는 스트림에서 찾고자 하는 특정 아이템이 있으면 true를 리턴해줍니다. 관련 함수들로 anyMatch(), allMatch(), noneMatch()이 있습니다.

15 Jul 2018

Java8의 Optional 사용 방법 및 예제

Optional은 어떤 객체를 wrapping하는 객체입니다. 어떤 객체를 포함할 수 있고 또는 null 객체를 포함할 수 있습니다. Optional.of, Optional.empty, Optional.filter, Optional.ofNullable, Optional.orElseGet 등의 사용방법을 알아보겠습니다.

15 Jul 2018

Java8의 Stream max, min 사용 방법 및 예제

max는 Comparator로 스트림의 아이템들을 모두 비교하여 가장 큰 값 1개를 리턴합니다. min은 반대로 가장 작은 값을 넘겨줍니다. Comparator는 함수의 인자로 전달하고, 직접 구현할 수 있기 때문에 자신이 원하는 조건을 비교하는데 적용할 수 있습니다.

14 Jul 2018

Java8의 Stream sorted 사용 방법 및 예제

sorted는 스트림의 아이템들을 정렬하여 새로운 스트림을 생성합니다. 이를 사용하려면 정렬하려는 객체에 대한 Comparable가 구현되어야 합니다. comparing(String::length), sorted(Comparator), sorted() 등의 사용 방법을 알아보겠습니다.

14 Jul 2018

Java8의 Stream concat 사용 방법 및 예제

Concat은 두개의 Stream을 하나의 스트림으로 합치는데 사용됩니다. 예를 들어, Concat은 두개의 스트림을 하나의 스트림으로 만들 수 있습니다. 사전적인 의미처럼 Stream.concat(A, B)은 A와 B의 스트림을 하나의 스트림으로 생성해줍니다.

13 Jul 2018

Java8의 Stream distinct 사용 방법 및 예제

distinct는 스트림의 중복 아이템을 제거하는데 사용됩니다. stream1.distinct()은 스트림에서 중복을 제거한 새로운 스트림을 반환합니다. 중복 객체인지 판단하는 기준은 Object.equals(Object)의 결과 값입니다. 기본객체 뿐만 아니라 Custom 객체도 적용할 수 있습니다.

13 Jul 2018

Java8의 Stream limit과 skip 사용 방법 및 예제

limit은 어떤 스트림에서 일정 개수만큼만 가져와서 새로운 스트림을 리턴해줍니다. Stream.limit(숫자)은 숫자만큼 아이템을 가져와 새로운 스트림을 생성하여 리턴해줍니다. skip은 limit과 반대입니다. Stream.skip(숫자)은 숫자만큼 아이템을 건너띄고 그 이후의 아이템들로 새로운 스트림을 생성합니다.

13 Jul 2018

Java8 Stream의 filter와 map, flatMap 사용 방법 및 예제

Java8의 Stream filter는 말 그대로 특정조건으로 스트림의 컨텐츠를 필터링하고 새로운 스트림을 생성합니다. map은 각각의 item을 변경하여 새로운 컨텐츠를 생성하는 기능입니다. FlatMap은 여러개의 스트림을 한개의 스트림으로 합쳐줍니다. 복잡한 스트림을 간단한 스트림으로 변경되는데 사용할 수 있습니다.

30 Jun 2018

Java - ExecutorService를 사용하는 방법

Executors와 ExecutorService를 이용하면 간단히 쓰레드풀을 생성하여 병렬처리를 할 수 있습니다. 어떤 작업들을 병렬로 처리하려면 ExecutorService, SingleThreadExecutor, Future, BlockingQueue를 이용해야 합니다. 예제로 구현 방법을 알아보겠습니다.

25 Jun 2018

Java8의 Stream 생성 방법 및 예제

Java8의 Stream 생성방법에 대해서 알아봅니다. Stream.of(), Stream.generate(), Stream.iterate(), Stream.empty() 등을 이용하여 Stream을 다루는 방법에 대해서 알아봅니다.

25 Jun 2018

Gradle로 Java 빌드하는 방법

훌륭한 IDE도 많지만, 터미널에서 gradle 만으로 직접 자바 프로젝트를 빌드하고 싶습니다. 간단한 에디터만으로 자바 프로젝트를 만들고 그래들로 빌드하는 과정을 정리하였습니다. gradle wrapper를 사용하여 우분투 및 윈도우에서 모두 빌드가 가능하도록 만들었습니다.

28 Jan 2018
codechachaCopyright ©2019 codechacha