📖
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
  • 장점
  • 이름을 가질 수 있다
  • 호출될 때 마다 인스턴스를 새로 생성하지 않아도 된다
  • 반환타입의 하위 타입 객체를 반환할 수 있다
  • 입력받은 매개변수에 따라서 다른 객체를 생성할 수 있다
  • 정적 팩터리 메소드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다
  • 단점
  • Enum
  • 플라이웨이트 패턴
  • 인터페이스와 정적 메소드
  • 서비스 제공자 프레임워크
  • 리플렉션

Was this helpful?

  1. 이펙티브 자바

item1 - 생성자 대신 정적 팩토리 메소드를 고려하라

간단하게 보면 이렇게 작성할 수 있음

public class myServcie{

	private String name;
	private boolean open;
	private boolean mine;

	public myService(){}

	public static isOpenedMyService(String name){
			myService ms = new myService();
			ms.name = name;
			ms.open = true;
			ms.mine = false;
	}

	public static isMineMyService(String name){
		myService ms = new myService();
		ms.name=  name;
		ms.open = false;
		ms.mine = true;
	}
}

장점

이름을 가질 수 있다

이름을 가짐으로써 어떠한 객체를 만들 것인지에 메소드의 이름에서 명시해줘서 사용하기 편리하게 유도하는 것이 가능하다 위의 코드에서 isOpenedMyService 메소드르 사용해서 open 되어 있는 서비스를 생성할 수 있으며 isMineMyService를 통해 mine인 서비스를 생성하는 것이 가능하며 해당 객체를 만드는데 있어서도 편하게 인지하고 사용하는 것이 가능하다 이름을 생성하는데 있어서 그래도 참고하면 타입? 느낌 from : 하나의 매개변수를 받아서 객체 생성 of : 여러개의 매개변수를 받아서 객체 생성 getInstance : 인스턴스를 생성, 있다면 있는걸 가져올 수도 있음 newInstance : 새로운 인스턴스를 생성

호출될 때 마다 인스턴스를 새로 생성하지 않아도 된다

static 으로 사용되기 때문에 따로 객체를 생성해서 사용할 필요없이 선언해둔 것을 통해서 사용하는 것이 가능

반환타입의 하위 타입 객체를 반환할 수 있다

이 장점을 통해서 구현체를 공개하지 않고도 그 객체를 원하는 타입별로 생성해내는 것이 가능하다 myService 이라고 하는 인터페이스가 존재하고 myService이라는 인터페이스를 구현받아서 만든 AService, BService, CService가 있다고 가정하자 이런 상황에서 myService이라는 클래스를 리턴하는 메소드를 만들고 내부 로직에 따라서 AService, BService, CService을 리턴하도록 구현해도 문제 없이 잘 된다

입력받은 매개변수에 따라서 다른 객체를 생성할 수 있다

정적 팩터리 메소드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다

책에서는 예시를 JDBC를 들었다 -> 실제 JDBC를 연동하는 코드를 구현해 놓았는데, 만약 다른 JDBC가 들어오면 코드를 바꿔야하나? 만약 정적 팩토리 메소드를 사용해서 구현을 해 두었으면 내부코드에 의존적이지 않다는 것이 장점이다

이외에도 DTO <-> Entity을 진행하는데 있어서 아주 유용하다고 한다 -> 이건 나도 생각했던건데 실제로 그렇다고 하니까 한번 적용해보자 //static으로 빼긴 뺐는데... 생성자도 한꺼번에 처리해버리고 싶지만 dto같은 경우에는 generator를 사용하기 때문에 이거쓰면 엔티티 전용으로밖애 못만들구나

단점

상속을 하려면 public, protected를 사용해야하는데, 생성자가 없고 정적 팩토리 메소드만 존재하면 상속이 불가능

정적 팩토리 메소드만 사용하게 되면 → 자바독스와 같은 것으로 분석하는 경우에는 찾기가 힘들어진다

그래서 제목에도 잘 나와있다 -> 정적 팩터리 메소드를 사용하는 것을 고려하라

Enum

이늄이라고도 부르고, 이건 상수 목록을 담을 수 있는 데이터 타입이다 이늄을 사용하게 되면 값을 지정해줄 때 선언해둔 값들로만 제한해서 사용하게 할 수 있다, 즉 Type-Safety를 보장해줄 수 있다 이것을 활용해서 싱글턴 패턴 구현에도 자주 사용하곤 한다

특정 enum 타입이 가질 수 있는 모든 값을 순회하며 출력하는 방법 -> Enum.values(); enum도 자바 클래스처럼 생성자, 메소드, 필드를 가질 수 있는가 enum을 비교하는데 있어서 ==을 사용해서 동일성을 비교하는 것이 가능한가 -> equals, == 모두 사용이 가능한데, equals이라는 메소드는 null-safe한 메소드가 아니기 때문에 null 체크를 거치고 확인해줘야하는데 == 을 사용하게되면 null에 대한 고민을 하지 않아도 되기 때문에 ==을 기본적으로 권장 enum을 키로 사용하는 map을 정의하거나 enum을 가지고 있는 set을 구현해보라 -> EnumMap, EnumSet을 사용

플라이웨이트 패턴

객체를 재사용하는 방법 중에 하나임

  • 객체를 가볍게 만들어 메모리 사용을 줄이는 패턴

  • 자주 변하는 속성 또는 외적인 속성과 변하지 않는 속성을 분리해서 재사용해서 메모리 사용을 줄이는 것이 가능

변경되지 않는 것을 플라이 웨이트 팩토리에 모아두고 가져와서 사용한다

인터페이스와 정적 메소드

자바 8, 9 이후부터는 인터페이스에 직접 메소드를 정의하는 것이 가능해졌다 default 키워드나 static 키워드가 들어가 있어야 메소드를 정의할 수 있다 default 메소드는 인터페이스에서 메소드의 선언 뿐만 아니라, 기본적인 구현체까지 제공하는 것이 가능하다 또한 기존의 인터페이스를 구현하는 클래스에 새로운 기능을 추가하는 것이 가능하다 static 메소드는 default에서는 불가능 했던(기본으로 public이기 때문에) private 메소드를 사용할 수 있다는 특징이 있다

서비스 제공자 프레임워크

서비스 제공자 인터페이스(Service Provider Interface), 서비스 제공자, 서비스 제공자 등록 API, 서비스 접근 API 서비스 제공자 인터페이스란 그냥 원하는 서비스를 정의할 인터페이스를 지칭 구현체는 어디에 구현되어있던 상관은 없다 -> 중요한 건 구현체에 의존적이지 않게 되기 위해서이다 스프링부트에서도 빈이라는 개념을 통해서 서비스를 제공해주고, DI을 통해서 원하는 서비스를 가져와서 사용하는 것이 가능하다 빈등록을 통해서 서비스를 등록하고, getBean이나 @Autowired을 통해서 서비스를 가져와서 사용하는 것이 가능

자바를 기준으로 확인하는 방법으로는 ServiceLoader가 예시로 있다

브릿지 패턴의 예시를 잘 들어주셨는데, 롤로 따지면 스킨과 챔피언이 나누어져 있는 상황에서 만약 스킨이 추가되게 되면 모든 챔피언에도 적용이 되어야 하지만 챔피언과 스킨 사이에 브릿지, delegate클래스를 두고 해당에서만 작업해주면 원하는 스킨으로 바꿔끼면서 챔피언을 사용하는 것이 가능해진다 이 브릿지 패턴이 스프링의 PSA(Portable Service Abstraction)에도 적용되어있다는 점

리플렉션

Previous이펙티브 자바Nextitem2 - 생성자에 매개변수가 많다면 빌더를 고려하라

Last updated 2 years ago

Was this helpful?

클래스로더를 통해서 읽어온 클래스 정보를 사용하는 기술이다 옛날에 했던 것을 리마인드 해보면, 리플렉션을 통해서 객체를 생성하는 것이 가능했었으며, 이외에도 메소드나 필드의 이름을 가져오거나 메소드에 선언되어 있는 애노테이션등을 가져오는 것이 가능했다 옛날에 공부했던 링크 ->

요기