전체 글
-
아이템22. 인터페이스는 타입을 정의하는 용도로만 사용하라책/이펙티브자바 2021. 8. 24. 11:50
클래스가 어떤 인터페이스를 구현한다 → 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해준다. 인터페이스는 오직 이 용도로만 사용해야 한다. 안티패턴 이 사용 용도에 맞지 않는 잘못된 예로 상수 인터페이스라는 것이 있다. public interface PhysicalConstants { static final double AVOGADROS_NUMBER = 6.022_140_857e23; static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23; static final double ELECTRON_MASS = 9.109_383_56e-31; } 클래스 내부에서 사용하는 상수는 외부 인터페이스가 아니라 내부 구현에 해당하는데 상수 인터페이스를 구현하는..
-
아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라책/이펙티브자바 2021. 8. 24. 11:50
인터페이스에 새로운 메서드를 추가하는 방법 자바 8 이전 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드 추가할 방법이 없다. 자바 8 이후 디폴트 메서드가 추가되어 기존 인터페이스에 메서드 추가할 방법이 생겼다. 하지만 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어렵다. 디폴트 메서드의 문제점 디폴트 메서드는 (컴파일에 성공하더라도) 기존 구현체에 런타임 오류를 일으킬 수 있다. 디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도로 사용한다면 반드시 기존 클라이언트를 망가뜨리게 된다. 결론 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니면 피해야 한다. 디폴트 메서드라는 도구가 생겼더라도 인..
-
아이템20. 추상 클래스보다는 인터페이스를 우선하라책/이펙티브자바 2021. 8. 18. 17:35
추상클래스와 인터페이스의 차이점 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 자바는 단일 상속만 지원하는데, 추상 클래스 방식을 사용한다면 새로운 타입을 정의하는 데 커다란 제약을 안게 된다. 반면 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. 믹스인 인터페이스는 믹스인 정의에 안성맞춤이다. 믹스인이란 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 '주된 타입'외에도 특정 선택적 행위를 제공한다고 선언하는 효과를 준다. ex. Comparable 은 자신을 구현한 클래스의 인스턴스들끼리는 순서를 정할 수 있다고 선언하는 믹스인 인터페이스이..
-
아이템19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라책/이펙티브자바 2021. 8. 17. 13:38
상속을 고려한 설계와 문서화가 무엇일까 ? 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 한다. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수 도 있다. 그런데 마침 호출되는 메서드가 재정의 가능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야 한다. 어떤 순서로 호출하는지, 각각의 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담는다. (재정의 가능이란 public과 protected 메서드 중 final 이 아닌 모든 메서드를 뜻한다.) 재정의 가능 메서드를 호출할 수 있는 모든 상황을 문서로 남겨야 한다. 문서화 "Implemen..
-
아이템18. 상속보다는 컴포지션을 사용하라책/이펙티브자바 2021. 8. 15. 13:03
들어가기 상속보다는 컴포지션을 사용해래 컴포지션이 상속받을 클래스를 필드로 넣어서 사용하는걸 컴포지션이라고 부르는거 같던데 맞나 ? 일단 상속보다 컴포지션이 좋은점이 있으니까 그러라고 하는거겠지 ? 왜 그런지 알아보자. 상속의 단점 상속은 캡슐화를 깨뜨린다. 상위 클래스가 어떻게 구현하느냐에 따라 하위클래스의 동작에 이상이 생길 수 있다. 상위 클래스는 릴리스마다 내부 구현이 달라질 수 있는데, 그 여파로 코드를 안건드린 하위 클래스가 오동작 할 수 있다는 것이다. 예를들어 HashSet 을 사용하는 프로그램이 있는데 여기서 추가적으로 처음 생성된 이후 원소가 몇 개 더해져있는지 알수있어야 하는 클래스가 필요하다고 할게. 그래서 HashSet을 상속받은 InstrumentedHashSet 을 만들어서 사..
-
MySQL 3레벨 다 풀었다.PS/programmers 2021. 8. 15. 11:23
헤비 유저가 소유한 장소는 못 풀어서 다른 풀이 봤다. 지금 보니까 그냥 프로그래머스 나머지 문제는 유형이 비슷해서 푼거지 다른 문제나오면 풀 수 있을지 모르겠따,, 1 2 3 4 5 6 7 8 9 SELECT * FROM PLACES WHERE HOST_ID IN ( SELECT HOST_ID FROM PLACES GROUP BY HOST_ID HAVING count(*) >= 2 ) ORDER BY ID cs 헤비 유저가 소유한 장소 풀이 다르게 푼 풀이도 많은데 이게 제일 와닿았다.
-
프로그래머스 위클리 챌린지PS/programmers 2021. 8. 11. 15:13
1주차 1 2 3 4 5 6 7 8 9 10 11 12 class Solution { public long solution(int price, int money, int count) { long totalPrice = 0; for(int i = 1; i 0 ? 0 : -result; } } Colored by Color Scripter cs 2주차 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 7..