Language/Java 56

Java - Equals()랑 HashCode()를 반드시 같이 재정의해야 하는 이유!

equals() Equals와 HashCode를 재정의하는 이유와 둘 사이에 관계에 대해 알아보자. Point라는 클래스가 있다고 가정한다. class Point { int x; int y; Point(int x, int y) { this.x = x; this.y = y; } } 그리고 아래의 테스트를 돌려보면 테스트가 깨진다. equals가 기본적으로 java core 라이브러리에 있는 equals로 동작하는데 내부적으로 참조(주소)를 기준으로 비교하기 때문이다. @Test void test() { Point point1 = new Point(1, 2); Point point2 = new Point(1, 2); Assertions.assertThat(point1).isEqualTo(point2); //..

Language/Java 2022.04.24

자바(Java)의 장단점 정리! [+ Spring vs Node.js + Express 비교]

자바(Java) 이전에 가전 제품에 C++을 플랫폼 독립적으로 확장한 Oak라는 언어가 있었는데, 인터넷이 확장되면서 네트워크 통신이 적합하도록 방향을 잡고 언어의 이름을 변경했다. 그게 자바(Java)다. 이번 포스팅에서는 자바(Java)의 장단점에 대해 다룬다. 그리고 추가적으로 Java(Spring)과 (Node + Express)를 비교하는 부분을 설명한다. 자바의 장점 객체 지향 프로그래밍의 장점을 충분히 반영하고 있다. 클래스, 상속, 다형성, 캡슐화, 추상화 등을 지원 플랫폼 종속적이지 않다. 많은 국내 개발자, 레퍼런스와 강의가 있다. 더 구조적이고 효율적인 코드 작성을 할 수 있다. 오픈소스도 많아서 안정적인 애플리케이션을 빠르게 개발할 수 있다. 보안, 운영측면에서 모두 안정적이다. 멀..

Language/Java 2022.04.24

Java - Hibernate는 무엇인가?

JPA 하이버네이트(Hibernate)를 이해하기 전에 JPA를 알아야 합니다. JPA는 Java Persistence API의 약자로 자바 ORM에 대한 표준 인터페이스입니다. 자바에서는 JPA를 인터페이스로 구현하고, JPA를 사용할 수 있는 구현체를 만들 수 있도록 설계했습니다. JPA의 구현체로 대표적인 Framework로 Hibernate가 있습니다. Hibernate JPA는 기술 명세입니다. JPA만으로 구현체 없이 ORM을 사용하는 것은 불가능합니다. 하이버네이트(Hibernate)는 JPA의 대표적인 구현체입니다. JPA의 핵심 인터페이스인 EntityManagerFactory, EntityManager, EntityTransaction를 Hibernate에서 각각을 상속하는 인터페이스를..

Language/Java 2022.04.17

Java - 실수하기 쉬운 메모리 누수의 5가지 패턴!

메모리 누수(Leak) 자바에서 메모리 누수는 더 이상 사용되지 않는 객체들이 GC(가비지 컬렉션)에 의해 소멸되지 않고 누적되는 현상입니다. 가비지 컬렉션의 소멸 대상이 되려면 다른 Reference 변수에서 참조하고 있지 않아야 합니다. Miner GC MinerGC는 Young 영역에 오래 되지 않은 객체를 사용이 끝나면 소멸합니다. 소요시간은 Young 영역의 크기에 따라 다르지만, 대체로 1초 미만입니다. JVM을 중지하지도 않고, 빠르고 효율적으로 동작합니다. 객체가 사용이 끝나면 Miner GC에서 정리되는 것이 유리합니다. Major GC Miner GC에서 정리되지 못하고, 객체가 오래되면 Young영역에서 Old영역으로 이동됩니다. Major GC는 Old영역의 객체를 소멸하는 역할을 ..

Language/Java 2022.04.15

Java - Concurrent Programming (Runnable, Executor, Callable, Future 등)

자바 Concurrent 프로그래밍 Concurrent S/W란 동시에 여러 작업을 할 수 있는 소프트웨어를 말합니다. 예를 들어, 크롬에서 무언가를 다운로드할 때 PC가 멈춰있는 게 아니라, 다른 작업을 병행할 수 있습니다. 자바에서는 멀티 프로세싱과 멀티쓰레드를 지원합니다. 우리가 잘 아는 스프링도 자바의 멀티쓰레드를 이용해서 많은 사용자들의 요청을 동시다발적으로 처리합니다. Thread Thread를 상속하면 새로운 Thread 클래스를 새롭게 정의할 수 있습니다. public class Main { public static void main(String[] args) { HelloThread helloThread = new HelloThread(); helloThread.start(); } sta..

Language/Java 2022.04.03

Java - Arrays.asList vs List.of 차이 (완벽 정리)!

Arrays.asList() / List.of 자바에서 Array를 List으로 변환하기 위해서는 Arrays.asList(array)를 사용합니다. Java 9 버전 부터는 List.of(array)라는 새로운 팩토리 메소드를 도입했습니다. 차이점은 무엇일까요 ? 뭐가 좋은 걸까? 변경 가능 여부 (Mutable / Immutable) Arrays.asList()로 반환된 list는 변경이 가능합니다. 하지만, List.of()에서 반환된 메서드는 변경이 불가능합니다. List list = Arrays.asList(1, 2, null); list.set(1, 10); // OK List list = List.of(1, 2, 3); list.set(1, 10); // Fails with Unsupport..

Language/Java 2022.03.27

Java 8 - 새로운 Date & Time 정리 (Zoda-Time) [Instant, LocalDate, Duration ...]

Joda-Time Java 8 이전에는 Date 관련 API들이 가지는 문제들을 해결하기 위해서, Joda-Time 이라는 라이브러리를 사용했습니다. 그래서 Java 8부터는 Joda-Time이 자바 표준 라이브러리로 들어왔습니다. Joda-Time는 다음과 같은 클래스를 지원합니다. Instance LocalDate & LocalTime DateTime Duration & Period ... 기존 Date 관련 API의 문제점 Java 8 이전에 사용하던 Date 관련 클래스는 Date, Calander, SimpleDateFormat 등이 있습니다. 하지만 많은 문제가 있어서, 자바 8 버전 이후 부터는 새로운 날짜 관련 API들을 제공합니다. 기존 클래스들의 문제입니다. 1. 부적절한 클래스, 메소..

Language/Java 2022.03.16

Java 8 - Optional이란?

Optional Optional은 Null 검사를 기존의 번거로운 방법에서 벗어나기 위해 Java 8 버전부터 제공하는 클래스입니다. Optional는 T타입의 객체를 포장합니다. Optional을 사용하면 T타입 객체가 null일때 결과를 핸들링하거나, null이 아니라 비어 있는 Optional을 반환해서 NullPointerException을 방지할 수 있습니다. 문제 (예시) ThreadLocal이라는 클래스가 있다고 가정합시다. public class ThreadLocal { DBInfo info; public DBInfo getDBInfo() { return info; } } 만약 아래 코드에서 ThreadLocal.getDBInfo()의 결과가 null이 되면 어떻게 될까요? 많이 발생하는 ..

Language/Java 2022.03.12

Java 8 - Stream이란? (+ ParallelStream)

Stream 자바 8에서 추가된 스트림(Streams)은 컬렉션, 배열 등에 저장된 요소들을 하나씩 참조하면서 코드를 실행할 수 있는 기능입니다. Stream을 사용하면, 불필요한 for문을 사용하지 않을 수 있고, 람다식을 활용할 수 있어서 코드를 직관적이게 처리할 수 있습니다. [참고] Stream은 아래와 같은 특징들이 있습니다. Stream은 데이터를 담는 저장소는 아니다. Stream은 데이터를 변경하지 않는다. Stream은 재사용할 수 없다. Stream은 각 요소가 1번씩 처리된다. Stream은 무제한일 수도 있다. (실시간으로 계속 들어올 수 있음) Stream API 사용법 Stream API는 데이터.Stream생성().중개연산()...종료연산(); 구조로 사용합니다. Stream..

Language/Java 2022.03.11

Java 8 - 인터페이스의 default method, static method 사용!

자바8 버전부터는 인터페이스에서 Default method와 Static method를 사용할 수 있습니다. 개인적으로는 클래스랑 인터페이스의 경계가 조금 허물어지는게 아닌가.. 하고 조금 의아하기도 했습니다. 하나씩 살펴봅시다. Default method 기본 메소드(default method)는 interface에서 메서드 내용을 정의하고, 그대로 재사용할 수 있게 해줍니다. public interface Printer { String getName(); default void printNameUpperCase() { System.out.println(getName().toUpperCase()); } } public class HoneyPrinter implements Printer { @Overri..

Language/Java 2022.03.09