일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- 이펙티브 자바
- 백준
- 비트마스크
- 스프링
- 세그먼트 트리
- pandas
- disjoint set
- JPA
- BFS
- 알고리즘
- 파이썬
- 데이터 flow
- java
- 위상정렬
- equals
- ddd
- dataframe
- UML
- DP
- spring security
- dfs
- docker
- springboot
- 다익스트라
- 포트앤어댑터 아키텍처
- 헥사고날 아키텍처
- series
- Redis
- 문자열
- Today
- Total
목록자바 메모장/이펙티브 자바 (6)
코딩못하는사람
아이템43] 람다보다는 메서드 참조를 사용하라 람다의 장점은 익명클래스보다 코드가 간결해진다는 장점을 가진다. 하지만 여기서 메서드 참조(Method reference)를 활용하면 한단계 더 간결해진 코드를 만들 수 있다. 코드로 예시를 보자. Map에 키가 없다면 키와 숫자 1을 매핑하고, 키가 존재하면 기존 매핑값을 증가시키는 코드이다. map.merge(key, 1, (count, incr) -> count + incr); //Map에서 제공하는 merge 메서드 merge 메서드는 키,값,함수를 인자로 받는다. 깔끔해 보이지만 매개변수 count와 incr이 하는일 없이 코드를 차지한다. 자바 8에서는 Integer 클래스 및 기본타입 래퍼클래스은 이 람다와 기능이 같은 정적 메서드 sum 을 제..
아이템 42]익명클래스보다는 람다를 사용하라 자바 8에 와서 추상 메서드 하나짜리 인터페이스는 의미를 인정받아 간결하게 코드를 작성할 수 있게 해주는 방식이 도입되었다. 함수형 인터페이스라 부르는 인터페이스들의 인스턴스를 람다식(lambda expression,혹은 람다)을 사용해 만들 수 있게 된 것이다. 람다는 익명 클래스와 개념은 비슷하지만 코드는 훨씬 간결하고 자질구레한 코드들이 사라지고 어떤 동작을 하는지 명확하게 보인다는 장점을 가진다. 익명 클래스를 사용할 때와 람다를 사용했을 때의 코드를 비교해보자. 문자열을 길이순으로 정렬하는 코드이다. 1.익명 클래스의 인스턴스를 함수객체로 사용하는 방식 Collection.sort(words, new Comparator() { public int co..
아이템40]@Override 애너테이션을 일관되게 사용하라. @Override 애너테이션은 상위 타입 메서드를 재정의했음을 알려준다. 이 애너테이션을 일관되게 사용하면 여러가지 악명높은 버그를 예방해준다. public class Bigram { private final char first; private final char second; public Bigram(char first, char second) { this.first = first; this.second = second; } public boolean equals(Bigram b) { return b.first == first && b.second == second; } public int hashCode() { return 31 * firs..
아이템29] 이왕이면 제네릭 타입으로 만들라 제네릭(generic)이란? 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미한다. 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다. 이렇게 컴파일 시에 타입검사를 미리 수행하면 타입 안정성과 타입 검사에 들어가는 노력을 줄일 수 있다. 클라이언트에서 직접 형변환해야 하는 타입보다 제네릭 타입이 더 안전하고 쓰기 편하다. 따라서 새로운 타입을 설계할 때 형변환 없이 제네릭 타입을 사용해주자. 제네릭으로의 변경이 필요한 코드를 보고 제네릭으로 고쳐보면서 이해해보자. public class Stack { private Object[] elements; private int size = 0; priva..
[아이템15]클래스와 멤버의 접근 권한을 최소화 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 차이는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로 부터 얼마나 잘 숨겼는지에 의해 결정된다. 잘 설계된 컴포넌트는 모든 내부구현을 숨기고 구현과 API를 깔끔하게 분리해서 서로의 내부 동작방식을 알 필요가 없게된다. 이것을 정보은닉 및 캡슐화라고 부른다. 정보은닉의 장점 시스템 개발 속도 상승 (여러가지 컴포넌트를 병렬적으로 개발 가능) 시스템 관리 비용 절감 (디버깅 및 다른 컴포넌트로 교체하는 부담이 적다) 성능최적화에 도움 소프트웨어 재사용성을 높인다.(외부 의존도가 거의 없고 독자적이라면 낯선 환경에서도 사용가능) 큰 시스템 제작 난이도를 낮춰준다. (전체가 완성되지 않아도 개별 컴포넌트의..
[아이템1] 생성자 대신 정적 팩터리 메서드를 고려하자 클라이언트가 클래스의 인스턴스를 얻기 위해서는 보통 public 생성자를 사용했다. 하지만 다른 방법으로 public static 팩토리 메소드를 사용해서 해당 클래스의 인스턴스를 만드는 방법도 있다. public static 팩토리 메소드의 장점 1. 이름을 가질 수 있다. BigInteger.probblePrime를 보자. 기존 생성자로 BigInteger()을 사용하는 것 보다 BigInteger.probblePrime()를 사용하면 만드려는 인스턴스 객체의 특성을 더 알아보기 쉽게 묘사할 수 있다. 2.호출될 때마다 인스턴스를 새로 생성하지 않아도 된다. 불변(immutable) 클래스인 경우나 매번 새로운 객체를 만들 필요가 없는 경우에 미..