📖
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. 이펙티브 자바

item10 - equals는 일반 규약을 지켜 재정의하라

일반적으로 object 에서 override 해서 재정의할 수 있는 대표적인 함수는 이와 같다 equals, toString, hashcode, clone, finalize

equals 는 대부분 인텔리제이에게 해줘 해서 만드는 경우가 많은데, 너무 생각 없이 만드는 것 보다는 다음과 같은 이유가 아닌 경우에 생성해서 사용하자 우선적으로 인스턴스가 싱글톤으로 고유할 때이다 -> 인스턴스가 고유하면 굳이 equals 을 사용할 이유가 전혀 없지요?

다음으로는 인스턴스의 '논리적 동치성'을 검사할 필요가 없을 때 논리적 동치성이란 어떠한 객체의 내부가 같으냐를 비교하는 의미이다 내용이 같다면 똑같은 객체로 보겠다는 의미 = 논리적 동치성 예시를 들면, String 이 있다 - String이 "hello" 이면 또 다른 String이 "hello" 이면 이것을 같다고 보는 것과 같은 논리이다

다음으로는 상위 클래스에 이미 정의 되어 있는 경우 에는 따로 equals을 정의할 필요가 없다 -> 예를 들면 hashset이나 list이 있다

마지막으로는 클래스가 private 이거나 package-private 이고 equals 메소드를 호출할 일이 없을 때 이다 public 한 클래스는 equals 가 호출되지 않을 것이라는 보장을 하는 것이 어렵다... public은 아무나 참조해서 사용하는 것이 가능하기 때문에 만약 참고해서 사용하면서 자연스럽게 List 나 Set에 넣어버리면 equals가 호출되어 버린다 그 의미는 이렇게 어떻게 쓰일지 모르기 때문에 private 에서 우리가 직접 equals을 호출할 일이 없는 클래스라면 재정의하지 말자는 의미이다

그러면 어떻게 equals를 재정의해야하는지 한 번 보자

equals을 재정의하는데 있어서 고려해야하는 점은 몇 가지 있다 순서대로 반사성, 대칭성, 추이성, 일관성, Null이 아님이다 반사성은 거울이라고 생각하면 편하다 -> 객체가 자기 자신과 비교했을 때 같냐? 이것을 보고 반사성이라고 한다

대칭성부터는 두 객체를 비교하게 되는 것이다 -> A와 B가 있을 때 A.equals(B)의 결과와 B.equals(A)의 결과가 같아야 한다는 것이다 이게 실제로 구현하는 것에 따라서 다른게 나올 수도 있기 때문에 항상 주의해야 한다는 점이다

추이성은 3단 논법이라고 생각하면 편하다 -> A, B, C 가 있을 때 A.equals(B) 가 true이고 B.equals(C) 가 true 이면 C.equals(A) 가 true 이여야 한다는 것이다 강의에서 예시로는 Point 와 Point을 상속받아서 만든 ColorPoint 을 비교하는데 ColorPoint(1, 2, RED) , Point(1, 2), ColorPoint(1, 2, BLUE) 이렇게 3개를 예시로 들어주었다 -> 만약에 equals의 구현이 Point에도 되어있으며, ColorPoint 에서는 super.equals와 colorType비교가 같이 들어가 있는 상태에서 Point.equals(ColorPoint-RED), Point.equals(ColorPoint-BLUE) 는 super의 Point 비교를 사용하고, 이는 좌표만 확인하기 때문에 true가 나올 것이다 근데 ColorPoint-RED 와 ColorPoint-BLUE 이 같냐? 는 보기만 해도 아닌 것을 알고 이건 이상한 것이라고 볼 수 있다 실제로 ColorPoint.equals을 통해서 확인해보면 ColorType을 비교하기 때문에 두 개는 다르다고 나올 것이고 이것은 추이성을 지키지 못한 케이스라고 볼 수 있다 여기서 잠깐 보면 Point.equals 에서는 Point 이라는 타입을 가지고 비교하기 때문에 1, 2으로만 비교할 수 있었던 건데 하위 타입은 하위 타입도 비교해주는 것이 필요하지 않을까? 이런 생각을 하면서 super에 있는 equals 에 Object.getClass()을 통해서 타입을 확인해준다면, 이건 라스코프 치환 원칙을 위배한 것이다 라스코프 치환 원칙은 상위(부모) 타입으로 동작하는 코드가 있을 때, 상위 코드를 상속받는 자식 클래스의 타입을 가지고 넣어줬을 때 동일하게 동작해야한다 즉, 부모클래스 대신 자식클래스가 들어가도 코드는 동일하게 동작해야 한다는 의미이다 만약에 상속받는 객체에서 equals을 사용하고 싶다면 상속하지 말고 composition 을 사용하라 그러니까 상속하는 것이 아니라 새로운 클래스를 생성하고 해당 클래스의 필드에 상속하려는 객체를 private final 으로 집어넣어주라는 의미이다 대신 사용하는 방법으로는 해당 필드를 리턴해주는 함수를 통해서 꺼낼 수 있도록 구현하는 것이다 이렇게 해당 필드를 리턴해주는 함수를 통하게 되면 상속하지 않고 신규로 만든 객체를 마치 상속하려던 그 객체처럼 사용해서 비교하거나 사용하는 것이 가능하다

다음으로는 일관성과 not null 이다 일관성은 처음에 A.equals(B) 가 true 일때, 다시 한 번 A.equals(B) 를 했을 때 같은 값이 나와야 한다는 것이다 일관성은 객체의 특성에 따라 다르다 -> 이게 객체가 자주 변화되는 객체이면 일관성을 유지하는 것이 쉽지 않으며 불변객체나 일관성을 중요시 파악해야 한다 not null은 equals 함수를 사용하는데 null 을 넘겨서 확인할 수 없다는 것이다 -> 당연하다고 하는데 난 이거 못 챙겨서 운영에서 이슈도내고... 데였으니까 잘 기억하자!

그래서 어떻게 equals을 구현하는 것이 좋냐?

4가지의 단계를 거쳐서 구현하면 좋다 우선은 자기자신을 비교한다(반사성) 그 다음은 instanceof 을 통해서 클래스가 맞는지 비교하고 비교한 클래스로 타입 캐스팅을 해준다 마지막으로는 비교해야하는 필드만 비교해준다 -> 비교하는데 있어서 부동 소수점이 있으면 Double 이나 Float 에서 제공해주는 .compare() 을 사용해서 비교하면 좋고 알려준다

추가로 null을 허용하고 싶다면 Objects.equals() 을 사용하라. Objects 에서 제공해주는 equals 는 @nullable이기 때문에 원하면 사용하면 된다

@Override public boolean equals(Object o){
    //반사성
    if(this == o)
        return true;
    
    //
    if(!(o instanceof 해당클래스))
        return false
    
    해당클래스 p = (해당클래스)o;
    
    return p.x == x && p.y == y;
}

이렇게 구현하면 좋아요~~ 근데 굳이 이렇게까지 힘들게 직접 한땀한땀 구현하면 나중에도 필드가 추가되거나 할때마다 정--말 귀찮을 것이다 결국 필드가 추가되거나 삭제되면 그에 따라서 equals 도 수정되야하는 그러한 단점이 있는 것이다 그래서 그렇게 사용하는 방법으로는 롬복에서의 애노테이션을 통하거나 @AutoValue 를 사용하는 것이다 근데 이러한 것들의 단점은 애노테이션 프로세서를 사용했기 떄문에 컴파일 시점에 코드가 생성되게 되는 그러한 플로우로 진행된다 이것이 현재 사용하기 편한 방법이고 자바8을 주로 사용하는 본인으로써는 이정도가 충분한데

사실 위의 애노테이션 프로세서보다는 불편하지만 그래도 굳이 equals을 사용할 필요가 없는 것이 intellij 에서 제공해주는 자동 구현방식이다 클래스에서 자동으로 만들어주면 어렵지 않게 사용할 수 있다. 장점으로는 내부코드를 직접 볼 수 있지만, 단점으로는 위에서 언급한 것 처럼 귀찮게 변화사항이 생기면 수정해야한다 주의해야할 것은 equals는 hashCode와 함께 같이 사용하자

Value Based Class -> 클래스이지만 해당 클래스 내부의 데이터를 기준으로 식별하는 그러한 클래스이다 가장 최신방법은 자바 17에서 제공해주는 record을 사용하는 방법이지만, 수동으로 구현하는 방법은 클래스 내부의 필드를 final로 구현하는 것이다 자바 17를 사용한다면 records 이라는 타입이 있다 records 는 class, enum, interface 와 같은 클래스 타입으로 보인다 이건 그냥 클래스처럼 되, 생성자처럼 클래스의 필드들을 파라미터로 넣어주면, 따로 구현하지 않아도 toString(), equals(), hashcode()를 사용하는 것이 가능하다 또한 getter도 구현해주는데, 롬복에서 사용하는 것 처럼 get필드()가 아니라 단순하게 .필드() 이렇게 해서 getter도 사용하는 것이 가능하다 대신 필드가 변경되지 않는다는 점이다 -> 그래서 위에서 구현한다고 할 때 클래스 내부의 필드를 final로 구현한다고 한 것이다

StackOverFlow Error JVM에서 스택이란 하나의 스레드가 사용하는 메모리 공간이다. 그리고 그 스택에 쌓이는 것을 보고 스택 프레임이라고 하고 스택프레임이 쌓이게 되는데 스택의 특성상 Last In First Out(LIFO)을 특징으로 가지고 있다 프로그램에서 메소드가 호출될 때마다 스택 프레임이 쌓이게 된다. 그리고 그 스택프레임 안에는 메소드를 호출할 때 넣어줬던 매개변수, 그리고 메소드를 참조하는 객체를 가리키는 래퍼런스가 들어가 있으며 리턴 값에 대한 정보가 들어가 있다 이러한 스택에 스택프레임이 쌓이다가 저장하는 스택의 크기를 넘어가는 순간이 StackOverFlow 에러가 발생하는 순간이다

이렇게 객체의 주소나 메소드에 대한 정보를 가지고 있는 곳이면, 힙은 객체를 저장하고 나중에 GC가 도는 공간이다 스택은 메소드를 많이 호출하는 순간에 부하가 오기 시작하는 구조이다. 따라서 로직에 재귀함수가 존재하거나 무한루프가 도는 곳에서 stackoverflow 를 의심해보아야 한다 일단 JVM에서의 기본 스택자체는 운영체제마다 다르지만 기본적으로는 1MB 정도로 잡고 있는데 만약 사이즈를 어느 정도 조정하고 싶다면, -Xss 이라는 옵션을 넣어주자

리스코프 치환 원칙 객체지향의 5대 원칙 SOLID 의 L을 담당 Single Responsibility Open-closed Principle L스코프 치환원칙 Interface segregation Dependency Inversion

S -> 하나의 클래스는 하나의 책임을 가지고 있어야 한다 O -> 클래스는 수정은 닫혀있어야하고, 확장에는 열려있어야 한다 L -> 하위 클래스의 객체가 상위 클래스의 객체를 대체해도 기능이 동일하게 돌아야 한다 I -> 특정 클라이언트를 위한 인터페이스 여러 개가 다 모아둔 하나의 인터페이스보다 좋다 D -> 하위객체가 상위객체에 의존적이지 않고 독립적인 관계를 유지해야 한다

Previousitem9 - try-finally 보다 try-with-resources을 사용하라Nextitem11 - equals을 재정의하려면 hashCode도 재정의하라

Last updated 2 years ago

Was this helpful?