목록JAVA (65)
개발 기록
## 리플렉션보다는 인터페이스를 사용하라 ### 리플렉션리플렉션 기능(java.lang.reflect)을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있다.Class 객체가 주어지면 그 클래스의 생성자, 메서드, 필드에 해당하는 Constructor, Method, Field 인스턴스를 가져올 수 있고,이어서 이 인스턴스들로는 그 클래스의 멤버 이름, 필드 타입, 메서드 시그니처 등을 가져올 수 있다. 또한 Constructor, Method, Field 인스턴스를 이용해 각각에 연결된 실제 생성자, 메서드, 필드를 조작할 수도 있다.예를 들어 Method.invoke는 어떤 클래스의 어떤 객체가 가진 어떤 메서드라도 호출할 수 있다. ### 리플렉션 단점컴파일타임 타입 검사가 주는 이점을 하나..
## 객체는 인터페이스를 사용해 참조하라 적합한 인터페이스만 있다면 매개변수뿐 아니라 반환 값, 변수, 필드를 전부 인터페이스 타입으로 선언하자.실제 클래스를 사용해야 하는 상황은 생성할 때뿐이다.인터페이스를 타입으로 선언하는 습관은 프로그램을 훨씬 유연하게 만들어 준다.### 인터페이스를 타입으로 선언// GoodSet sonSet = new LinkedHashSet();// BadLinkedHashSet sonSet = new LinkedHashSet();위 예시에서 구현 클래스를 교체하고자 한다면 아래와 같이 변경할 수 있다.Set sonSet = new HashSet();이처럼 인터페이스를 타입으로 사용한 선언은 간단하게 새로운 구현 클래스로 교체할 수 있다.### 주의사항만약 인터페이스의 일반 ..
## 다른 타입이 적절하다면 문자열 사용을 피하라### 문자열텍스트를 표현하도록 설계된 클래스문자열은 워낙 많이 사용되고 잘 지원되어 의도하지 않은 용도로 쓰이는 경우도 있다.### 문자열 사용 유의점* 다른 값 타입을 대신하기에 적합하지 않다.- 데이터가 수치형이라면, int/float 등 적당한 수치 타입으로 변환- 예/아니오와 같은 데이터라면, boolean으로 변환* 열거 타입을 대신하기에 적합하지 않다.- 아이템 34에서 다룬 내용처럼, 상수를 열거할 때에는 문자열보다 열거 타입이 훨씬 좋다.* 혼한 타입을 대신하기에 적합하지 않다.- 여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋지 않다.* 권한을 표현하기에 적합하지 않다.ex 1) 혼합 타입을 문자열로 처리한 부적절한 ..
## 정확한 답이 필요하다면 float 과 double 은 피하라 ### float, double과학과 공한 계산용으로 설계된 데이터 타입이다.이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 근사치로 계산하도록 설계되었다.정확한 결과가 필요한 금융 관련 계산과는 어울리지 않는다.1.03 - 0.42의 결과를 0.6100000000001을 출력한다.### BigDecimal, int, long 사용- BigDecimal : 사용하기 불편하고 느리다는 단점이 있다.public static void main(String[] args) { final BigDecimal TEN_CENTS = new BigDecimal(".10"); int itemsBought = 0; BigDe..
## 전통적인 for 문보다는 for-each 문을 사용하라 - 전통적인 for문// 컬렉션 순회for (Iterator i = c.iterator(); i.hasNext(); ){ Element e = i.next(); ... //e로 무언가를 한다.}// 배열 순회for (int i = 0; i - 문제점 : 반복자와 인덱스 변수는 코드만 지저분하게 할 뿐 꼭 필요한 것은 원소들뿐이다.반복자와 인덱스 '변수'를 잘못 사용할 가능성이 높아진다.컬렉션이나 배열이냐에 따라 코드 형태가 달라진다.### for-each ( 향상된 for문(enhanced for statement) )for (Element a : elements) { ..// a로 무언가를 한다.}- 장점 : 1. 반복자와 인덱스 변수..
## 반환 타입으로는 스트림보다 컬렉션이 낫다 - 스트림은 반복을 지원하지 않기 때문에 스트림과 반복을 알맞게 조합해야 좋은 코드가 나온다.ex. foreach로 반복 불가능 (컴파일 오류 발생)static Stream allProcesses()// Stream.iterator 사용for(ProcessHandle p: ProcessHandle.allProcesses.iterator()) {}Test.java:6: error: method reference not expected herefor (ProcessHandle ph : ProcessHandle.allProcesses()::iterator) { ### 어댑터(Adapter)1) Stream -> IterableStream 를 Iterable 로 중..
## 지역번수의 범위를 최소화하라 ### 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. ### 지역변수의 범위를 줄이는 기법- 가장 처음 쓰일 때 선언하기: 미리 선언부터 해두면 코드가 어수선해져 가독성이 떨어짐. 변수를 실제로 사용하는 시점엔 타입과 초깃값이 기억나지 않을 수도 있다.: 변수가 쓰이는 범위보다 너무 앞서 선언하거나,다 쓴 뒤에도 여전히 살아 있게 되기 쉽다. 그래서 실수로 의도한 범위 앞 혹은 뒤에서 그 변수를 사용하면 끔찍한 결과로 이어질 수 있다. - 거의 모든 지역변수는 선언과 동시에 초기화해야 한다.: 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다.: try-catch 문은 이 규칙에서 예외다. 변수..
## 스트림 병렬화는 주의해서 적용하라 -자바8부터는 parallel 메서드를 호출하면 파이프라인을 병렬 실행할 수 있는 스트림을 지원함ex. public static void main(String[] args) { primes().map(p -> TWO.pow(p.intValueExact()).subtract(ONE)) .filter(mersenne -> mersenne.isProbablePrime(50)) .limit(20) .forEach(System.out::println); } static Stream primes() { return Stream.iterate(TWO, Big..