📖
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
  • 생성자를 사용하는 방법 - private 생성자 + public static final 필드
  • 생성자를 사용하는 방법 - private 생성자 + 정적 팩토리 메소드
  • 책에 나온 키워드

Was this helpful?

  1. 이펙티브 자바

item3 - 생성자나 열거타입으로 싱글턴임을 보증하라

무조건적으로 싱글턴으로 만들어서 사용하라는 의미는 아니고, 꼭 하나만 존재해야하는 것이나 하나의 인스턴스만 가지고 시스템이 돌아가는 그러한 케이스들이 존재한다 예시로 보면 게임의 설정을 진행하는데 있어서 한국어로 진행할 것인지, 영어로 진행할 것인지 정할때 정하고나서 설정된 언어가 바뀌면 게임할 때 영어와 한국어가 뒤죽박죽일 것이다 이런 케이스에 사용하면 된다고 보면 된다 그렇기 때문에 무조건적으로 이렇게 하는게 좋다! 가 아니라 필요할 때 사용하면 된다

생성자를 사용하는 방법 - private 생성자 + public static final 필드

장점으로는 알아보기 쉬우며 간결하다. 그리고, 싱글톤의 장점을 활용해서 사용하는 것이 가능하다고 한다 하지만 실제로 그렇게 쓰는건 본인 기준으로는 보기 쉽지는 않았다.. 그 이유는 역시 그럼 단점이 많은 것이겠지?

단점으로는 클라이언트의 클래스를 테스트하기 어려워진다 라고 되어있는데, 우선 클라이언트 코드란, 싱글톤으로 생성한 클래스와 해당 인스턴스를 사용하는 코드라고 볼 수 있다 클라이언트에서 테스트를 진행하는데 있어서, 클라이언트를 테스트 진행할 때 싱글톤으로 생성한 놈을 부르는 순간, 단 하나의 인스턴스로 구성되어있기 때문에 그 인스턴스를 가져와서 테스트를 진행하게 된다

강의에서 말씀하신 콘서트장에서 콘서트 준비를 하면서 항상 엘비스를 불러다가 여러가지 조명이나 장막 등등을 테스트할 수는 없는 것이랑 같다

우선적으로 이러한 문제를 해결하는 방법으로는 해당 클래스의 인터페이스를 구현 이 방법이다 해당 클래스로부터 인터페이스를 만들고, 싱글톤 클래스를 해당 인터페이스를 implement하게 만들어두고, 또 새로운 테스트용 클래스를 생성하는 것이 방법이다 예시로 보면 엘비스를 포함하는 I엘비스라는 인터페이스를 생성하고, Mock엘비스라고 만들어둔 다음, Mock엘비스를 가지고 테스트를 진행할 수 있는 것이다

또 다른 단점으로는 리플렉션으로 private 생성자를 호출할 수 있다는 것이다 그리고 위의 의미는 결국 싱글톤이 깨진다는 의미를 가지고 있는 것이다 -> 그럼 결국 싱글톤의 의미가 사라지는 그러한 모순이 생기는 것이다

하는 방법으로는 class.getDeclaredConstructor()를 통해서 생성자를 들고오고, setAccessable을 통해서 자바코드에서 접근 가능하도록 설정 후, 생성하면 생성할 수 있다 이러한 버그?성을 막기 위해서는 원본클래스에서 생성자가 한 번 이상 불리는 것을 막아주는 방어코드를 집어넣어주라고 하고 있다

이 외에도 문제가 있는게, 직렬화 <> 역직렬화 하는 과정에서 기존 객체가 나오는 것이 아닌 새로운 객체가 계속해서 생성된다는 문제가 존재한다 위 문제는 또 readResolve이라는 함수를 통해서 역직렬화를 통해서 보장해주는 것이 가능하다고 한다

이렇게 계속해서 단점이 쌓여가는 상황이다

생성자를 사용하는 방법 - private 생성자 + 정적 팩토리 메소드

첫 번째의 경우와는 다르게, 직접 public한 인스턴스를 가져와서 사용하는 것이 아닌, private 한 인스턴스를 생성해두고, getInstance와 같이 인스턴스를 꺼내주는 함수를 public으로 만들어서 사용하도록 하는 방법이다 일단 이 방법에 대해서는 어떻게 보면 그냥 눈가리고 아웅 하는 느낌이다 그래서 단점도 첫 번째와 같이 가지고 있는 상황이다 하지만 그래도 장점이 더 있다고하니 봐보자

첫 번째 장점으로는 클라이언트가 더욱 간결해진다는 점이다 그 의미는 어떠한 로직이 추가될지 모르는 등 다양한 경우에 만약 실제 그냥 인스턴스를 가져왔다면 코드가 더 길어지면서 알아보기 힘들게 된다는 점이다 하지만 인스턴스를 꺼내주는 함수를 사용함으로써 클라이언트의 코드는 그대로 두되, 인스턴스에 대한 조작이 가능하다

두 번쨰 장점으로는 제네릭 싱글톤 팩토리를 사용할 수 있다 인데, 우선 이것은 제네릭 타입을 통해서 인스턴스를 내뱉고 싶을 때, 원하는 타입을 통해서 인스턴스를 생성하는 것이 가능하다는 것이다 그 의미는, 같은 인스턴스를 원하는 타입으로 형변환을 해서 사용할 수 있다는 장점을 가진다는 의미이다 제네릭 싱글톤 팩토리에 엄청난 것이 들어가는 것도 아니고 단지 형변환만 해주는 코드만 들어가는 상황이다

마지막 장점은 정적 팩토리의 메소드 참조를 supplier로 사용할 수 있다는 것인데

supplier을 통해서 메소드 레퍼런스로 static 팩토리 메소드를 사용하는 것이 가능하다

Supplier<클래스> instance = 클래스::getInstance
//이렇게 아니면
Supplier<클래스> instance = () → 클래스.getInstance()

책에 나온 키워드

메소드 레퍼런스

간단하게 보면 메소드 하나만 호출하는 람다 표현식을 간단하게 쓰는 방식이다 일단 조건 자체는 간단하다 그냥 함수에서 단 하나의 작업, 즉 단 하나의 함수를 호출하고 싶을 때 사용하는 것이 가능하다 기존의 사용은 함수 내에서 아무런문자(어떠한객체에대해서) -> {여기서 어떠한 객체에 대한 작업들을 작성하는 것이 가능했다} < 위의 케이스는 단순하게 하나의 로직이 아닌 다양한 함수를 호출하거나 할 때 필요한 부분이고 만약 해당 객체에 대해서 단 하나의 함수를 작업하려고 하면 그냥 클래스::함수 이렇게만 작성해주면 된다 자주 쓰는데 아주 편리하고 비쥬얼적으로도 아주 보기 좋다는 걸 잘 알고 있다

조금 더 보자면, 메소드 레퍼런스에는 크게 4가지 종류가 있다

  • static 메소드 레퍼런스

  • 인스턴스 메소드 레퍼런스

  • 임의 객체의 인스턴스 메소드 레퍼런스

  • 생성자 레퍼런스

기본적인 사용방법이 static 메소드 레퍼런스이다 클래스 내부에 static으로 선언된 함수를 ::을 통해서 사용하는 것이 가능하다 static하지 않은, 인스턴스 메소드는 바로 메소드 레퍼런스를 사용할 수는 없고, 인스턴스 메소드 레퍼런스를 사용하기 위해서는 객체를 하나 생성하고 나서 클래스::메소드가 아닌 생성한 객체::메소드 <- 이러한 방식으로 사용해야 한다 그리고 강의에서는 compare라는 함수를 예시로 들어주고 있었는데 내용은 이러하다, 두 가지의 인자를 받아서 비교하고 int을 넘겨주는 그러한 상황인데, 만약 compare의 구현체가 넣어주는 인자 클래스 내부에 구현이 되어있다면 하나의 인자를 받고, 나머지 하나는 this을 통해 자기자신을 비교하는 것이 가능하다 마지막으로 생성자 레퍼런스는 new 객체() 이러한 방식이 아닌 클래스::new 이러한 방식으로 생성하고자 하는 것이다 기본적으로 input에 맞는 생성자를 맞춰서 사용되게 되어 있다. 이것은 클래스::new를 추출해보면 알지만, Function<특정한인자, 만들고자하는 객체클래스> 이렇게 functional 객체로 해서 튀어나온다

근데 만약에 생성자가 인자별로 다양하게 존재해서 어떤 인자를 가진 생성자를 참조할지 모르는 경우에는 어떻게 할까 이건 함수형 인터페이스를 따로 넣어줘서 사용할 수 있다

함수형 인터페이스

우선 함수형 인터페이스는 람다 표현식과 메소드 참조에 대한 타겟타입을 제공하는 인터페이스이다 원하는대로 만드는 것도 가능한데, interface에 단 하나의 메소드만을 가지고 있다면 만드는 것이 가능하다, @FunctionalInterface을 통해서 선언해주고 함수가 단 하나만 있다면 원하는대로 생성도 가능 필요하면 사용할 수 있다

Function<인풋타입, 아웃풋타입> 에 대해서 간단하게 인풋을 넣어주면 해당 인풋에 대한 아웃풋을 리턴해주는 그러한 함수라고 생각하면 된다

Function<Integer, String> parseString = (i) -> "this is String";
Function<Integer, String> parseString = Object::toString;

Supplier에 대해서…. Supplier에는 get()이라는 함수만을 가지고 있는 추상 인터페이스이다. 이것의 특징은 매개변수를 받지 않고 단순하게 무언가를 리턴해주는 추상 메소드가 존재한다는 점이다 즉 받는건 없어도 뭔가를 뱉는 그러한 메소드라는 의미이다 제네릭 타입으로 선언되어있기 때문에 원하는걸 리턴해주는 것이 가능하지만, 특별하게 원하는 primitive 타입을 던질 수 있는 BooleanSupplier, DoubleSupplier, intSupplier, LongSupplier 도 존재하니 필요하면 사용할 수 있다

Consumer 매개변수를 받고, 리턴해주는 것이 없는 함수이다 예시로는 System.out.println이 있다 -> 입력하고 싶은 인자를 받아서 콘솔에 출력하고 막상 리턴하는 것은 없다

Predicate 매개변수를 받고 해당 매개변수에 대한 조건을 거치고 조건에 대한 true/false를 리턴하는 함수 예시로는 stream.filter 가 존재

객체 직렬화

직렬라는 것은 객체를 바이트스트림으로 상호 변환하는 기술이다 예를 들면 자바 메모리에서 사용하던 객체나 값들을 어디 다른 시스템에서 사용하고 싶거나 네트워크를 통해 값들을 전달하고 싶을 때 사용된다 마치 집에서 사용하던 물건들을 포장해서 이사하는 그러한 개념이라고 볼 수 있다 그렇게 포장되면서 객체들은 바이트 스트림으로 변환되며, 바이트스트림이 파일로 저장되거나 네트워크를 통해서 전송되는 것이다 그리고 포장된 객체들을 다시 풀어서 객체화 하는 것을 보고 역직렬화라고 한다 사용 방법으로는 직렬화를 하기 위해서는 Serializable 이라는 인터페이스를 implements하는 것으로 사용될 수 있다 만약 모든 것을 직렬화하는 것이 아닌 몇개는 빼고 싶다 -> 접근지시자와 타입 사이에 transient 이라는 키워드를 사용해서 default값으로만 들어가게 수정 가능

주의해야할 사항으로는 객체를 직렬화 시켜놓고 해당 객체에 수정사항이 생겨 필드에 수정이 되었다면 -> 역직렬화에서 에러가 발생하게 된다 여기서 에러가 나는 이유는 serialVersionUID의 차이에서 생기게 된다 기존에 객체에 따로 선언은 하지 않았는데 -> 이건 애초에 jvm 이 런타임시에 임의대로 만들어준다 이 직렬화, 역직렬화는 serialVersionUID를 통해서 진행되는데, 객체의 변경사항이 생기게 되면 serialVersionUID 가 변경되기 때문에 안되는 것이다 그래서 이건 따로 일부러 객체내부에 private static final Long serialVersionUID = 원하는 숫자 이렇게 따로 구현을 해두어야 객체에 변경사항이 있어도 직렬화, 역직렬화가 가능하다

Previousitem2 - 생성자에 매개변수가 많다면 빌더를 고려하라Nextitem4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라

Last updated 2 years ago

Was this helpful?

함수형 인터페이스들은 이렇게나 많다..

https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html