자바

    동시성 제어하기

    동시성 제어하기

    Ticket을 발행하는 파일럿 프로젝트를 진행하며 겪은 동시성 문제를 해결하는 글입니다. Ticket을 받지 않은 사용자에게 Ticket을 발행해 주는 파일럿 프로젝트입니다. 우선 Ticket을 발행하는 코드입니다. 플로우를 간단하게 살펴보면 사용자가 티켓을 받았는지 확인 후 안 받았다면 몇 번째로 예약했는지 번호 담아 Ticket 발부에 성공하게 됩니다. 정확히 동작하고 있는지 테스트 코드를 작성해 보자. 우선 순차적으로 코드를 작성했을 때 테스트코드다. 순차적으로 Ticket을 발행하는 테스트는 통과한다. 하지만 동시에 Ticket을 발행하면 어떻게 될까? 동시에 Ticket을 발행하게 되면 테스트는 실패한다. 왜 실패할까? 로그를 살펴보자 위 로그를 보면 Lock을 얻는 과정에서 Deadlock이 ..

    스트림

    모던 자바 인 액션 정리본 스트림 스트림은 자바 8 API에 새로 추가된 기능 스트림 특징 스트림을 사용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. ( 데이터를 직접 처리하는 구현 코드 대신 질의로 표현 ) 또한 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. filter, sorted, map , collect 같은 연산은 고수준 빌딩 블록으로 이루어져 특정 스레드 모델에 제한되지 않고 자유롭게 사용할 수 있다. 따라서 데이터 처리 과정을 병렬화하면 스레드와 락을 걱정할 필요가 없다. - 선언형 : 더 간결하고 가독성이 좋아진다. - 조립할 수 있음 : 유연성이 좋아진다. - 병렬화 : 성능이 좋아진다. 스트림 정의 스트림이란 데이터 처리 연산을 지원하도록 소스에서 추..

    JVM이란

    JVM이란

    Java공부를 하면 JVM 이란 단어를 많이 들어보고 공부해 봤을 것이다. 이번 기회에 JVM에 대해 자세히 알아보자. JVM이란? -Java Virtual Machine - 자바를 실행시키기 위한 가상 기계라고 해석할 수 있다. - 사용자의 OS에 종속받지 않고 OS 위에서 가상 기계를 통해 자바를 실행시킨다. 따라서 자바는 사용자의 OS 종류에 관계없이 자바를 실행할 수 있다. - 구성 : 자바 인터프리터, JIT , 클래스 로더, Runtime Data Area, 가비지 컬렉터로 되어있다. JIT & Interpreter 위의 그림을 보게 되면 java 파일을 컴파일러를 통해 .class 파일로 변환한 뒤 JVM이. class 파일을 받아 바이트 코드의 명령에 따라 내재된 기능을 수행한다. Java..

    람다 표현식

    모던 자바 인 액션 정리본 람다 표현식 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이라고 할 수 있다. 람다의 특징 - 익명 : 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. - 함수 : 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. - 전달 : 람다 표현식을 메서드 인수로 전달하거나 변수로 저장할 수 있다. - 간결성 : 익명 클래스처럼 코드를 구현할 필요가 없다. 람다는 세 부분으로 이루어진다. ( Apple a1, Apple a2 ) -> a1.getWeight().compareTo(a2.getWeight()); 람다 파라미터 화살표 람다 바디 - 파라미터 리스트 : Comparator의 compare 메서드 파라미터 ( 사과 두 개 ) - 화살표 : 화..

    동적 파라미터화

    모던 자바 인 액션 정리본 동적 파라미터화란? 동적 파라미터화란 메서드가 다양한 동작을 받아서 내부적으로 다양한 동작을 수행할 수 있다. 책에선 이렇게 쓰여있다. 이를 해석하자면 함수의 파라미터로 들어온 인자가 변수뿐만 아니라 메서드로 들어와 함수 내에서 다양한 동작 즉, 인자로 들어온 메서드를 수행할 수 있다.라고 해석할 수 있다. ApplePredicate를 이용한 필터 메서드를 통해 동적 파라미터를 어떻게 동작시키는지 알아보자. public static List filter(List inventory, ApplePredicate p) { List result = new ArrayList(); for (Apple apple : inventory) { if (p.test(apple)) { result...

    Java List 와 배열

    Java List 와 배열

    자바를 공부하며 List와 배열의 차이점을 자세히 알지 못해 이번 기회에 제대로 정리해보려 합니다. 1. 배열 우선 크기가 3인 정수형 배열을 선언해 봅시다. int[] arr = new int[3]; 배열을 선언하게 되면 같은 자료형의 원소들이 정해진 크기의 배열이 메모리에 할당합니다. 여기서 포인트는 정해진 크기, 같은 자료형입니다. 정해진 크기가 존재하기 때문에 배열의 크기를 늘리거나 줄일 수 없습니다. 원소가 들어있지 않은 배열이나 꽉 찬 배열이나 같은 크기의 같은 자료형의 배열이라면 메모리에 같은 크기가 각각 할당됩니다. 또한 메모리에 연속적으로 할당됩니다. - 시간 복잡도 원소 접근 : O(1) 2. List 그림을 보면 더 쉽게 이해가 가능합니다. 우선 Java에서 List는 Interfac..