반응형

IT/Java 12

자바의 비동기 API

자바에서 제공하는 비동기 API가 두 개를 기본적인 내용을 알아보겠습니다. Future 형식 API Reactive 형식 API 비동기 API는 계산이 오래 걸리는 메서드 또는 네트워크나 사람의 입력을 기다리는 메서드에 사용하면 애플리케이션의 효율성을 크게 향상시킬 수 있습니다. 특히, 네트워크나 사람의 입력으로 기다리는 경우에 자원을 낭비하지 않고 효율적으로 하단의 시스템을 활용할 수 있습니다. 어떤 상황일 때 둘을 사용할 수 있을까요? Reactive 형식의 비동기 API는 보통 일련의 이벤트를 비동기로 처리하고 싶을 때 사용하는데 적합니다. 반면 Future 형식의 API는 일회성의 하나의 결과를 처리하는데 적합한 비동기 방법입니다. 다음 포스팅에서 두 비동기 API 방식에 대해서 구체적으로 알아보..

IT/Java 2023.01.15

Runnable과 Thread

자바에서 스레드를 구현할 수 있는 방법은 두 가지가 있습니다. Runnable Runnable은 인터페이스 입니다. 인터페이스를 이용해서 구현하면 재사용성이 높고 코드의 일관성을 유지할 수 있습니다. 또한, 다른 클래스를 상속 받아서 사용할 수 있습니다. Runnable 인터페이스는 아래와 같습니다. 추상 메서드 run()를 가지고 있어서 반드시 오버라이딩하여 구현해 주어야 합니다. @FunctionalInterface public interface Runnable { /** * When an object implementing interface {@code Runnable} is used * to create a thread, starting the thread causes the object's * ..

IT/Java 2023.01.11

프로세스와 스레드 그리고 멀티 태스킹

컴퓨터를 켜서 유튜브 음악을 들으면서, 게임을 하고, 카톡을 하는 멀티 태스킹은 어떻게 가능한 것일까요? 멀티 태스킹을 가능하게 해주는 프로세스와 쓰레드에 대해서 정리해보겠습니다. 프로세스 프로세스는 프로그램이 실행중인 상태를 나타냅니다. 사용자가 프로그램을 실행하면 CPU는 보조 기억 장치에서 메인 메모리로 데이터를 가져와서 코드를 해석하며 작업을 합니다. 이때 메인 메모리에 올라와서 실행되고 있는 상태를 프로세스라고 합니다. 프로세스가 멀티 태스킹을 하기 위한 방법은 두 가지가 있습니다. 첫 번째는 병렬처리 입니다. 네 개의 작업이 있다고 할 때, 네 개의 코어가 있다면 한 개의 코어가 한 개의 작업을 맡아서 처리하면 됩니다. 두 번째는 병렬처리 입니다. 마찬가지로 네 개의 작업이 있다고 할 때, 두..

IT/Java 2023.01.10

동시성(Concurrency) 과 병렬성(Parallel)

공부하다 보니 동시성과 병렬성이라는 용어가 나왔습니다. 어떤 의미를 나타내는지 기억하고 싶어서 찾아보고 정리해 봤습니다. 동시성 병렬성 싱글 코어에서 멀티 쓰레드로 동작하는 방식 멀티 코어에서 멀티 쓰레드를 동작하는 방식 여러 작업이 동시에 실행되는 것처럼 보이는 것 여러 작업이 실제로 동시에 실행되는 것 논리적 개념 물리적 개념 그림으로 보면 직관적으로 이해하실 수 있습니다. 코어 개념을 추가한다면 아래와 같습니다. 참고 - 내용 : https://seamless.tistory.com/42 - 이미지 * https://www.baeldung.com/cs/concurrency-vs-parallelism * https://www.slideshare.net/RubyMeditation/concurrency-i..

IT/Java 2023.01.10

Optional 클래스 사용

Optional은 반환 값을 선택적으로 하기 위해서 사용할 수 있습니다. 일반적으로 반환 값이 null일 때에 발생하는 에러를 방지할 수 있습니다. null를 확인하는 코드를 작성하다 보면 번거로운 코드 줄을 작성할 때가 있습니다. null을 다루는 Optional에 대해서 알아 보겠습니다. Optional의 사용 방법은 간단합니다. Optional 클래스로 값을 감싸면 됩니다. 만약에 값이 없을 경우에 Optional은 빈 값을 감싸서 반환합니다. 그래서 null을 다룰 수 있습니다. 예시에 사용될 데이터 모델을 정의하겠습니다. public class Person { private Optional car; public Optional getCar() { return this.car; }; public ..

IT/Java 2023.01.08

Map 처리

자바 8 이후에 추가된 Map의 디폴트 메서드를 다루어 보겠습니다. 맵을 이용할 것이기 때문에 기본 데이터를 생성하겠습니다. 아래 맵으로 계속 이어나가겠습니다. Map alphabets = new HashMap(Map.ofEntries( entry("1", "a"), entry("2", "b"), entry("3", "c"), entry("4", "d"), entry("5", "e") )); forEach() 맵에서 키와 값을 반복하면서 확인하는 작업은 꽤나 번거롭습니다. for문으로 몇 줄 작성해야 합니다. 이러한 번거로움을 forEach 메서드로 간단하게 할 수 있습니다. alphabets.forEach((key, value) -> System.out.println(value + " is " + va..

IT/Java 2022.12.19

Arrays.asList() vs ArrayList()

리스트를 만들 때 주로 사용하는 두 가지 메소드에 대해서 살펴보겠습니다. 같을 것 같으면서도 다른 이 둘의 차이점을 주로 보겠습니다. Arrays.asList() 배열을 고정된 리스트 객체로 만들어 주는 메소드 입니다. 단지 원본 배열을 감싸서 리스트로 만들기 때문에 데이터가 저장된 주소가 동일합니다. 그래서 복사되거나 새로 만들어지지 않습니다. 고정된 길이를 갖기 때문에 요소를 제거하거나 추가할 수 없습니다. 만약에 시도한다면 에러 메시지를 받습니다. 그러나 배열에 존재하는 요소를 변경할 수는 있습니다. Arrays.asList()로 만들어진 리스트의 요소를 변경한다면 원본 배열의 요소도 변경됩니다. String[] stringArray = new String[] {"a", "b", "c", "d"};..

IT/Java 2022.12.19

팩토리 패턴 (Factory Pattern)

객체 지향 디자인 패턴의 기본 원칙 중 '확장에 있어서는 열려 있어야 하고 수정에 있어서는 닫혀 있어야 한다'를 알고 있을 거예요. 수정이 발생할 가능성이 높은 부분은 따로 분리하여 관리하는 것이 좋습니다. 팩토리 패턴은 객체의 생성을 담당하는 클래스를 한 곳에 모아서 관리하는 것입니다. 예시를 통해서 어떻게 팩토리 패턴을 이용할 수 있는지 경험해 보겠습니다. 아래 예시는 도형의 모양을 만드는 것을 팩토리 패턴으로 만들어 본 것입니다. 1 단계 : Shape 인터페이스 생성 public interface Shape { void draw(); } 2 단계 : Shape 구현 public class Rectangle implements Shape { @Override public void draw() { S..

IT/Java 2022.11.07

[함수형 데이터 처리] 스트림

스트림이라는 용어는 주변에서 많이 들어봤습니다. 스트리밍 서비스가 가장 대표적인 일 겁니다. 아래 그림으로 보시면 이해가 쉬울 것 같습니다. 왼쪽 이미지는 DVD에 데이터 전체가 저장되어서 재생되는 것을 보여줍니다. 오른쪽 이미지는 인터넷을 통해서 일부의 데이터가 들어오면 그 부분만 재생하여 보여주는 것을 표현합니다. 스트림이란 정확히 무엇일까요? 스트림은 '데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소'로 정의될 수 있습니다. '데이터 처리 연산'은 함수형 프로그래밍 언어에서 지원하는 연산과 비슷한 연산을 지원합니다. 예를 들어, filter, map, reduce, match 등을 지원합니다. '소스'는 스트림으로 변환하기 위한 데이터를 말합니다. 컬렌션, 배열, I/O 자원 등이 있습니..

IT/Java 2022.09.25

기본형과 참조형 변수

자바에서 int와 Integer의 차이는 무엇일까? 기본형 변수 기본형 변수는 실제 값을 저장합니다. 실제 값을 저장하기 때문에 산술 연산이 가능합니다. 그리고 null로 초기화 할 수 없습니다. 기본형 변수는 스택(stack)에 실제 값을 저장하여 사용합니다. boolean, char, byte, short, int, long, float, double 이 있습니다. 참조형 변수 저장된 값의 주소를 값으로 갖습니다. 기본형 변수 8개를 제외한 나머지 타입들 입니다. 주소 값을 갖기 때문에 산술 연산이 불가능 합니다. 하지만 null로 초기화 할 수 있습니다. 참조형 변수는 힙(heap)에 실제 값을 저장하고 해당 주소를 스택에 저장하여 사용합니다. 마치 객체들이 하는 것과 같습니다. Integer, B..

IT/Java 2022.09.04
반응형