📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page

Was this helpful?

  1. 이펙티브 자바

item2 - 생성자에 매개변수가 많다면 빌더를 고려하라

짚고 넘어가는 부분들은 이와같다 생성자 체이닝과 자바빈즈 빌더 계층형 빌더

기본적으로 객체를 생성하기 위해서는 생성자를 배우고 사용한다 가장 기본적인 방법이기도하며 가장 처음 배우는 방법이다 하지만 만약 해당 객체의 필드 수가 많아지는 순간이 생성자를 정--말 만들기 싫어지는 그런 순간이다 예를 들어서 필드가 6개만 되어도 만들 수 있는 생성자가 몇개인지 정말 많아진다 만약 이렇게 사용해야 한다면 하나의 객체에 몇개가 들어오냐...

package me.kdshim.kdd_j.checking;

public class Teeth {
    String first;
    String second;
    String third;
    String fourth;
    String fifth;
    String sixth;

    public Teeth(String first) {
        this.first = first;
    }

    public Teeth(String first, String second) {
        this.first = first;
        this.second = second;
    }

    public Teeth(String first, String second, String third) {
        this.first = first;
        this.second = second;
        this.third = third;
    }

    public Teeth(String first, String second, String third, String fourth) {
        this.first = first;
        this.second = second;
        this.third = third;
        this.fourth = fourth;
    }

    public Teeth(String first, String second, String third, String fourth, String fifth) {
        this.first = first;
        this.second = second;
        this.third = third;
        this.fourth = fourth;
        this.fifth = fifth;
    }

    public Teeth(String first, String second, String third, String fourth, String fifth, String sixth) {
        this.first = first;
        this.second = second;
        this.third = third;
        this.fourth = fourth;
        this.fifth = fifth;
        this.sixth = sixth;
    }
}

물론 위의 예시는 조금 많이 극단적이구.. 솔직히 그정도는 아닌데 이렇게 길어지는 것을 대신하는 방법도 있다는 것이다

생성자 체이닝과 자바빈즈

객체를 생성하는 방법들 중에서 간단?하고 가장 잘 알고있는 방법 두 가지이다

우선 생성자 체이닝의 의미는 this나 super 키워드를 사용해서 생성자에서 내부 생성자를 호출하는 방식이다. 이렇게만 사용해도 위의 Teeth 객체에서의 중복 코드를 상당하게 줄이는 것이 가능하다 우선 객체를 new 키워드를 통해서 생성할때 보면, 따로 선언하지 않더라도 기본적으로 제공해주는 아무런 매개변수를 받지 않는 생성자를 통해 생성한다 생성자 체이닝을 사용하게 되면 아래와 같이 구현될 수 있다

package me.kdshim.kdd_j.checking;

public class Teeth {
    String first;
    String second;
    String third;
    String fourth;
    String fifth;
    String sixth;

    public Teeth() {
    }

    public Teeth(String first) {
        this(first, null, null, null, null, null);
    }

    public Teeth(String first, String second) {
        this(first, second, null, null, null, null);
    }

    public Teeth(String first, String second, String third) {
        this(first, second, third, null, null, null);

    }

    public Teeth(String first, String second, String third, String fourth) {
        this(first, second, third, fourth, null, null);
    }

    public Teeth(String first, String second, String third, String fourth, String fifth) {
        this(first, second, third, fourth, fifth, null);
    }

    public Teeth(String first, String second, String third, String fourth, String fifth, String sixth) {
        this.first = first;
        this.second = second;
        this.third = third;
        this.fourth = fourth;
        this.fifth = fifth;
        this.sixth = sixth;
    }
}

단순하게 this.필드 작업의 반복을 단순하게 처리해줄 수 있다는 장점이 있구나!

두 번째로는 자바빈즈 방식인데 말이 자바빈즈라고 하지만 간단하게 그냥 빈 객체를 만들고 각 필드를 세터를 통해서 객체를 조립하는 방식이다

public static void main(String[] args) {
        Teeth teeth = new Teeth();
        teeth.setFirst("THIS IS FIRST");
        teeth.setSecond("THIS IS SECOND");
        teeth.setThird("THIS IS THIRD");
        teeth.setFourth("THIS IS FOURTH");
        teeth.setFifth("THIS IS FIFTH");   
    }

요렇게 사용하는 방법인데 진짜 가장 간단하면서도 가장 flexable? 한 느낌의 객체 생성 방법이지만... 자바빈즈의 단점으로는 역시 필드를 잘 모르는 상황에 사용하다보면 몇 개는 빼고 객체를 생성할 수도 있기 때문에 객체를 생성하는데 위험성을 안고 생성하는 기분이다 또한 객체를 생성해 놓고 보면 어디서 사용할지도 모르는데, 만약 자바빈즈를 통해서 객체를 생성해버리면 어떤 객체를 완벽한 모든 필드를 가지고 만들었을 수도 있지만 어떤 객체를 필드가 빠진 상태로 만들어질 수 도 있다 그것이 이상한 상황이라고 볼 수는 없다 상황에 따라서 다를 수 있기 때문이다 근데 객체의 일관성을 고려해야하는 객체를 생성해야 하는 일이 있다면 자바빈즈는 피하는게 좋은 방식이라고 생각한다

그래서 -> 빌더 패턴을 통해서 단점을 보완하는 것이 가능하다 기존까지의 경우는 생각해보면 새로운 필드가 추가되거나 필드가 아주 많은 경우에는 생성자로 구현해둔 상황에서는 정말 건드려야하는 부분이 많다

장점으로는 첫 번째로는 원하는 필드로만 객체를 생성하는 것이 가능하다는 점이다 만약 생성자를 사용한다고 가정하면 원하는 필드로만 이루어진 생성자를 따로 만들어서 적용해야 한다 이러한 경우는 정말 너무 귀찮기도하다, 필드가 생기면 그 필드를 가진 생성자도 새로 만들어야하기 때문이다 두 번째로는 가독성이다 빌더 패턴의 특징으로는 메소드 체이닝을 통해서 객체를 생성한다는 점이다 메소드 체이닝을 비교하기 좋은 예시는 자바빈즈 패턴을 예시로 볼 수 있다 필드가 많으면 모든 필드에 대나 각각 setter을 통하거나 모든 필드를 가진 생성자를 통해서만 생성할 수 밖에 없다 생성자는 그래도 나은 거 같긴 한데 세터는 어떻게 보면 좀 복잡하다고 볼 수 있다

예시를 한 번 보자 이렇게 다양하게 객체를 만들 수 있다

public static void main(String[] args) {
        Teeth teeth = new Teeth();
        teeth.setFirst("THIS IS FIRST");
        teeth.setSecond("THIS IS SECOND");
        teeth.setThird("THIS IS THIRD");
        teeth.setFourth("THIS IS FOURTH");
        teeth.setFifth("THIS IS FIFTH");
        
        Teeth teeth2 = new Teeth("THIS IS FIRST", "THIS IS SECOND", "THIS IS THIRD", "THIS IS FOURTH", "THIS IS FIFITH");
        
        Teeth teeth3 = Teeth.builder() 
                .first("THIS IS FIRST")
                .second("THIS IS SECOND")
                .third("THIS IS THIRD")
                .fourth("THIS IS FOURTH")
                .fifth("THIS IS FIFTH")
                .build();
    }

이렇게만 사용할 수 있는 것도 좋은 방식이다 참고해서 객체 생성하면 좋을 것 같다 위에 계층형 빌더도 있다 -> 위 예시에서는 애노테이션을 사용해서 빌더를 생성했지만 이외에도 직접 구현하는 방법도 있다 상속관계에 있는 객체에서 빌더 패턴을 구현한다고 할 때 부모 클래스에서 타입에 구애받지 않게 빌더를 구현한다면 자식클래스에서도 사용할 수 있다는 내용이다

책에서 나온 키워드 Serialize -> 직렬화, DeSerialize -> 역직렬화 라고 한다 뭔지 대충은 알고 있지만 정확한 개념으로는 객체를 어딘가에 저장할 때 객체 그대로 저장했다가 가져올 때 그 객체 그대로 가져오는 것을 보장해주는 개념이다 implementation Serializable을 통해서 적용이 가능하며 이것은 데이터간의 통신이나 디비와의 통신등에 적용되면 좋다

checkedException, unCheckedException -> 이 두 예외 타입에 대해서 고민해보자 우선 RunTimeException을 먼저 봐야한다 여기서 RunTimeException이란, 컴파일러에서 잡아주지 않는, 로직상에서 나오는 에러이다 checkedException은 RunTimeException을 상속하지 않는 케이스이다 그리고 uncheckedException이 RunTimeException을 상속한 케이스이다 그럼 checkedException은 에러가 나면 무조건 로직이 깨지기 때문에 try-catch을 통해서 잡아줘야만 하며 그 메소드에 명시를 해줘야 한다 반대로 unCheckedException은 굳이 명시를 해주지 않아도 괜찮기도 하고 안전하게 에러가 나면 바로 롤백을 통해서 안전하게 처리해준다 그래서 토이에서도 현재 런타임예외를 상속받는 커스텀 예외를 만들어서 따로 부담 없이 예외를 던도록 처리를 해둔 상황이다

가변인수 -> 오.. 난 진짜 처음본다... 자바 1.5부터 나왔던 기능이라고하네요 그리고 printf 와같은 메소드에서 사용한다는 것

가변인수는 파라미터를 받는데 있어서 매개변수의 숫자를 동적으로 지정해주는 방식을 의미한다 이렇게 되면 각 파라미터에 대한 생성자가 있다는 가정 하에, 원하는 매개변수 숫자만큼 넣어서 객체를 생성하는 것이 가능하다 그럼 맨 처음에 나왔었던 다양한 생성자에 대한 복잡함을 그나마 줄여서 사용할 수 있다는 것이 장점인 것 같다

Previousitem1 - 생성자 대신 정적 팩토리 메소드를 고려하라Nextitem3 - 생성자나 열거타입으로 싱글턴임을 보증하라

Last updated 2 years ago

Was this helpful?