사진찍는 개발자 블로그

💻 개발/Java 8

자바 스레드(Thread) 간단 정리

모든 자바 프로그램은 기본적으로 스레드를 사용한다. JVM이 실행되면 main 메서드를 실행할 주 스레드뿐 아니라 가비지 컬렉션이나 객체 종료(Object Finalization)와 같은 JVM 내부 작업을 담당할 스레드도 생성된다. 자바 언어에서 사용할 수 있는 스레드(Thread)는 크게 데몬 스레드(Daemon Thread)와 일반 스레드(Non-daemon thread)로 나뉜다. Daemon Thread 자바에서 데몬 스레드(Daemon Thread)는 다른 일반 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이다. 다른 말로 하면 다른 스레드에 대한 백그라운드 스레드를 지원하는 특수한 스레드라고 할 수 있다. JVM이 처음 시작될 때 main 스레드를 제외하고 JVM이 내부적으로 사용기 ..

💻 개발/Java 2022.01.23

Java - Object.clone()

최근 프로젝트를 진행하다가 clone() 메서드로 인스턴스를 복사한 후 복사된 인스턴스의 상태 값을 변경하면 원본 인스턴스의 값도 바뀌는 문제를 겪었었다. 해당 버그를 수정하면서 clone 메서드에 대해 찾아보고 테스트해본 내용을 정리해보려고 한다. clone() 메서드의 사용법 자바 Object 클래스의 clone() 메서드는 자바 언어에서 지원하는 객체 복사 메서드이지만 간단하게(?) 사용할 수 있는 메서드는 아니다. clone() 메서드의 선언부를 보면 아래와 같이 작성되어 있다. protected native Object clone() throws CloneNotSupportedException; 하나씩 살펴보자. 일단 접근 제한자가 protected로 되어있다. 복사하려는 객체 외부에서는 접근할..

💻 개발/Java 2020.09.26

Lombok - getter/setter의 prefix 관련 설정

Lombok(https://projectlombok.org/)의 @Getter, @Setter 어노테이션을 사용하면 getter, setter 메서드를 자동으로 생성 해주기 때문에 코드 작성량을 많이 줄여주어 실무에서 많이 사용된다. @Getter @Setter public class Member { private String name; private int age; private boolean active; } public class LombokTest { public static void main(String[] args) { Member member = new Member(); // 생성된 setter member.setName("jun"); member.setAge(30); member.setAc..

💻 개발/Java 2020.08.23

Guava EventBus 간단 사용법

Guava 라이브러리의 EventBus를 사용하면 굉장히 쉽고 간단하게 Publish/Subscribe 방식의 이벤트 처리를 구현할 수 있다. 회사 프로젝트 코드에서도 많이 사용하고 있어서 간단하게 정리해봤다. EventBus 생성 EventBus는 이벤트를 처리할 각 이벤트 리스너를 등록하고 각 리스너에게 이벤트를 전파하는 역할을 수행한다. EventBus 객체는 다음과 같이 생성자를 호출해서 간단하게 생성할 수 있다. EventBus eventBus = new EventBus(); 혹은 생성자 파라미터에 문자열 값을 넘겨서 이벤트버스의 이름을 지정할 수 있다. EventBus eventBus = new EventBus("myEventBus"); 참고로 이름을 설정하지 않으면 기본 이름은 "defaul..

💻 개발/Java 2020.08.07

Java BigDecimal 크기 비교하기

업무 중 BigDceimal 타입으로 된 가격을 비교하는 코드를 작성하다가 떠올라서 간단히 정리해봤다. 1. 동등 비교 두 개의 BigDecimal 값이 같은지 비교하기 위해 먼저 '==' 비교를 생각해 볼 수 있다. BigDecimal a = BigDecimal.valueOf(100.0); BigDecimal b = BigDecimal.valueOf(100.0); System.out.println(a == b); 위의 코드처럼 값이 100.0으로 동일한 2개의 BigDecimal을 == 연산자로 비교했을때 출력은 어떻게 될까? 쉽게 예상할 수 있듯이 답은 false 이다. 자바에서 == 연산자를 사용한 비교는 두 객체가 동일한 객체인지를 비교하는 것이기 때문이다. 사실 BigDecimal 값이 같은지를..

💻 개발/Java 2020.07.18

자바 컬렉션을 Null Safe 하게 정렬하기

자바 8에 도입된 스트림(Stream)을 사용하면 컬렉션을 쉽게 정렬할 수 있다. (Stream이 아니더라도 List 인터페이스의 sort() 메서드를 사용할 수도 있다.) 예를 들어 Member를 나이 순으로 정렬한다면 아래와 같이 할 수 있다. List memberList = Arrays.asList(Member.of(10), Member.of(5), Member.of(20)); List sortedMemberList = memberList.stream() .sorted(Comparator.comparing(Member::getAge)) // member의 age 속성을 기준으로 정렬한다. .collect(toList()); System.out.println(sortedMemberList); 결과 [..

💻 개발/Java 2020.07.04

Mockito : Mock 리스트를 주입하고 테스트 하기

상황 스프링을 사용하여 빈을 주입 받을때, 같은 타입(interface)을 구현한 빈들을 아래와 같이 컬렉션으로 주입 받아 사용하는 경우가 있다. public interface Validator { void validate(Order order); } @Service public class OrderValidationService { @Autowired private List validatorList; public void validate(Order order) { for (Validator component : validatorList) { component.validate(order); } } } 단위 테스트 프레임워크로 JUnit을 사용하고 Mockito 라이브러리를 사용할 때, OrderValid..

💻 개발/Java 2020.02.14

Java Stream에서 allMatch() 사용시 주의할 점

Stream.allMatch() Java 8에 포함된 Stream 클래스에는 모든 요소들이 주어진 조건에 만족하는지 여부를 검사하는 allMatch()메서드를 제공한다. 예를 들어, 모든 회원의 나이가 5살 이상인지 검사하는 테스트 코드를 다음과 같이 작성할 수 있다. @Test public void allMatchTest1()) { List members = new ArrayList(); members.add(Member.withAge(10)); members.add(Member.withAge(20)); members.add(Member.withAge(30)); boolean result = members.stream().allMatch(member -> member.getAge() > 5); asse..

💻 개발/Java 2019.03.30