본문 바로가기

Programming/Java

(14)
[Java] 병렬 데이터 처리(병렬 스트림, 포크/조인 프레임워크) 병렬 처리(Parallel Operation)란 멀티 코어 환경에서 하나의 작업을 분할해 각각의 코어가 병렬적으로 처리하는 것이다. 자바7 이전에는 데이터 컬렉션을 병렬 처리하기 위해서는 데이터를 분할하고 각각의 스레드로 할당 해야한다. 하지만 스레드는 경쟁 상태(race condition)가 발생할 수 있어 동기화가 필요하고, 마지막에는 각 스레드에서 발생한 부분 결과를 하나로 합치는 과정이 필요하다. 하지만 병렬 스트림과 포크/조인 프레임워크를 사용하면 쉽게 병렬 처리가 가능하다 동시성과 병렬성 둘 다 멀티 스레드의 동작 방식이라는 점은 동일하지만 목적이 다르다. 동시성(Concurrency) 멀티 작업을 위해 멀티 스레드가 번갈아가며 실행하는 성질이다. 싱글 코어 CPU를 이용한 멀티 작업은 병렬적..
[Java] String.replaceAll() 활용하기 자바에서 replaceAll(regex, replacement)는 문자열에서 정규식과 일치하는 문자열을 찾아 replacement로 바꾸어주는 메소드이다. replaceAll()은 내부적으로 Matcher.appendReplacement()를 사용하는데 Matcher에서 사용했던 것과 유사하게 그룹핑을 통해 일치하는 문자열을 골라 커스텀이 가능하다. ([Java] Pattern, Matcher Class 사용법과 메소드 정리) System.out.println("abcdefg".replaceAll("\\w", "*")); // ******* 기본적으로 사용하면 String.replaceAll()을 사용한다면 위와 같은 형태로 출력이 가능하다. 주어진 \\w과 일치하는 문자열을 모두 찾아 *로 변환하는 것..
[Java] 스트림(Stream) 활용 필터링 filter filter 메소드는 Predicate를 인수로 받아 true를 반환하는 요소만을 포함하는 스트림을 반환한다 List numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .filter(i -> i % 2 == 0) .forEach(System.out::println); // 2 // 4 distinct 중복을 제거한 요소를 반환한다. 중복 여부는 객체의 hashCode(), equals() 메소드로 판별한다. List numbers = Arrays.asList(1, 1, 2, 2, 3); numbers.stream() .distinct() .forEach(System.out::println); // 1 // 2 // 3 슬라이싱 Pre..
[Java] 스트림(Stream) 스트림 스트림(Stream)은 Java8부터 추가된 컬렉션(배열 포함)의 요소를 하나씩 참조해 람다식으로 처리할 수 있도록 하는 반복자이다. 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소 List list = Arrays.asList("A", "B", "C", "D"); // 스트림 사용❌ Iterator iter = list.iterator(); while(iter.hasNext()){ String name = iter.next(); System.out.println(name); } // 스트림 사용⭕ Stream stream = list.stream(); list.stream().forEach(name -> System.out.println(name)); 특징 선언형 선언형으로 코드를 구..
[Java] 람다(lambda) 람다(lambda)란? 람다 표현식은 메서드로 전달할 수 있는 익명 함수(anonymous function)을 생성하기 위한 식이다. 매개 변수를 가진 코드 블럭이지만 런타임시에는 익명 구현 객체를 생성한다 // 인터페이스의 익명 구현 객체 Runnable runnable = new Runnable() { public void run() { ... } } // 람다식 Runnable runnable = () -> { ... }; 인터페이스 변수명 = 람다식; 자바는 메소드만 단독으로 생성이 불가능하고 항상 클래스의 구성 멤버로 선언해야 한다. 따라서 람다는 메소드를 선언하는 것이 아닌 메소드를 가진 익명 구현 클래스를 생성하는 것이다. 람다식은 인터페이스 변수에 대입하고 대입될 인터페이스에 따라 작성법이..
[Java] Boxing, Unboxing 자바는 참조형(Refernce Type)이거나 기본형(Primitive Type)이다. 하지만 제네릭 타입은 참조형만 사용이 가능하기 때문에 자바에서는 기본형을 참조형으로 변환하는 기능을 제공해준다. 이러한 기능을 박싱(boxing), 반대를 언박싱(unboxing)이라고 한다. Prmitive Type==== boxing =====>Wrapper Type Integer Integer number = new Integer(100); int sum = 10 + number; // Integer -> int 하지만 이러한 변환 과정은 비용이 소모된다. 또한 박싱된 값은 Heap영역에 저장되기 때문에 보다 많은 메모리를 소모하고 가져올 때에도 메모리 탐색 과정이 필요하다.
[Java] Arrays.sort(), Collections.Sort() 속도 비교 알고리즘 문제를 풀며 이론적으로는 $O(n\log n)$의 시간 복잡도를 가진다고 알고 있던 정렬 함수들이 컬렉션의 종류에 따라 같은 코드지만 시간 차이가 많이 나는 것을 보고 실제 시간이 얼마나 차이 나는지 알아보기 위해 테스트를 진행해 보았다. 하는김에 PriorityQueue와 TreeMap도 얼마나 걸리는지 궁금해서 함께 테스트했다. 모두 같은 코드로 구성되어 있으며, 테스트데이터만 변경하면서 실험해 보았다. 같은 데이터로 10회 반복해 평균을 낸 시간을 정리했다. 버전 : Java 15 코드 : Github 테스트 데이터 : 출처 - Startlink/boj-sort-test 1️⃣ 이미 정렬되어있는 데이터 1부터 10,000,000까지의 숫자가 오름차순 정렬되어있는 데이터 2️⃣ 역순으로 정렬..
[Java] 어노테이션(Annotation) 자바에서 어노테이션(Annotation)은 메타데이터(metadata)라고 볼 수 있다. 💡 메타데이터 애리케이션이 처리해야 할 데이터가 아닌 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지 알려주는 정보. 데이터를 위한 데이터. 데이터를 설명해주는 데이터 컴파일러에게 문법 에러를 체크하거나, 코드를 자동으로 생성하도록 정보를 제공하거나, 실행 시 특정 기능을 실행하는 정보를 제공, 자동으로 파일을 생성하는 용도 등으로 사용할 수 있다. 어노테이션의 대표적인 예는 @Override가 있다. 컴파일러가 정확히 오버라이드가 되지 않았다면 에러를 발생시키게 하는 것이다. 생성하기 public @interface MyAnnotation { // 타입 엘리먼트명() [default 디폴트값];..