책/Effective Java
객체는 인터페이스를 사용해 참조하라
cf) Item.51 : 매개변수 타입으로 클래스가 아닌, 인터페이스를 사용하라 → 객체는 클래스가 아닌 인터페이스로 참조하라로 확장 적합한 인터페이스만있다면 매개변수뿐 아니라, return, 변수, 필드를 전부 인터페이스 타입으로 선언하자 실제 클래스를 사용해야 할 상황은 오직 생성자로 생성할 때뿐이다. 인터페이스를 타입으로 사용하는 습관은 프로그램을 훨씬 유연하게 만들어 준다 // Good Set sonSet = new LinkedHashSet(); Set sonSet = new HashSet(); //유연하게 변경가능 // Bad LinkedHashSet sonSet = new LinkedHashSet(); 인터페이스를 타입으로 사용하면 이후 구현 클래스를 교체할 때 새 클래스의 생성자(혹은 다른 ..
문자열 연결은 느리니 주의하라
String + String 에서의 + : 문자열 연결 연산자는 여러 문자열을 하나로 합쳐주는 편리한 수단 단 한 줄짜리 출력값 혹은 작고 크기가 고정된 객체의 문자열을 표현할 때만 사용하자 문자열은 불변이기 때문에 두 문자열을 연결할 경우에는 양쪽의 내용을 모두 복사해야하므로, 문자열 연결 연산자를 통한 문자열 n개의 연산은 O(n^2)이다. 예시 // 청구서의 item을 전부 하나의 문자열로 연결하는 메서드 // 문자열 연결을 잘못 사용한 예 - 아이템이 많아지면 많아질수록 성능저하 public String statement() { String result = ""; for (int i = 0; i < numItems(); i++) { result += lineForItem(i); } return r..
다른 타입이 적절하다면 문자열 사용을 피하라
String(문자열) - Text를 표현하도록 설계되고, 자바가 잘 지원해주는 타입 하지만 워낙 자바에서 너무 잘 지원해주어서, 원래의 의도대로 사용되지 않는 경향이 있으며, 이럴 때 문자열 사용을 피해야할 사례에 대해서 이야기한다. # 문자열을 쓰지 않아야할 사례 1. 다른 값 타입을 대신해서 문자열을 사용하는 경우 받는 데이터가 수치형 - int, float, BigInteger ... 적당한 수치를 타입으로 변환해서 사용할 것 Y/N 를 나타낼 수 있다면 적절한 열거 타입 혹은 boolean 타입을 사용할 것 즉 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성할 것 2. 열거 타입을 대신하여 문자열을 사용할 경우 아이템 34(int 상수 대신 열거 타입..
박싱된 기본 타입 vs 기본 타입
Java Data Type 기본 타입 : int , double, boolean .. 참조 타입 : String, List ... 기본 타입과 참조 타입의 차이에 대해서 설명해주세요 더보기 1. 각 타입에 따라 저장되는 값이 다르다. A. 기본 타입 - 변수에는 실제 값이 저장된다. B. 참조 타입 - 배열, 열거, 클래스, 인터페이스를 이용해서 선언된 변수는 메모리 주소 값을 가지게 된다. 2. 해당 값이 저장되는 위치 A. 기본 타입 - Stack B. 참조 타입 - Heap 기본 타입과 박싱된 기본 타입의 차이에 대해서 설명해주세요 더보기 기본타입 : int, double , boolean ... 박싱된 기본 타입 : Integer, Double , Boolean ... 차이점 기본 타입은 값만 ..
정확한 답과 계산을 해야한다면 float와 double은 피하라
float, double 과학과 공학 계산용으로 설계된 타입 이진 부동소수점 연산에 사용되며, 넓은 범위의 수를 빠르고 정밀한 "근사치" 계산을 위해 세심하게 설계 → 따라서 float과 double 타입은 특히 금융 관련과 같은 정확한 답이 필요한 계산에서는 사용하기 적절치 않다. ex) 정확한 값을 구해야할 때 double, float을 사용하는 경우 // Q1. 1.03달러가 있을 때 그중 42센트를 사용할 경우 얼마가 남았을까? System.out.println(1.03 - 0.42); // -> result : 0.6.10000000000000001 // Q2. 1달러로 10센트짜리 사탕 9개를 살 경우에 얼마가 남았을까? System.out.println(1.00 - 9 * 0.10); // ..
메서드 참조 (Method Reference)
람다가 익명 클래스보다 나은 점 - 간결함 자바에서는 함수 객체를 람다보다 더 간결하게 만드는 방법이 존재 - 메서드 참조 메서드 참조 아래는 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부 코드이다. 이 때 값이, 키의 인스턴스 개수로 해석될 때 해당 프로그램은 multiset을 구현한게 되는데, 키가 맵안에 없다면 key를 1로 매핑하고 이미 있다면 기존 매핑 값을 증가시키는 코드이다. map.merge(key, 1, (count, incr)->count+incr); 해당 코드에서는 각 변수의 이름이 중요하지 않고, 더불어 코드 공간을 차지하게 된다. 이 때 count와 incr의 타입이 Integer일 때 다음과 같은 코드로 간결하게 할 수 있다. map.merge(key, 1, I..
lambda(람다) 사용법
자바 8에서의 추가 - 함수형 인터페이스 , 람다, 메서드 참조 : 함수 객체를 더욱 쉽게 만들기 - 스트림 API : 데이터 원소의 시퀀스 처리를 라이브러리 차원에서 지원 1997년 이전 : 기존에는 자바에서 함수 타입을 표현하기 위해 추상 메서드를 하나만 담은 인터페이스(추상 클래스)를 사용 이러한 인터페이스의 인스턴스 : 함수 객체(function object)라고 하여, 특정 함수나 동작을 나타내는 데 썼다. 1997년 이후 : JDK 1.1 등장과 함께 함수 객체 생성(표현) 방법 - 익명 클래스(아이템 24)를 통해서 충분히 표현했다. //익명 클래스의 인스턴스를 통해 함수 객체 사용하는 방법 Collection.sort(words, new Comparator() { //Comparator -..
마커 인터페이스(Marker Interface)
마커 인터페이스 : 아무 메서드도 선언되어있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시하는 인터페이스 ex) Serializable : 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 Write(Serialization)이 가능하다는 것을 알려줌 마커 어노테이션이 등장하면서 마커 인터페이스는 구식이 되었다고들 얘기하지만, 사실은 그렇지 않다. # 마커 인터페이스의 장점 마커 인터페이스는 이를 구현한 클래스의 인스턴스들을 구분하는 타입으로 쓸 수 있으나, 마커 어노테이션은 그렇지 않다. 마커 인터페이스는 어엿한 타입이므로, 마커 어노테이션을 사용했다면 런타임 때 발견될 오류를 컴파일 타임에 잡을 수 있다. ObjectOutputStream.writeObjec..