Language
[Java] System.out.println의 사용을 지양하자
[Java] System.out.println의 사용을 지양하자
2024.06.21개발자는 프로젝트를 진행하면서 요청을 기록 및 관찰하기 위해 logging을 한다. 아마 초반에 토이 프로젝트를 하다보면 요청이 잘 갔는지 확인해보기 위해 System.out.println을 사용하는 경우가 많을 것이다. 이번에 말할 주제는 제목과 같이 System.out.println의 사용을 지양해야 한다는 것이다. 왜 그래야하는지 한 번 살펴보자. logging framework만약 자바/스프링부트 기반의 프로젝트를 진행해봤다면, 스프링부트 프로젝트 생성 시 로깅 프레임워크들(log4j2, logback 등)이 추가되는 것을 볼 수 있다. 이 로깅 프레임워크들을 이용해서 다음과 같이 logging을 할 수 있다.class App { public static void main(String[] ..
[Java] 위도/경도 값에 BigDecimal or double?
[Java] 위도/경도 값에 BigDecimal or double?
2024.04.30위/경도 값을 저장할 때 BigDecimal을 사용하는 것을 본 적이 있다.하지만 BigDecimal을 사용하는 것이 좋은걸까? double을 사용하는 건 좋지 않은 걸까?BigDecimal과 double에 어떤 특징이 있는지, 위경도에 어느 자료형이 적합할지 한 번 살펴보자. double의 부동소수점 문제오늘날 컴퓨터는 대부분 IEEE 754 부동 소수점 방식을 사용하기 때문에 Java에서 double을 사용해 소수를 표현한다면 소수점 약 15자리부터 오차가 발생할 수 있다. 오차를 해결하려면?Java에는 BigDecimal이라는 자료형으로 부동소수점 방식으로 인해 생기는 오차를 막을 수 있다. https://docs.oracle.com/javase/8/docs/api/java/math/BigDec..
[Java] utility class는 무엇으로 구현하는 것이 좋을까?
[Java] utility class는 무엇으로 구현하는 것이 좋을까?
2024.04.15Utility class? utility class(유틸리티 클래스)는 애플리케이션 전체에서 활용할 수 있는 클래스로 정적 메소드(static method)를 통해 구현한다. Interface의 static method 사용? Java 8 이후로, interface에 static method를 사용할 수 있게 되었다. 만약 static method를 사용하여 유틸리티 클래스를 구현한다면 다음과 같이 작성할 수 있다. public interface CalculatorUtils { static int getSumResult(int a, int b) { return a + b; } } 인터페이스로 구현하니 간결하고 실용적이게 보인다. 하지만 인터페이스로 유틸리티 클래스를 구현하는 데에는 몇 가지 단점이 있다...
[Java] 제네릭(Generic)
[Java] 제네릭(Generic)
2024.03.12제네릭(Generic)? 제네릭은 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능이다. 객채 타입을 컴파일 타임에 체크하기 때문에 잘못된 형변환으로 인해 오류가 발생하는 상황을 막아주고, 형변환의 번거로움이 줄어들 수 있다. 제네릭 클래스 제네릭은 클래스와 메서드에 사용할 수 있는데, 먼저 제네릭 클래스는 클래스 명옆에 와 같이 타입 변수를 붙여 사용한다. class Box { private T item; public void setItem(T item) { this.item = item; } public T getItem() { return this.item; } } 여기서 T는 임의로 지정한 변수명으로 T가 아닌 다른 명칭으로 지정할 수 있다. 위 코드를 ..
[Java] Mockito
[Java] Mockito
2023.07.31Mockito? Mockito는 실제 객체를 모방한 Mock 객체를 쉽게 생성하여 단위 테스트를 진행할 수 있는 오픈소스 프레임워크이다. 아마 프로젝트에서 테스트 코드를 짜본 경험이 있다면 Mockito를 한 번쯤 써봤을 것이다. Mock 프레임워크는 Mockito이외에도 EasyMock, JMock 등이 있다. 그럼 Mockito를 왜 사용하는 걸까? 먼저 다음 예시 코드를 보며 알아보자. @Service public class PostService { private PostRepository postRepository; public PostService(PostRepository postRepository) { this.postRepository = postRepository; } public Pos..
[Java] hashCode()
[Java] hashCode()
2023.07.02hashCode() hashCode()는 객체, 즉 Object에 정의되어 있다. hashCode()는 객체의 주소 값을 변환하여 생성한 고유한 정수 값이다. 만약 같은 객체를 참조하고 있다면 hashCode 값은 동일하게 나온다. 예시로, 다음과 같이 작성하여 출력해보면 정수값을 확인해볼 수 있다. class Person { } public class Test { public static void main(String[] args) { System.out.println(new Person().hashCode()); // ex) 798154996 } } Java의 모든 객체의 최상위 부모는 Object이므로 hashCode() 메서드를 Override하여 재정의할 수 있다. equals()와 hashCo..
[Java] Java 버전 별 특징
[Java] Java 버전 별 특징
2023.04.14JDK 1.0 1996년 1월에 공개되었으며 발표 이전에 불린 이름은 Oak였다. 안정화 작업을 거친 1.0.2 버전에서 Java로 이름이 바뀌었다. JDK 1.1 1997년 2월에 공개했으며 JDBC, Inner Class, Java Beans, RMI, Reflection, Unicode 지원, Internationalization 등이 추가되었다. JavaBeans JavaBeans는 자바로 작성된 소프트웨어 컴포넌트를 말한다. 뷰와 로직을 분리하여 일관된 방식으로 자바 클래스를 사용할 수 있도록 도와준다. Beans 규약 기본 생성자가 반드시 존재해야 한다. 모든 속성은 비공개이다. 속성에 접근하고 꺼내올 수 있는 getter, setter 메서드를 구성한다. Serializable을 구현한다. ..
[Java] Java 11 특징
[Java] Java 11 특징
2023.04.13Java SE 11 (LTS) 2018년 9월에 공개했으며 이클립스 재단으로 넘어간 Java EE가 JDK에서 삭제되고, JavaFX도 JDK에서 분리되어 별도의 모듈로 제공된다. 대표적인 변경 사항은 다음과 같다. String 클래스에 새로운 메서드 추가 String s = ""; s.strip(); // 문자열 앞, 뒤 공백 제거 s.stripLeading(); // 문자열 앞 공백 제거 s.stripTrailing(); // 문자열 뒤 공백 제거 s.isBlank(); // 문자열이 비어있거나 공백만 포함되어 있을 경우 true 반환 s.trim().isEmpty()와 결과가 동일 s.repeat(10); // 입력한 수만큼 문자열을 반복 컬렉션 인터페이스에 toArray() 메서드 추가 Colle..
[Java] Java 9 특징
[Java] Java 9 특징
2023.04.13Java SE 9 2017년 9월에 공개했으며 Project Jigsaw 기반으로 런타임이 모듈화된 것이 가장 큰 특징이다. 이에 따라 대부분의 콘솔 프로그램 개발에는 더 이상 AWT나 Swing 같은 불필요한 라이브러리를 끌어쓸 필요 없이, 최상위 모듈인 Base만 사용해도 되게 되었다. 더불어 특정 프로그램에 최적화된 최소 런타임을 제작할 수 있게 되면서 패키징도 간편해졌다. Jigsaw 모듈 시스템 module java.sql { requires public java.logging; requires public java.xml; exports java.sql; exports javax.sql; exports javax.transaction.xa; } jigsaw 프로젝트의 목표는 다음과 같다. 라이..
[Java] Java 8 특징
[Java] Java 8 특징
2023.04.13Java SE 8 (LTS) 2014년 3월에 공개했으며 대표적인 변경 사항은 다음과 같다. 람다 표현식(Lambda Expression) 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이다. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다. Predicate p = (Apple a) -> a.getWeight(); 자세한 내용은 [람다 표현식 소개], [람다 타입/검사/추론] 이 글들을 참고하자 메서드 참조(Method Reference) 메서드 참조는 람다 표현식을 축약한 형태이다. 메서드 참조를 사용하면 람다 표현식을 더 줄일 수 있는데, 상황에 따라 가독성이 더 좋아보일 수 있다. Predicate p = Apple..
[Java] 숫자형 스트림
[Java] 숫자형 스트림
2023.04.11이전에 reduce를 활용한 코드를 살펴보았다. Optional max = numbers.stream().reduce(Integer::max); 하지만 위 코드는 박싱 비용이 있다. 즉, 내부적으로 계산하기 전에 Integer를 기본형으로 언박싱해야 한다. 그렇지만 걱정할 필요없다. 스트림은 숫자 스트림을 효율적으로 처리할 수 있도록 기본형 특화 스트림을 제공한다. 기본형 특화 스트림 Java 8에서는 IntStream, DoubleStream, LongStream 이렇게 세 가지 기본형 특화 스트림을 제공하며 합계, 최대, 최소 등을 계산하는 sum, max, min 등의 리듀싱 연산 수행 메서드도 제공한다. 또 기본형 스트림에서 다시 객체 스트림으로 복원하는 기능도 제공한다. 다만, 특화 스트림은 오..
[Java] 스트림 연산
[Java] 스트림 연산
2023.04.07스트림에는 여러가지 중간 연산, 최종 연산이 있다. 한 번 살펴보자. 필터링 Predicate로 필터링 스트림 인터페이스는 filter 메서드를 지원한다. filter 메서드는 Predicate를 인수로 받아서 Predicate와 일치하는 모든 요소를 포함하는 스트림을 반환한다. 예를 들어, 다음과 같이 액션 영화만 필터링하여 모을 수 있다. List actionMovies = movies.stream() .filter(Movie::isActionGenre) .collect(Collectors.toList()); 고유 요소로 필터링 스트림은 고유 요소로 이루어진 스트림을 반환하는 distinct 메서드도 지원한다. 예를 들어, 다음은 모든 짝수를 선택하고 중복을 필터링하는 코드이다. List number..