반응형 java33 [이펙티브자바 3판] ITEM20. 추상 클래스보다는 인터페이스를 우선하라 이번장의 핵심은... 일반적으로 다중 구현용 타입으로는 인터페이스가 가장 적합하다 복잡한 인터페이스라면 구현하는 수고를 덜어주는 골격 구현을 함께 제공하는 방법을 꼭 고려해보자 골격 구현은 '가능한 한' 인터페이스의 디폴트 메서드로 제공하여 그 인터페이스를 구현한 모든 곳에서 활용하도록 하는 것이 좋다 '가능한 한'의 이유는 인터페이스에 걸려 있는 구현상의 제약 때문에 골격 구현을 추상 클래스로 제공하는 경우가 더 흔하기 때문이다 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는 데 커다란 제약을 가진다 반면, 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면.. 2020. 9. 26. [이펙티브자바 3판] ITEM19. 상속을 고려해 설계하고 문서화하라. 그러지 않았으면 상속을 금지하라 이번장의 핵심은... 상속용 클래스를 설계하는 것은 굉장히 어렵다 클래스 내부에서 스스로를 어떻게 사용하는지 문서화해야 하며, 문서화한 것은 그 클래스가 쓰이는 한 반드시 지켜야 한다 다른 이가 효율 좋은 하위 클래스를 만들 수 있도록 일부 메서드를 protected로 제공해야 할 수 있다 그러나 명확한 이유가 없다면 상속을 금지하는 것이 좋을 수 있다 상속을 금지하기 위해서 클래스를 final로 선언하거나, 생성자 모두 private 또는 package-private로 선언해 외부 접근을 제한해라 문서화 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다 클래스 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있다 호출되는 메서드가 재정의.. 2020. 9. 23. [이펙티브자바 3판] ITEM18. 상속보다는 컴포지션을 사용하라 이번장의 핵심은... 상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다 안전한 상속과 위험한 상속이란? 안전한 상속 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안에서 상속을 뜻한다 확장할 목적으로 설계되었고 문서화도 잘 된 클래스이다 위험한 상속 일반적인 구체 클래스를 패키지 경계를 넘어, 즉 다른 패키지의 구체 클래스를 상속하는 일을 뜻한다 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다 확장을 충분히 고려하지 않으면 하위 클래스는 상위 클래스의 변화에 발맞춰 수정돼야만 한다 예제) HashSet을 만들어 추가된 원소의 수를 저장.. 2020. 9. 20. [Java] Java는 Call by value? Call by reference? 안녕하세요~ 잭코딩입니다! 이번 내용에서는 Call by value와 Call by reference를 살펴보고 Java는 어떠한 방식인지 예제를 통해 알아볼까요? 자바에서 메서드(함수)를 정의한 후 필요한 변수 or 객체를 인자 값으로 받아온다 이때, 인자 값을 어떤 식으로 받아 올 것인지에 대한 방식이다 Call by value (값에 의한 호출) '값'을 넘겨주는 호출 방식 Call by reference (참조에 의한 호출) '참조값(주소 혹은 포인터)을 넘겨주는 호출 방식' 1. 자바의 기본형(Primitive Type)의 경우는 Call by value이다 (기본형 : boolean, char, byte, short, int, long, float, double) public class Mai.. 2020. 9. 18. [이펙티브자바 3판] ITEM16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 이번장의 핵심은... public 클래스는 절대 가변 필드를 직접 노출해서는 안 된다 불변 필드라면 노출해도 덜 위험하지만 완전히 안심할 수는 없다 하지만, package-private 클래스나 private 중첩 클래스에서는 종종 (불변이든 가변이든) 필드를 노출하는 편이 나을 때도 있다 우선 아래의 퇴보한 클래스를 보자 class Point { public double x; public double y; } 왜 퇴보한 클래스인가? 단순히 인스턴스 필드들을 모아놓는 일 외에는 아무 목적이 없는 퇴보한 클래스이다 데이터 필드에 직접 접근할 수 있으니 캡슐화 이점도 없다 API를 수정하지 않고도 내부 표현을 바꿀 수 있고, 불변식을 보장할 수 없다 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없다 .. 2020. 9. 18. [이펙티브자바 3판] ITEM15. 클래스와 멤버의 접근 권한을 최소화하라 이번장의 핵심은... 프로그램 요소의 접근성은 가능한 한 최소한으로 하자 꼭 필요한 것만 골라 최소한의 public API를 설계하자 그 외에는 클래스, 인터페이스, 멤버가 의도치 않게 API로 공개되는 일이 없도록 해야 한다 public 클래스는 상수용 public static final 필드 외에는 어떠한 public 필드를 가져서는 안 된다 public static final 필드가 참조하는 객체가 불변인지 확인하자 정보 은닉(캡슐화)의 장점 컴포넌트를 서로 독립시켜서 개발, 테스트, 최적화, 적용, 분석, 수정을 개별적으로 할 수 있게 해 준다 1. 시스템 개발 속도를 높인다 (여러 컴포넌트를 병렬로 개발할 수 있다) 2. 시스템 관리 비용을 낮춘다 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있.. 2020. 9. 16. [Codility(코딜리티)] Lesson7. Fish (100%) Lesson 7 Stacks and Queues - Fish (Java Solution) app.codility.com/programmers/lessons/7-stacks_and_queues/fish/ Fish coding task - Learn to Code - Codility N voracious fish are moving along a river. Calculate how many fish are alive. app.codility.com 문제 두 개의 배열 A, B가 주어진다 두 배열의 길이는 같다 A는 물고기가 가진 번호이고, 이 값은 distinct 하다 B는 물고기가 움직이는 방향이다 (0이면 ) 여기서 다른 방향으로 움직이는 물고기가 만나면 숫자가 더 큰 물고기가 살아남는다 결국 총 살아.. 2020. 9. 13. 이전 1 2 3 4 5 다음 반응형