프로그래밍/Java

    소수 계산 어떻게 해결해야할까?

    만약 글을 읽는 분께서, 돈과 관련된 업무 또는 정확한 수치를 기반으로 진행해야 하는 업무를 맡게 된다면 어떻게 하시겠습니까? float이나 double을 해답으로 생각하셨다면 한번 이 글을 통해 더 나은 방법에 대해 같이 고민해보는게 좋을 것 같습니다. float과 double의 문제점 float과 double은 연산했을 때, 나오는 가장 유명한 문제 입니다. 코드는 java를 기준으로 작성되었습니다. public class FloatTest { public static void main(String[] args) { float a = 0.1f; float b = 0.2f; if(a + b == 0.3){ System.out.println("a + b == 0.3"); } System.out.print..

    Java volatile이란?

    자바 volatile 키워드에 대해 알아보기 전에 앞서, 관련된 내용인 컴퓨터 구조와 관련된 내용에 대해 간단하게 설명하려 합니다. Memory-wall Problem Memory-wall 문제는 컴퓨터 구조에서 CPU(프로세서)의 속도가 메모리 시스템과 데이터를 주고받는 속도를 능가할 때 발생하는 현상을 말합니다. 그로인해 프로세서는 빠른 연산 처리속도를 가짐에도 불구하고 메모리에서 CPU로 데이터를 가져올 때까지 기다려야 하므로 성능이 느려지고 속도도 제한되게 됩니다. 따라서 위 그림과 같이 CPU(그림에서의 Core 영역)는 CPU cache를 둠으로써, CPU와 메모리 사이의 데이터 전송 속도 문제를 해결했습니다. 하지만 이로 인해, CPU cache의 데이터와 RAM사이의 데이터가 일치하지 않는..

    함수형 프로그래밍

    함수형 프로그래밍은 함수를 사용하여 문제를 해결하는 것을 강조하는 프로그래밍 패러다임 중 하나 입니다. 함수형 프로그래밍의 주요 특징으로는 다음과 같습니다. 특징 불변성 : 함수형 프로그래밍에서 데이터는 불변입니다. 한번 생성되면 변경할 수 없습니다. 이렇게 함으로써 불변성을 가진 데이터를 사용하는 함수에 부작용(Side-Effect)가 없게 되어 프로그램이 동작하는 방식에 대해 좀 더 쉽게 추론할 수 있습니다. 또한 불변성의 또 다른 이점으로 동시성 프로그래밍 시에, 데이터의 불일치 문제를 해소할 수 있습니다. 불변성을 가진 데이터는 여러 스레드가 공유되는 한 데이터에 접근하더라도 변경이 불가능하기에, 동시성 상황에서 자주 일어날 수 있는 문제인 데이터 정합성 문제를 방지할 수 있습니다. 변경이 가능한..

    G1 GC에 대해

    현재 진행중인 굿즈 포유 프로젝트는 JDK 17 버젼을 사용하고 있습니다. 문득 프로젝트를 진행하던 중, 현재 사용하는 GC는 무엇이며 어떤 장점과 단점이 있고 내부적으로 어떻게 동작할까에 대해 의문이 들어 이 글을 작성하게 되었습니다. ➕ JDK 17버전을 기준으로 사용중인 CPU가 1개면 Serial GC가 실행되고, CPU가 2개 이상이라면 G1 Gc가 실행됩니다. 위 두가지 GC중 G1 GC에 집중해서 알아보도록 하겠습니다. Garbage Collection에 대해 알아보기전에 중요한 키워드는 stop-the-world 입니다. stop-the-world란, GC를 실행하기 위해 JVM이 애플리케이션 실행을 잠시 멈추는 것 입니다. stop-the-world가 발생하면 GC를 실행하는 쓰레드를 제..

    Singleton 패턴과 스프링에서는 Singleton 패턴을 어떻게 사용하고 있을까?

    개요 현재 프로젝트에서 스프링을 사용하고 있습니다. 스프링을 사용하다 보면, 스프링은 IOC(Inversion Of Control -제어의 역전)컨테이너를 이용해, 스프링 Bean을 관리한다고 설명하고, 스프링Bean은 기본적으로 Singleton으로 Bean 객체를 생성한다고 알고 있었습니다. 그럼 이와 관련된 내용중 Singleton방식이 무엇인지 먼저 디자인 패턴에서의 Singleton 패턴에 대해 알아보고, 스프링에서는 Singleton 패턴을 어떻게 사용하고 있는지 알아보도록 하겠습니다. 디자인 패턴 에서의 Singeleton Pattern 싱글톤 패턴을 객체를 생성할 때, 인스턴스를 오직 한개만 제공하는 클래스입니다. 즉 객체를 처음 생성한 후 그 후에 해당 객체를 재생성할때는 동일한 객체를 ..

    Long 과 AtomicLong은 어떤 차이가 있을까?

    개요 프로젝트를 진행하면서 HashMap을 이용해 Key-Value 형태로 된 InMemory DB를 직접 구현하던 도중, 유저의 정보를 저장할 때 Long Type으로 선언된 유저의 ID값을 증가시켜줘야 하는 경우가 생겼습니다. 이때 대부분 ID 값을 id++ 과 같은 연산을 통해 수행할 텐데, 이렇게 증가 연산을 수행하게 되면 어떤 문제가 발생하게 되는지 그리고 어떻게 해결해야 할지 알아보도록 하겠습니다. 먼저 아래와 같은 연산을 통해 id값을 증가해 준다고 가정하겠습니다 public class UserTable { //예시용 테이블 클래스 Long userId; public void incrementUserId() { userId++; } } 이렇게 작성된 코드는 싱글 스레드 환경에서는 정확하게 동..

    ConcurrentHashMap은 어떻게 동시성 문제를 해결할까?

    개요 현재 진행중인 프로젝트에서 유저의 정보를 저장하는 저장소를 In-Memory Database로 간단하게 구현해야 할 필요가 생겨 구현을 진행하던 도중 유저의 정보를 저장하기에 적합한 자료구조로 Map을 선정했습니다. 그 중 자바에서 제공해주는 Map 인터페이스의 구현체로 HashMap과 ConcurrentHashMap이 있습니다 그 중 저는 현재 진행중인 프로젝트는 웹 프로젝트이고, 동시성 문제가 발생할 수 있기 때문에, 이런 상황에 사용하기 적합하다고 알려져 있는 ConCurrentHashMap을 사용하기로 했습니다. 하지만 현재 ConCurrentHashMap이 어떤 방식으로 동작하는지, 어떤 장 단점이 있는지 제대로 알지 못하기에 이번 기회에 사용을 하기에 앞서 학습을 해보고자 글을 작성합니다..

    Java Thread Pool?

    쓰레드 풀(Thread Pool) 스레드 풀은 스레드 생성 및 삭제가 빈번하게 일어남에 따라 발생하는 메모리 할당에 소모되는 비용문제를 해결하기 위해 만들어졌습니다. 그에 대한 자세한 내용은 아래에서 이어서 설명하겠습니다. Thread Pool이 만들어진 이유 Thread가 필요하면 new 키워드를 이용해 각 Thread 인스턴스를 생성하는 방식을 사용했었습니다. 한번, 두번 사용하고 반납해야 하는 그런 상황이라면 개별적으로 Thread 인스턴스를 생성해 사용해도 상관이 없습니다. 그러나 Java 언어를 이용해 만들어지는 서버 애플리케이션은 수많은 Thread를 필요로 하며 초 단위로 Thread를 생성하여 사용하고 반납해야 합니다. 위 그림 처럼 사용자의 각각의 요청마다, 메모리에 쓰레드를 생성하고 삭..