Language 65

Java - 실수하기 쉬운 메모리 누수의 5가지 패턴!

메모리 누수(Leak) 자바에서 메모리 누수는 더 이상 사용되지 않는 객체들이 GC(가비지 컬렉션)에 의해 소멸되지 않고 누적되는 현상입니다. 가비지 컬렉션의 소멸 대상이 되려면 다른 Reference 변수에서 참조하고 있지 않아야 합니다. Miner GC MinerGC는 Young 영역에 오래 되지 않은 객체를 사용이 끝나면 소멸합니다. 소요시간은 Young 영역의 크기에 따라 다르지만, 대체로 1초 미만입니다. JVM을 중지하지도 않고, 빠르고 효율적으로 동작합니다. 객체가 사용이 끝나면 Miner GC에서 정리되는 것이 유리합니다. Major GC Miner GC에서 정리되지 못하고, 객체가 오래되면 Young영역에서 Old영역으로 이동됩니다. Major GC는 Old영역의 객체를 소멸하는 역할을 ..

Language/Java 2022.04.15

Java - Concurrent Programming (Runnable, Executor, Callable, Future 등)

자바 Concurrent 프로그래밍 Concurrent S/W란 동시에 여러 작업을 할 수 있는 소프트웨어를 말합니다. 예를 들어, 크롬에서 무언가를 다운로드할 때 PC가 멈춰있는 게 아니라, 다른 작업을 병행할 수 있습니다. 자바에서는 멀티 프로세싱과 멀티쓰레드를 지원합니다. 우리가 잘 아는 스프링도 자바의 멀티쓰레드를 이용해서 많은 사용자들의 요청을 동시다발적으로 처리합니다. Thread Thread를 상속하면 새로운 Thread 클래스를 새롭게 정의할 수 있습니다. public class Main { public static void main(String[] args) { HelloThread helloThread = new HelloThread(); helloThread.start(); } sta..

Language/Java 2022.04.03

Java - Arrays.asList vs List.of 차이 (완벽 정리)!

Arrays.asList() / List.of 자바에서 Array를 List으로 변환하기 위해서는 Arrays.asList(array)를 사용합니다. Java 9 버전 부터는 List.of(array)라는 새로운 팩토리 메소드를 도입했습니다. 차이점은 무엇일까요 ? 뭐가 좋은 걸까? 변경 가능 여부 (Mutable / Immutable) Arrays.asList()로 반환된 list는 변경이 가능합니다. 하지만, List.of()에서 반환된 메서드는 변경이 불가능합니다. List list = Arrays.asList(1, 2, null); list.set(1, 10); // OK List list = List.of(1, 2, 3); list.set(1, 10); // Fails with Unsupport..

Language/Java 2022.03.27

자주 사용하는 정규식 총 정리!

정규식 정규식(Regular expressions, Regex)는 문자열에서 문자열을 검색, 치환을 위한 용도로 사용합니다. 예를 들어, 어떤 문자열이 "name: {text} email: {text} address: {text} phone: {number}" 구조인지 확인해야 한다고 가정합니다. 심지어 name은 알파벳이어야 하고, email에서는 @와 .을 허용하고, phone은 숫자여야 하는 등을 구현하려면.. 구현하는 것도 일이고 알아보기도 힘들겁니다. 정규식을 사용하면 이를 간결한 코드로 해결할 수 있을 뿐 아니라, 정규식을 사용하면 생각보다 다양한 것을 할 수 있습니다. 예시 abc 간단한 문자열을 정규표현식으로 사용하면 해당 문자열들을 선택할 수 있습니다. abcaabcaaabc a.c '...

Language/Algorithm 2022.03.26

Java 8 - 새로운 Date & Time 정리 (Zoda-Time) [Instant, LocalDate, Duration ...]

Joda-Time Java 8 이전에는 Date 관련 API들이 가지는 문제들을 해결하기 위해서, Joda-Time 이라는 라이브러리를 사용했습니다. 그래서 Java 8부터는 Joda-Time이 자바 표준 라이브러리로 들어왔습니다. Joda-Time는 다음과 같은 클래스를 지원합니다. Instance LocalDate & LocalTime DateTime Duration & Period ... 기존 Date 관련 API의 문제점 Java 8 이전에 사용하던 Date 관련 클래스는 Date, Calander, SimpleDateFormat 등이 있습니다. 하지만 많은 문제가 있어서, 자바 8 버전 이후 부터는 새로운 날짜 관련 API들을 제공합니다. 기존 클래스들의 문제입니다. 1. 부적절한 클래스, 메소..

Language/Java 2022.03.16

Java 8 - Optional이란?

Optional Optional은 Null 검사를 기존의 번거로운 방법에서 벗어나기 위해 Java 8 버전부터 제공하는 클래스입니다. Optional는 T타입의 객체를 포장합니다. Optional을 사용하면 T타입 객체가 null일때 결과를 핸들링하거나, null이 아니라 비어 있는 Optional을 반환해서 NullPointerException을 방지할 수 있습니다. 문제 (예시) ThreadLocal이라는 클래스가 있다고 가정합시다. public class ThreadLocal { DBInfo info; public DBInfo getDBInfo() { return info; } } 만약 아래 코드에서 ThreadLocal.getDBInfo()의 결과가 null이 되면 어떻게 될까요? 많이 발생하는 ..

Language/Java 2022.03.12

Java 8 - Stream이란? (+ ParallelStream)

Stream 자바 8에서 추가된 스트림(Streams)은 컬렉션, 배열 등에 저장된 요소들을 하나씩 참조하면서 코드를 실행할 수 있는 기능입니다. Stream을 사용하면, 불필요한 for문을 사용하지 않을 수 있고, 람다식을 활용할 수 있어서 코드를 직관적이게 처리할 수 있습니다. [참고] Stream은 아래와 같은 특징들이 있습니다. Stream은 데이터를 담는 저장소는 아니다. Stream은 데이터를 변경하지 않는다. Stream은 재사용할 수 없다. Stream은 각 요소가 1번씩 처리된다. Stream은 무제한일 수도 있다. (실시간으로 계속 들어올 수 있음) Stream API 사용법 Stream API는 데이터.Stream생성().중개연산()...종료연산(); 구조로 사용합니다. Stream..

Language/Java 2022.03.11

Java 8 - 인터페이스의 default method, static method 사용!

자바8 버전부터는 인터페이스에서 Default method와 Static method를 사용할 수 있습니다. 개인적으로는 클래스랑 인터페이스의 경계가 조금 허물어지는게 아닌가.. 하고 조금 의아하기도 했습니다. 하나씩 살펴봅시다. Default method 기본 메소드(default method)는 interface에서 메서드 내용을 정의하고, 그대로 재사용할 수 있게 해줍니다. public interface Printer { String getName(); default void printNameUpperCase() { System.out.println(getName().toUpperCase()); } } public class HoneyPrinter implements Printer { @Overri..

Language/Java 2022.03.09

Java - 람다(Lambda)의 멀티 쓰레드(multi-thread) [외부 변수를 final만 허용하는 이유]

람다와 final ? 아래의 코드는 람다식을 사용한 코드입니다. public static void main(String[] args) { int num = 10; Runnable printNum = () -> System.out.println(num); } 위코드는 문제 없이 실행됩니다. 그런데 아래 코드를 보시면 num++; 한 줄 추가했을 뿐인데, 컴파일 에러가 납니다. 에러가 나는 이유는 Java8 람다에는 외부 지역 변수가 final이어야 한다는 조건이 있기 때문입니다. Q. 엥? 그런데 첫 번째 코드에서는 final이 없는데 에러가 왜 안났지? -> 이유는 num변수는 현재 effectively final이기 때문입니다. 변수가 초기화되고 값의 변화가 한 번도 없다면, 컴파일러에서는 해당 변수를..

Language/Java 2022.03.09

Java 8 - 함수형 인터페이스를 사용하는 방법!

함수형 인터페이스 함수형 인터페이스는 1개의 추상 메소드를 갖는 인터페이스를 말합니다. 함수형 인터페이스는 함수형 프로그래밍에 주로 사용하고, 꼭 함수형 프로그래밍이 아니더라도 적용할 수 있습니다. Q. 함수형 인터페이스를 왜 사용할까? A. 자료뿐만 아니라 행위(함수)도 하나의 값으로 취급하기 위함입니다. 함수를 하나의 값으로 취급해서, 함수들을 조립하고 배치하면서 개발하기 위해 함수형 인터페이스를 사용합니다. 구현 An informative annotation type used to indicate that an interface type declaration is intended to be a functional interface as defined by the Java Language Specif..

Language/Java 2022.03.05