제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것입니다. (비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 경고 등) 제네릭에 익숙해질수록 마주치는 경고 수는 줄겠지만 새로 작성한 코드가 한 번에 깨끗하게 컴파일되리라 기대하지는 말아야 합니다. 대부분의 비검사 경고는 쉽게 제거할 수 있습니다. 코드를 다음처럼 잘못 작성했다고 해봅시다. Set exaltation = new HashSet(); 그러면 컴파일러는 무엇이 잘못됐는지 친절히 설명해줄 것입니다. (javac 명령줄 인수에 -Xlint:uncheck 옵션을 추가해야 합니다.) Venery.java:4: warning: [unchecked] unchecked conversion Set exa..
두 가지 이상의 의미를 표현할 수 있으며, 그 중 현재 표현하는 의미를 태그 값으로 알려주는 클래스를 본 적이 있을 것입니다. 다음 코드는 원과 사각형을 표현할 수 있는 클래스입니다. class Figure { enum Shape { RECTANGLE, CIRCLE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드는 모양이 원(CIRCLE)일 때만 쓰인다. double radius; // 원용 생성자 Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } // 사각형용..
자바 8 전에는 기존 구현체를 깨드리지 않고는 인터페이스에 메서드를 추가할 방법이 없었습니다. 인터페이스에 메서드를 추가하면 보통은 컴파일 오류가 나는데, 추가된 메서드가 우연히 기존 구현체에서 이미 존재할 가능성은 아주 낮기 때문입니다. 자바 8에 와서 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드를 소개했지만, 위험이 완전히 사라진 것은 아닙니다. 디폴트 메서드를 선언하면, 그 인터페이스를 구현한 후 디폴트 메서드를 재정의하지 않은 모든 클래스에서 디폴트 구현이 쓰이게 됩니다. 이처럼 자바에도 기존 인터페이스에 메서드를 추가하는 길이 열렸지만 모든 기존 구현체들과 매끄럽게 연동되리라는 보장은 없습니다. 자바 7까지의 세상에서는 모든 클래스가 "현재의 인터페이스에 새로운 메서드가 추가될 일..
자바가 제공하는 다중 구현 메커티즘은 인터페이스와 추상 클래스, 이렇게 두가지입니다. 자바 8부터 인터페이스도 디플트 메서드를 제공할 수 있게 되어 이제는 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있습니다. 자바 8에 추가된 기술 [4] deafult 메서드와 static 메서드 자바 8에는 다양한 기술들을 살펴보려고 하는데, 그 네 번째는 default 메서드와 static 메서드다. 자바 8부터 인터페이스의 추가할 수 있는 새로운 기능이다. API이나 스프링 코드가 이 기능 덕분에 kkoon9.tistory.com 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점입니다. 자바는 단일 상속만 지원하니, 추상 클래스..
아이템 18에서는 상속을 염두에 두지 않고 설계했고 상속할 때의 주의점도 문서화해놓지 않은 '외부' 클래스를 상속할 때의 위험을 경고했습니다. 아이템[18]. 상속보다는 컴포지션을 사용하라 상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아닙니다. 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 됩니다. 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통 kkoon9.tistory.com 💡 여기서 '외부'란 프로그래머의 통제권 밖에 있어서 언제 어떻게 변경될지 모른다는 뜻입니다. 그렇다면 상속을 고려한 설계와 문서화란 정확히 무얼 뜻할까요? 우선, 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 합니다. 달리 말하면, 상속용 클래스는 재정의할 수 있는 메서드들을..
이따금 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있습니다. class Point { public double x; public double y; } 이런 클래스는 데이터 필드에 직접 접근할 수 있으니 캡슐화의 이점을 제공하지 못합니다. (아이템 15) API를 수정하지 않고는 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없으며, 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없습니다. 철저한 객체 지향 프로그래머는 이런 클래스를 상당히 싫어해서 필드들을 모두 private으로 바꾸고 public 접근자(getter)를 추가합니다. class Point { public double x; public double y; public Point(doubl..
어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐 차이입니다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽하게 숨겨, 구현과 API를 깔끔하게 분리합니다. 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 신경을 쓰지 않습니다. 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리입니다. 정보 은닉의 장점 정보 은닉의 장점은 굉장히 많습니다. 그 중 대부분은 시스템을 구성하는 컴포넌트들을 서로 독립시켜서 개발, 테스트, 최적화, 적용, 분석, 수정을 개별적으로 할 수 있게 해주는 것과 연관되어 있습니다. 정보 은닉의 장점은 다음과 같습니다. 시스템 개..
Comparable 인터페이스의 유일무이한 메서드인 compareTo를 알아봅시다. compareTo는 Object의 메서드가 아닙니다. 성격은 두 가지만 빼면 Object의 equals와 같습니다. compareTo는 단순 동치성 비교에 더해 순서까지 비교할 수 있으며, 제네릭합니다. Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음을 뜻합니다. 그래서 Comparable을 구현한 객체들의 배열은 다음처럼 손쉽게 정렬할 수 있습니다. Arrays.sort(a); 검색, 극단값, 계산, 자동 정렬되는 컬렉션 관리도 역시 쉽게 할 수 있습니다. 예컨대 다음 프로그램은 명령줄 인수들을 (중복은 제거하고) 알파벳순으로 출력합니다. String이 Comparable을 구현한 ..
- Total
- Today
- Yesterday
- BAEKJOON
- node.js
- 프로그래머스
- JPA
- BOJ
- AWS
- 클린 아키텍처
- Effective Java
- kotest
- 백준
- 정규표현식
- C++
- kkoon9
- 이팩티브 자바
- 클린 코드
- 객체지향
- 이펙티브 자바
- 디자인 패턴
- 테라폼
- programmers
- 디자인패턴
- MSA
- Spring
- Spring Boot
- Java
- 알고리즘
- Kotlin
- Algorithm
- 코테
- Olympiad
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |