equals() 메서드 재정의 equals 메서드 재정의는 간단해 보여도 함정이 많은 행위다. 문제를 회피하는 가장 좋은 방법은 아예 재정의를 하지 않는 것인데, 재정의를 하지 않으면 Object 클래스의 equals() 메서드를 호출하므로 그 클래스의 인스턴스는 오직 자기 자신과만 같게된다. ▶ 다음에서 열거한 상황 중 하나에 해당한다면 equals()를 재정의하지 말자. 1) 각 인스턴스가 본질적으로 고유하다. Object의 equals() 메서드가 이에 속한다. 2) 인스턴스의 '논리적 동치성(logical equality)'을 검사할 일이 없다. 논리적 동치성 5만원 지폐가 2개가 있을때, 각 지폐는 다른 지폐다. 하지만 금액은 같다. 어떤것을 비교하느냐에 따라 달라진다. 기본적으로 Object ..
수강완료한 강의 복습해보자 (코딩으로 학습하는 GoF의 디자인 패턴) 플라이웨이트 패턴(Flyweight Pattern) 객체를 가볍게 만들어 메모리 사용을 줄이는 패턴. 자주 변하는 속성(또는 외적인 속성, extrinsit)과 변하지 않는 속성(또는 내적인 속성, intrinsit)을 분리하고 재사용하여 메모리 사용을 줄일 수 있다. 적용 전 코드 (Before) Character.java public class Character { private char value; private String color; private String fontFamily; private int fontSize; public Character(char value, String color, String fontFamily..
문제 한 개의 문자열 s, 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소 거리를 출력하시오. 입력 설명 문자열과 문자는 소문자다. 문자열의 길이는 100을 넘지 않는다. 입력 예제 teachermode e 출력 예제 1 0 1 2 1 0 1 2 2 1 0 나의 풀이 package com.algorithm._01_그리디_구현; import java.util.Arrays; import java.util.Scanner; /** * (문제) * 한 개의 문자열 s, 문자 t가 주어지면 문자열 s의 각 문자가 문자 t와 떨어진 최소 거리를 출력 * * (입력설명) * 문자열과 문자는 소문자 * 문자열의 길이는 100을 넘지 않는다. * * (입력예제) * teachermode e * (출력예제..
예제 Counter.java package org.example.atomic; public class Counter { private int c = 0; public void increment() { c++; } public void decrement() { c--; } public int value() { return c; } } 위 예제는 멀티 스레드에서 접근하는 요청에 대한 정합성 확보가 어렵다는 문제점이 있다. 이를 해결하기 위해 각 메서드에 synchronized 키워드를 붙여 객체에 록을 걸어보자. SynchronizedCounter.java package org.example.atomic; public class SynchronizedCounter { private int c = 0; pub..
interface Comparable 매개변수를 1개 받는다. package java.lang; import java.util.*; public interface Comparable { /* ... */ public int compareTo(T o); } Comparable 구현하기 1) 오름차순 public class Member implements Comparable { ... public int compareTo(Member member) { /** 오름차순 출력 */ if (this.memberId > member.memberId) { return 1; } else if (this.memberId < member.memberId) { return -1; } else { return 0; } } }..
들어가기 전 Lombok을 사용하여 구현하기 전, 라이브러리를 사용하지 않고도 구현할 줄 알아야한다. 아래 포스팅을 참고하자. devfunny.tistory.com/409 [SpringBoot + JPA] DTO, Entity의 빌더패턴 적용기 도입 스프링부트 프로젝트에서 JPA를 사용하여 API를 만드는 상황에 놓였다. 나는 API의 파라미터로 받아올 Dto 파일을 생성하였고, JPA Repository로 보낼 Entity 파일을 생성하였다. com.api.seohae - dto U devfunny.tistory.com 도입 스프링부트 프로젝트에서 JPA를 사용하여 API를 만드는 상황에 놓였다. 나는 API의 파라미터로 받아올 DTO 파일을 생성하였고, JPA Repository로 보낼 Entity ..
JPA JPA : Java Persistence API 자바 진영의 ORM 기술 표준이다. JPA를 알아보기전에 ORM과 ORM 프레임워크에 대해 알아보자. ORM ORM : Object Relational Mapping 객체와 관계형 데이터베이스를 매핑한다는 뜻이다. ORM 프레임워크 ORM 프레임워크를 사용함으로써 그동안 개발해왔던 INSERT/UPDATE/SELECT 쿼리 등을 직접 작성하지 않고도 데이터를 저장할 수 있게되었고 우리는 객체를 자바 컬렉션에 저장하듯이 ORM 프레임워크에 저장하면 쿼리 작성 시의 일들을 수행할 수 있게 되었다. ORM 프레임워크에 저장된 객체들은 ORM 프레임워크가 적절한 SQL을 생성해서 데이터베이스에 저장된다. ORM 프레임워크는 단순히 SQL을 생성해서 데이터베..
소스코드 : https://github.com/westssun/moderninjava8/tree/master/src/main/java/ModernInJava8/ch4_5_6_stream GitHub - westssun/moderninjava8: [BOOK] 모던 인 자바8 [BOOK] 모던 인 자바8. Contribute to westssun/moderninjava8 development by creating an account on GitHub. github.com 예제 실행을 위한 DTO @Data public class SampleDto { private int idx; private String name; private String gender; } 1) 스트림 기본 /** * 기존 Java7 코..
LocalDate LocalDate 인스턴스는 시간을 제외한 날짜를 표현하는 불변 객체이다. 어떤 시간대 정보도 포함하지 않는다. 우리는 정적 팩토리 메서드 of로 LoalDate 인스턴스를 만들 수 있다. LocalDate date = LocalDate.of(2017, 9, 21); int year = date.getYear(); // 2017 Month month = date.getMonth(); // SEPTEMBER int day = date.getDayOfMonth(); // 21 또한 팩토리 메서드 now를 사용하여 현재 날짜 정보를 얻을 수 있다. LocalDate today = LocalDate.now(); 다른 방법으로는, get 메서드에 TemporalField를 전달해서 정보를 얻는 ..
디폴트 메서드의 등장 자바 8에서는 기본 구현을 포함하는 인터페이스를 정의하는 2가지 방법을 제공한다. 만약 인터페이스를 바꾸게 되었을때, 해당 인터페이스를 구현한 모든 클래스의 구현도 고쳐져야하는 상황이 온다면 매우 당황스러울 것이다. 이 문제점을 자바 8에서 제공된 새로운 기능으로 해결할 수 있다. 1) 정적 메서드 : 인터페이스 내부 2) 디폴트 메서드 : 인터페이스의 기본 구현을 제공 자바 8에서는 메서드 구현을 포함하는 인터페이스를 정의할 수 있다. 결과적으로 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디폴트 메서드를 상속받게 된다. 이렇게 하면 기존의 코드 구현을 바꾸지 않으면서 인터페이스를 바꿀 수 있다. 이 말은 즉, 디폴트 메서드나 정적 메서드가 추가..
하나의 클래스를 여러 용도로의 사용 많은 클래스가 하나의 자원에 의존한다. 이렇게 여러 클래스에게 의존받는 자원은 여러 용도로 사용이 된다. 예를 들어, 사전이라는 SpellChecked 클래스가 있다. 이 클래스가 여러 사전을 사용할 수 있도록 만들어보자. 1) 정적 유틸리티의 잘못된 사용 public class SpellChecker { private static final Lexicon dictionary = ...; // 인스턴스 생성 막기 (post: https://seohae.github.io/2020/07/24/java/25_InstancePrivateUse/) private SpellChecker() {} } 2) 싱글턴의 잘못된 사용 public class SpellChecker { pr..
제네릭 public interface Comparable { int compareTo(T o); } 위 Comparable의 메소드는 Comparable, Comparable 등을 구현할 수 있다. 타입을 명시하여 String, Integer 각 타입별 중복된 메소드를 생성할 필요없이 제네릭을 사용하여 중복된 코드를 공통으로 묶을 수 있고, 타입에 자유로워질 수 있다. 형변환의 에러는 컴파일시에 나타나지 않고 런타임 오류로 발생하는데, 이 에러를 컴파일시에 발견할 수 있다는 장점도 제네릭의 큰 장점이다. 제네릭은 static 변수에 사용이 불가능하다. static 변수는 클래스 변수로, 모든 인스턴스에게 공유되는 변수이다. static 변수에 제네릭을 사용하게되면 모든 인스턴스에게 공유되는 변수가 경우에..