JAVA

    Java - 시간을 다루기 및 테스트

    사전 지식 LocalDateTIme에 대해 더보기 자바에서는 시간을 다루는 여러 방법이 있습니다. 이번에는 자바 8로 넘어오면서 사용하는 LocalDateTime에 대해 알아보겠습니다. Date 기존 제공하던 클래스로 `java.util.Date`에 존재합니다. 문제는 기준이 1900년으로 값을 넣어줄 때, 1900년을 기준으로 현재 날짜를 넣어줘야 한다는 단점이 있습니다. 따라서 @Test void utilDateTest() { // given // 기준 시간이 1900년대 Date date = new Date(122,8,21); // when System.out.println(date); // then // Wed Sep 21 00:00:00 KST 2022 } 1900을 기준으로 하며, 각 값이 불..

    Mockito 간단 정리

    Mockito란? Mockito는 자바에서 테스트용으로 사용되는 Mocking 프레임워크입니다. 여러 Mock객체를 대신 간편하게 만들어 줘서 사용할 수 있습니다. 대체로 A라는 클래스가 여러 의존성을 가지고 있을 때 A에 대한 클래스만 집중하여 테스트 하고 싶을 때 다른 의존성들을 전부 Mock으로 변환시켜 사용하게 됩니다. (결국 클래스 단위 테스트를 진행하고자 할 때 사용하게 됩니다.) Mockito를 사용하기 위해선 외부 라이브러리인 만큼 주입을 해줘야 겠죠 Mockito Dependency // Gradke implementation 'org.mockito:mockito-core:5.4.0' // Maven org.mockito mockito-core MockitoExtension.class v..

    SOLID 원칙

    객체지향의 설계 원칙 우리가 좋은 코드를 작성하고자 하는 가장 큰 이유는 서비스를 잘 운영하기 위해서라고 생각합니다. 결국 돈과 관련되어 있기 때문에 유지 관리하기 쉽고 확장성을 위해 유연한 소프트웨어를 만들고자 하는게 아닌가 싶습니다. 많은 사람들이 객체지향을 하면서 좋은 코드를 작성하기 위해 항상 말하는 SOLID원칙에 대해서 알아보겠습니다. SRP (Single Responsibility Principle : 단일 책임 원칙) 하나의 클래스는 한 가지 책임만 가져야 한다. 또한 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나 책임? 저는 책임이라는 말을 '행동' 이라는 단어에서 힌트를 얻었습니다. '너가 한 행동에 대한 책임을 가져라'와 같이 말이죠. 결국 여기서 말하는 책임은, 클래스가..

    [자바 인 액션] 6. 스트림 데이터 수집

    스트림 최종 연산 최종적으로 중간연산을 통해 구성된 파이프라인을 연산하여 데이터 들을 소비하는 동작 [컬렉터] Collector 인터페이스 구현은 스트림의 요소를 어떤 식으로 도출할지 지정 [고급 리듀싱 컬렉터] Collectors 클래스에서 제공하는 여러 팩토리 메서드 기능이 있다. 스트림 요소를 하나의 값으로 리듀스하고 요약 : 리스트에서 총합 등 요소 그룹화 : 결과를 각각 그룹화 요소 분할 : Predicate를 사용한 분할을 사용한다. 갯수를 세는 컬렉터 long test = transactions.stream().collect(Collectors.counting()); long test2 = transactions.stream().count(); 최댓값 검색 Optional notCalorie..

    [자바 인 액션] 5. 스트림 활용

    스트림 활용 1. Filtering T -> boolean 고유 요소 필터링 : distinct List dishes = menu.stream() .filter(Dish::isVegetarian) .collect(Collectors.toList()); List dishes2 = menu.stream() .filter(dish -> dish.getFat() < 400) .distinct() .collect(Collectors.toList()); filter는 기본적으로 반환값이 boolean이다. menu.stream(): 컬렉션을 스트림으로 변환 filter(Dish::isVegetarian): dish클래스의 isVegetarian메서드를 메서드 참조하여 해당 조건을 필터링, 반환 = Stream(Di..

    [자바 인 액션] 4. 스트림

    스트림 스트림 컬렉션 데이터를 처리하는 하나의 파이프라인 SQL과 같이 반복문 없이 조건만으로 구현을 한다. 멀티코어를 활용한 컬렉션 요쇼 병렬처리 가독성이 좋아진다. filter, sorted, map, collect같은 여러 빌딩 블록 연산을 통해 파이프라인 구축이 가능하다. 데이터 처리 연산을 지원하도록 소스에서 추출된 연속 요소 연속된 요소: 컬렉션과 같은 연속된 데이터를 계산 소스: 제공받은 데이터들을 소비하며 데이터 소스의 순서를 유지한다. 데이터 처리 연산: 데이터베이스와 비슷한 연산을 가진다. 스트림 구조 파이프라이닝: 스트림 연산은 각 스트림 연산을 연결하여 파이프라인을 구성 가능 내부반복: 컬렉션과 달리 스트림은 내부 반복을 지원한다. [스트림 vs 컬렉션] 가장 큰 차이 = 데이터를 ..

    [자바 인 액션] 3. 람다 표현식

    람다 익명 클래스로 다양한 동작을 구현할 수 있지만, 인터페이스를 구현하고 해당 인터페이스를 상속받는 클래스를 만들고 사용하던지 아님 익명 클래스를 사용해야 했습니다. [람다의 특징] 익명 클래스를 단순화 한 것 파라미터 리스트, 바디, 반환형식, 예외리스트를 가질 수 있다. 익명성 : 메서드의 이름이 없다. 함수 : 특정 클래스에 종속되지 않는다. 전달 : 람다 표현식 자체를 메서드 인수로 전달하거나 변수로 저장 가능 간결성 : 간결하게 코드 가능 [함수 디스크립터] 함수의 선언에서 반환타입 함수이름 (파라미터 타입, 파라미터 타입2); 와 같이 지정할 수 있다. 이와 같이 람다도 이러한 타입을 부를 수 있는데 바로 함수 디스크립터이다. () -> void (Apple, Apple) -> int (in..

    [자바 인 액션] 2. 동작 파라미터화

    동작 파라미터화 계속 변화하는 요구조건에 최소한의 비용으로 계속 대응하기 위하는 것은 프로그래머에게 중요한 요소이다. 동작 파라미터화를 이용하면 이러한 변화에 더 쉽게 대응할 수 있다. 이를통해 유지보수가 쉬워진다. 동작 파라미터화가 할 수 있는 기능 리스트의 모든 요소에 대해 `어떤 동작` 수행 가능 리스트 관련 작업을 끝낸 후 `어떤 다른 동작`이 가능 에러가 발생하면 `정해진 다른 동작` 수행 가능 아래는 실제 책에서 제공했던 예시이다. [만약 : 초록색일 때만 수집한다면] public static List filterGreenApples(List inventory) { List result new ArrayList(); for (Apple apple : inventory) { if (apple.g..

    [자바 인 액션] 1. 자바의 변화

    자바의 변화 모든 언어는 자신의 장점으로 생존을 도모했는데 자바의 경우 크게 3가지로 대중적이게 되었습니다. `캡슐화`를 통해 c언어 비해 언지니어링적인 문제가 적다.. 객체지향적인 모델 플랫폼에 독립적이다. [외적인 환경의 변화] 하지만 빅데이터나 멀티코어 컴퓨터, 컴퓨팅 클러스터를 이용해서 빅데이터등의 대용량 데이터를 효과적으로 처리할 필요성이 증가했다. 이러한 이유 등으로 자바 하드웨어나 프로그래머의 기대에 부응하는 방향으로 변화하기 위해 여러 큰 변화를 가져왔다. [변화1 : stream processing] 스트림은 데이터를 처리하는 하나의 파이프라인 스트림의 특징 파이프라인의 의미와 같게 파이프라인의 출력은 다른 파이프라인의 입력으로 갈 수 있다. [변화2 : 동작 파라미터화] 특정 기능 자체..

    [자바스터디] 쓰레드 동작 순서

    쓰레드 동작 순서 쓰레드 스케쥴링 운영체제가 CPU자원을 여러 쓰레드들 간에 할당하는 과정 우선 순위, 실행시간, 상태 등을 고려하여 CPU를 각 쓰레드들에게 적절하게 할당하여 시스템 전체의 성능을 향상시킵니다. 쓰레드 상태 NEW : 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태 RUNNABLE : 실행 중 또는 실행 가능한 상태 BLOCKED : 동기화 블럭에 의해서 일시정지된 상태 ( Lock이 풀릴 때까지 기다리는 상태 ) WAITING, TIMED_WAITING : 쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은 일시정지된 상태 TERMINATED : 쓰레드의 작업이 종료된 상태 실행 대기열 QUEUE와 같은 구조로, 다음 실행을 위해 대기하는 상태 쓰레드 스케쥴링 과정 쓰레드..