스터디/이펙티브자바

[아이템6] 불필요한 객체 생성을 피하라

아이템 6 불필요한 객체 생성을 피하라 String.matches(String regex); String 의 matches는 반복사용할 경우 그 비용이 매우 비싸다. 내부에서 Pattern 인스턴스를 생성했다가 GC의 대상이 되기 때문이다. 이를 Pattern 인스턴스를 미리 생성한 뒤 이용하여 성능 향상을 꾀하도록 하자. 내부적으로 new Pattern(regex,0) 을 하고 있다. Map.keySet(); Map.keySet 은 매번 새로운 인스턴스를 생성하는 것 처럼 보일 수 있으나 하나의 객체만을 반환하고 있다. 어댑터의 역할은 keySet이며 뒷단 객체는 Map을 의미한다. Map의 view역할을 keySet이 하여 Set으로 보여주고 있다. 따라서 keySet으로 반환된 Set 객체에서는 a..

2020.01.28 게시됨

스터디/이펙티브자바

[아이템5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

아이템 5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. ... 이 조건을 만족하는 간단한 패턴이 있으니, 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이다. 직접 명시되어 고정되어 있는 변수는 테스트를 하기 힘들게 만든다. 즉, 의존성을 바깥으로 분리하여 외부로 부터 주입받도록 작성하여야 한다. (의존 객체 주입 패턴) Example code public class PriceCalculateService { private static final String EXCHANGE_URL = "https://somewhere.com"; private static final double FIX..

2020.01.18 게시됨

스터디/이펙티브자바

[아이템4] 인스턴스화를 막으려거든 private 생성자를 사용하라

아이템 4 인스턴스화를 막으려거든 private 생성자를 사용하라 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. case 정적 메서드와 정적 필드만을 담은 클래스를 만들경우 (ex. 유틸성 클래스) java.lang.Math java.util.Arrays Java.util.Collections final 클래스와 관련한 메서드를 모아 놓을 때 추상 클래스로 만드는 것은 상속을 하라는 의미로 받아 들여질 수 있으므로 인스턴스화를 막는데 아무런 도움이 되지 못한다. 기본적으로 아무런 생성자를 만들어 놓지 않으면 컴파일러가 기본 생성자를 public하게 만들기 때문에 명시적으로 private한 생성자를 만들어두어 인스턴스화를 막을 필요가 있다. 그렇지 않으면 기본 생성자를 컴파일러가 만..

2020.01.18 게시됨

스터디/이펙티브자바

[아이템3] private 생성자나 열거 타입으로 싱글턴임을 보증하라

아이템 3 private 생성자나 열거타입으로 싱글턴임을 보증하라 p.23 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 mock 구현으로 대체할 수 없기 때문이다. 인터페이스 없이 구현한 싱글턴 코드 public class Validator { private static final Validator INSTANCE = new Validator(); public static final Validator getInstance() { return INSTANCE; } private int bound; private Validator() { this.bound = 10; } public vo..

2020.01.17 게시됨

스터디/이펙티브자바

[아이템2] 생성자에 매개변수가 많다면 빌더를 고려하라

[아이템2] 생성자에 매개변수가 많다면 빌더를 고려하라 점층적 생성자 패턴 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. public class Gradation { private String name; private int number; private long money; private double temperature; public Gradation(String name, int number, long money, double temperature) { this.name = name; this.number = number; this.money = money; this.temperature = temperature; } public Gradation(String name, int ..

2020.01.16 게시됨

스터디/이펙티브자바

[아이템1] 생성자 대신 정적 팩터리 메서드를 고려하라

이펙티브 자바 2장 객체 생성과 파괴 [아이템1] 생성자 대신 정적 팩터리 메서드를 고려하라 첫번째 장점, 이름을 가질 수 있다. Example code. public class Ladder { public static Ladder left() { return new Ladder(Direction.LEFT); } public static Ladder right() { return new Ladder(Direction.RIGHT); } public static Ladder down() { return new Ladder(Direction.DOWN); } private Direction direction; public Ladder(Direction direction) { this.direction = dir..

2020.01.15 게시됨

스터디/클린코드

객체지향 설계 5원칙 SOLID

객체지향설계 5원칙 SOLID의 이해와 예제 목표 SOLID에 대한 설명을 하는 글은 여러 블로그에 소개가 되어있습니다. 하지만 대부분의 글이 개념적인 설명을 위주로 하고 있을뿐더러, 너무 추상적이라 이해하기 어렵다는 생각을 했습니다. 그래서 저는 이 글을 실제로 코드상에서 어떠한 방식으로 적용되는지 어떻게 의식하고 코드를 작성하는 것이 SOLID를 지킬 수 있는지 이 두 가지에 중점을 두고, 개념적인 설명만 있는게 아닌 예제를 통해 SOLID를 공부하고 이해해 보고자 합니다. 글에서 사용된 예제는 모두 GitHub에 올라가 있습니다. 1. SRP Single Responsibility Principle - 단일 책임의 원칙 한 클래스는 하나의 책임을 가져야 한다. SRP가 지켜지지 않은 코드 publi..

2019.12.18 게시됨

생각/회고

우아한 테크코스 2기 프리코스 회고

우아한 테크코스 2기 프리코스를 마치며 지원 2019년 초. 우아한 테크코스(우테코) 1기가 모집을 진행했었습니다. 정말 정확히 모집을 시작한 시기는 잘 기억은 나지 않습니다만, 아마 3월 초정도 였던것 같습니다. 제가 다니고 있는 학교는 졸업작품을 반드시 제출해야만 졸업을 할수 있었고 3학년 2학기부터 4학년 1학기 까지 총 1년을 졸업작품을 발표하기 위한 과정이 있었습니다. 그리고 우테코는 제가 4학년 1학기 졸업작품의 절반을 진행하고 있을때 처음으로 모집 공고가 나와 안타깝게도 지원을 할 수 없었습니다. 진짜 하고싶었는데... 그러다 10월에!! 우테코 2기의 모집 공고가 나오게 됩니다! 1기의 과정이 1년정도 였던걸 감안하면 당연히 비슷한 시기에 모집공고를 할 줄 알았는데 10월에 2기 모집 공고..

2019.12.15 게시됨

스터디/클린코드

객체지향의 사실과 오해를 읽고

들어가며 학교의 커리큘럼은 C를 배우고 Java를 배우는 순서였습니다. C는 절차지향 언어이고, Java는 객체지향 언어이다. 전혀 이해가 되질 않았습니다. 전혀. 솔직히 지금도 객체 지향에 대해 설명하라고 하면 자신있게 못 할 것 같습니다. Java는 코드의 재사용이 가능하다고 하지만 'C도 메서드 재사용 되지않나?'라는 생각을 했습니다. Java는 그저 알고리즘을 풀기위한 언어 중 한 가지일 뿐이었습니다. 그러다 우연히 대외활동을 하다 다른 친구가 Java를 다루는 것을 보았는데 충격적이었습니다. '와! 내가 작성한 코드는 쓰레기구나!' 제가 작성한 코드는 재활용이 불가능한 코드지만, 친구가 작성한 코드는 재활용도 가능하고 정말 깔끔했습니다. 저는 객체 지향언어를 사용하면서 원칙을 지키지 않았고 친구..

2019.12.04 게시됨

스터디/JPA

오늘의 에러 [ detached entity passed to persist]

발생한 에러 (2019.11.13) org.hibernate.PersistentObjectException: detached entity passed to persist 문제 발생시 도메인 상황 @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Champion { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String riotId; private String key; @Column(unique = true) private String name; @OneToMany(mappedBy = "champion", fetc..

2019.11.14 게시됨