Java(8)
-
[Java] synchronized 키워드
Synchronized Java는 크게 3가지 메모리 영역을 가지고 있다. static 영역 heap 영역 stack 영역 자바 멀티 스레드 환경에서는 스레드끼리 static 영역과 heap 영역을 공유하므로 공유 자원에 대한 동기화 문제를 신경 써야 한다. 원자성 문제를 해결하기 위한 방법 중 하나인 synchronized 키워드에 대해 설명하려고 한다. synchronized는 lock을 이용해 동기화를 수행하며 4가지의 사용 방법이 존재한다. synchronized method static synchronized method synchronized block static synchronized block Synchronized method public class Method { public stat..
2022.08.26 -
[Java] volatile 키워드
Java에서는 가시성 문제를 해결하기 위해 volatile 키워드를 사용하게 된다. 이번 글에서는 volatile 키워드를 통해 가시성을 보장하는 방법을 간단한 예시와 함께 알아보자. 가시성을 보장하지 못한 예제 public class Volatile { private static boolean stopRequested; public static void main(String[] args) throws InterruptedException { Thread backgroundThread = new Thread(() -> { int i = 0; while (!stopRequested) { i++; } }); backgroundThread.start(); Thread.sleep(1000); stopReques..
2022.08.25 -
[Java] Java의 동시성 이슈
동시성 프로그래밍에서 발생할 수 있는 문제점 컴퓨터의 CPU와 RAM의 관계도를 그려보면 다음과 같은 그림이 될 것이다. CPU가 어떤 작업을 처리하기 위해 데이터가 필요할 때, CPU는 RAM의 일부분을 고속의 저장 장치인 CPU Cache Memory로 읽어들인다. 이 읽어들인 데이터로 명령을 수행하고, RAM에 저장하기 위해서는 데이터를 CPU Cache Memory에 쓴 다음 RAM에 쓰기 작업을 수행한다. 그러나 CPU가 캐시에 쓰기 작업을 수행했다고 해서 바로 RAM으로 쓰기 작업을 수행하지 않는다. 반대로 읽기 작업도 해당 데이터가 RAM에서 변경이 되었다고 해도, 언제 CPU Cache Memory가 아닌 RAM에서 데이터를 읽어 들여서 CPU Cache Memory를 업데이트 할지 보장하..
2022.08.25 -
[Java] Stream API의 고급 활용 및 사용 시 주의점 - 4/5
1. FlatMap을 통한 중첩 구조 제거 [ FlatMap이란? ] 만약 우리가 처리해야 하는 데이터가 2중 배열 또는 2중 리스트로 되어 있고, 이를 1차원으로 처리해야 한다면 어떻게 해야 할까? 이러한 경우에 map을 이용해도 결과는 2중 Stream의 형태일 것이다. 이처럼 중첩 구조를 한 단계 제거하기 위한 중간 연산이 필요한데, 이것이 바로 flatMap이다. flatMap은 Function 함수형 인터페이스를 매개 변수로 받고 있다. 예를 들어 다음과 같이 2중 리스트가 존재한다고 할 때, 이를 1중 리스트로 변환하기 위해서 flatMap을 이용할 수 있다. // flatMap 함수 Stream flatMap(Function
2022.08.25 -
[Java] 람다식과 함수형 인터페이스 - 2/5
1. 람다식(Lambda Expression)이란? Stream 연산들은 매개변수로 함수형 인터페이스(Functional Interface)를 받도록 되어있다. 그리고 람다식은 반환값으로 함수형 인터페이스를 반환하고 있다. 그렇기 때문에 우리는 Stream API를 정확히 이해하기 위해 람다식과 함수형 인터페이스에 대해 알고 있어야 한다. [ 람다식(Lambda Expression) 이란? ] 람다식(Lambda Expression)이란 함수를 하나의 식(expression)으로 표현한 것이다. 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류라고 볼 수 있다. 익명 함수(Anonymous Function)란 함수의 이름이 없..
2022.08.24 -
[Java] Stream API에 대한 이해 - 1/5
1. Stream API에 대한 이해 [Stream API에 대한 소개] Java는 객체지향 언어이기 때문에 기본적으로 함수형 프로그래밍이 불가능하다. 하지만 JDK8부터 Stream API와 람다식, 함수형 인터페이스 등을 지원하면서 Java를 이용해 함수형으로 프로그래밍할 수 있는 API 들을 제공해주고 있다. 그 중에서 Stream API는 데이터를 추상화하고, 처리하는데 자주 사용되는 함수들을 정의해두었다. 여기서 데이터를 추상화하였다는 것은 데이터의 종류에 상관 없이 같은 방식으로 데이터를 처리할 수 있다는 것을 의미하며, 그에 따라 재사용성을 높일 수 있다. 예를 들어 주어진 배열이나 리스트의 데이터를 정렬된 상태로 출력하고자 한다고 하자. Stream API를 사용하지 않은 경우 다음과 같이..
2022.08.24