컨터런트 API 자바 5에서 처음 소개한 컨커런트 API는 스레드에서 데이터 정합성을 확보하고 멀티 스레드 환경에서 프로그래밍하기 위해 필요한 5가지 특징이 있다. 병렬 애플리케이션에서 데이터의 동기화와 정합성을 확보하기 위해 Lock 객체를 제공하며 이를 통해 잠금 기능을 사용할 수 있다. 스레드를 실행하고 관리하는 고수준 API를 사용한 Executors 클래스를 제공한다. 이 클래스는 Executor 인터페이스를 구현한 것으로 대량 데이터를 병렬 처리하기에 적합하다. 병렬 프로그램에서 대량 데이터의 정합성을 유지한채 사용하기 위한 컬렉션 프레임워크의 확장판인 컨커런트 컬렉션 클래스를 제공한다. 원자적 변수는 동기화를 위한 synchronized 키워드 사용을 최소화하여 성능을 확보하면서 메모리 정합..
상황 휴대폰번호 010 - 1234 - 5678 번호의 3가지가 각 객체로 존재한다. String front = "010"; String middle = "1234"; String back = "5678"; 위 3가지 객체를 붙여서 hpno 객체를 완성한다. String hpno = front + middle + back; 여기에 문제점이 존재한다. front, middle, back 변수 중 null 값이 존재한다면 "null"로 그대로 완성된다. String hpno = front + middle + back; // middle 이 null일 경우 log.info(hpno); // "010null1234" 해결방안 front, middle, back 각 객체의 null 체크를 하여 if-else로 처..
람다표현식 메서드를 하나의 식(expression)으로 표현한 것이다. 메서드를 람다식으로 표현하면 메서드 이름과 반환값이 존재하지 않기 때문에 이를 '익명함수' 라고도 한다. 람다표현식의 뜻을 글로만 보면 감이 안올 수 있다. 아래 예제로 어떤식으로 람다표현식이 사용되는지 눈으로 확인하자. 람다식 예제 import dto.SampleDto; import java.util.ArrayList; import java.util.Comparator; import java.util.List; public class Basic { private void test() { List sampleDtoList = new ArrayList(); // 람다식 사용 sampleDtoList.sort( (SampleDto sam..
가비지 컬렉션 (Garbage Collection) 유효하지 않은 메모리(Garbage)를 자동으로 제거해주는 작업이다. Java Appliation은 JVM(Java Virtual Machine)위에서 구동되는데, JVM의 기능 중 더이상 사용하지 않는 객체를 청소하여 메모리 공간을 확보하는 작업이다. GC가 필요한 이유는? Heap 영역에 저장되는 객체들이 계속해서 쌓이게되면 OutOfMemoryException이 발생하여, 이를 방지하기 위해 주기적으로 사용하지 않는 객체를 수집하여 제거해줘야한다. 예제 Test test = new Test(); test.setId(1L); test.setName("seohae"); testRepository.save(test); test = null; // 더이상..
Stream 코드 /* num sum */ int numSum = param.chars() .filter(Character::isDigit) .map(a -> Character.digit(a, 10)) .sum(); 결과 param = "K1C57PQR" numSum = 13 (1 + 5 + 7)
Stream 코드 String chars = param.chars() .sorted() .mapToObj(ch -> (char) ch) // Stream .filter(ch -> !Character.isDigit(ch)) .map(Object::toString) .collect(Collectors.joining()); 각 단계별로 Stream 형태 확인 결과 param = "AC2B332" chars = "ABC"
Stream 코드 private static void getPairs() { List numbersA = Arrays.asList(1, 2, 3); List numbersB = Arrays.asList(4, 5); List pairs = numbersA.stream() .flatMap(i -> numbersB.stream() .map(j -> new int[]{i, j})) .collect(toList()); for (int[] a : pairs) { System.out.println(Arrays.toString(a)); } } 결과 [1, 4] [1, 5] [2, 4] [2, 5] [3, 4] [3, 5]
TreeMap TreeMap이란, 이진트리를 기반으로 한 Map 컬렉션이다. TreeMap 은 아래와 같이 Key 와 값이 저장된 Map, Entry를 저장한다. 이진 검색트리의 형태로 key-value 쌍으로 이루어진 데이터(Entry)를 저장하는데에 유용하다. HashMap 과 비교하자면, TreeMap 은 범위 검색 또는 정렬 사용에 더 유연하다. TreeMap 에 실행되는 자동 정렬은, 기본적으로 부모 키 값과 비교하여 키 값이 낮은 것은 왼쪽에, 키 값이 높은 것은 오른쪽에 Map.entry 를 저장한다. public static TreeMap map = new TreeMap(); static { map.put(1, "ABC"); map.put(2, "DEF"); } ... treeMap의 특정..
Serializable interface Serializable.java public interface Serializable { } Person.java class Person implements Serializable { String name; String job; // transient String job; // transient : 이 멤버는 직렬화 대상에서 제외한다. (default 값 null 로 출력될거임) public Person() { } public Person(String name, String job) { this.name = name; this.job = job; } public String toString() { return name + "," + job; } } Serializ..
interface Comparable 매개변수를 1개 받는다. package java.lang; import java.util.*; public interface Comparable { /* ... */ public int compareTo(T o); } Comparable 구현하기 1) 오름차순 public class Member implements Comparable { ... public int compareTo(Member member) { /** 오름차순 출력 */ if (this.memberId > member.memberId) { return 1; } else if (this.memberId < member.memberId) { return -1; } else { return 0; } } }..
Todo. 가장 긴 문자열 추출하기 1. Stream 사용 public class ReduceTest { public static void main(String[] args) { String values[] = {"Hello", "World", "!"}; /* 가장 긴 length 문자열 추출 */ String reduce = Arrays.stream(values).reduce("", (s1, s2) -> { if (s1.getBytes().length >= s2.getBytes().length) { return s1; } else { return s2; } }); } } 2. Lamda 사용 class CompareString implements BinaryOperator { @Override publ..
Function keyExtractor 선언 public class Test { private final Function keyExtractor; public Test(Function keyExtractor) { this.keyExtractor = keyExtractor; } ... } 호출 Test test = new Test(TestDto::getName) 람다식 전달 (TestDto::getName) 사용코드 public void testMethod(TestDto testDto) { /* 해당 item 으로 추출하겠다 */ String key = keyExtractor.apply(testDto); } name 을 key 값으로 추출될 것이다.