본문 바로가기

전체 글

item 46) 스트림에서는 부작용 없는 함수를 사용하라 스트림 : 함수형 스타일 오퍼레이션을 지원하는 클래스 스트림의 특징 No storage : 저장을 위한 자료구조가 아니라 소스(자료구조, 배열, I/O 채널 등)로부터 자료를 받아서 계산을 위한 파이프라인 함수형 : 스트림의 연산(operation) 은 결과를 생산만 하지, 소스를 수정하지 않음 ex) 스트림을 필터링한다고 해서 기존 리스트의 원소를 제거 하지는 않음 Laziness-Seeking : 대부분의 스트림 연산(filter, map, 중복 제거 등) 은 lazy 하게 작동한다. (스트림 연산이 최종 연산이 호출되는 시점까지 지연됨) List strings = List.of(1,2,3,4,5); strings.stream() .map(x->{ System.out.println(x); return.. 더보기
JVM 언어 의 공변 1. 공변이란? 제네릭에서는 3가지 공변 성질을 제공한다. 공변(Variance) : A가 B의 하위 타입일 때, T 가 T의 하위 타입이면 T가 공변의 성질을 가지고 있다고 말한다. 반공변(Contravariance) : A가 B의 하위 타입일 떄, T가 T 의 하위 타입이면 T가 반공변의 성질을 가지고 있다고 말한다. 무공변(Invariance) A가 B의 하위 타입일 때, T와 T간의 아무 관계도 없다면 무공변이라고 말한다. 이러한 공변, 반공변, 무공변으로 메소드의 인자로 들어오는 파라미터의 타입에 제한을 걸수 있다. 공변의 경우 Java에서는 extends, Kotlin에서는 out이라는 키워드를 사용한다.(Producer패턴 : 해당 타입을 생산하는 패턴에 사용) 반공변의 경우 Java에서는 .. 더보기
코틀린 제네릭스 JVM 의 제네릭스는 보통 타입 소거를 사용해 구현한다. -> 타입 소거란 실행 시점(Run Time)에 타입 관련 정보가 소거되는 것을 의미한다. -> 이는 JAVA에서 처음부터 제네릭스를 지원하지 않았기 때문이다. (참고로 제네릭스는 2003년 발표된 JDK 1.5 버전부터 포함된 내용이다.) 하위호환성을 중요시 하는 자바인 만큼 JDK 1.5 전버전과의 호환성때문에 이렇게 만들것으로 추측된다. -> 런타임에 타입관련 정보가 없기 때문에 ClassCastException 등 타입으로 발생하는 비검사 예외가 발생할 여지가 있다. 코틀린에서는 실체화를 통해 타입 인자가 지워지지 않도록 하여 이러한 비검사 예외를 컴파일 시점에 체크할수 있도록 하는 장치가 있다. var intList = ArrayList .. 더보기
item 42) 익명 클래스보다는 람다를 사용하라 public class LamdaIsBetter { public static void main(String[] args) { List words = new ArrayList(); Collections.sort(words, new Comparator() { @Override public int compare(String o1, String o2) { return o1.compareTo(o2); } }); // 익명 클래스 Collections.sort(words, (s1,s2)-> -s1.compareTo(s2)); //람다 Collections.sort(words, comparingInt(String::length)); //메소드 참조 words.sort(comparingInt(String::length.. 더보기
item 64) 객체는 인터페이스를 사용해 참조하라. 적합한 인터페이스만 있다면 매개변수 뿐만 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라. 인터페이스 타입을 사용할 경우 프로그램이 더 유연해짐(구현 클래스만 교체하면됨 원래의 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하며 주변 코드가 이 기능에 기대어 동작하다면 새로운 클래스도 반드시 같은 기능을 제공해야한다. 선언 타입과 구현타입을 동시에 바꿀수 있으니 괜찮을 수 있을거라고생각가능 X 클라이언트에서 기존 타입의 메소드를 사용할 경우 컴파일 에러 발생 가능 //좋은 예 Set sonSet = new LinkedHashSet(); Set sonSet = new HashSet(); //구현체 변경 //나쁜 예 LinkedHashSet sonSet = new LinkedHas.. 더보기
item 36) 비트 필드 대신 EnumSet을 사용하라 비트 필드 : 비트별 OR를 사용해 여러 상수를 하나의 집합으로 모을 수 있는 집합 public class Text{ public static final int STYLE_BOLD = 1 더보기
item 35) ordinal 메소드 대신에 인스턴스 필드를 사용하라. ordinal => 해당 상수가 열거타입에서 몇 번째 위치인지를 반환하는 메서드 /* 연주자가 1명(SOLO) ~ 10aud (DECTET)를 표현한 열거 타입 */ public enum Ensemble { SOLO, DUET, TRIO , QUARTET, QUINTET , SEXTET, SEPTET, OCTET, NONET, DECTET; public int numberOfMusicians(){ return ordinal() + 1; } } ordinal 메서드의 문제점 상수 선언 순서에 의존성을 가지게됨 => 상수 선언 순서를 바꿀 경우 numberOfMusicians는 오동작함(순서에 의존성을 가짐), 값이 같은 상수는 추가할 방법이 없음 (8중추가 이미 있으므로, 복4중주(DOUBLE_QUARTE.. 더보기
item28) 배열보다는 리스트를 사용하라 불공변성(Invariant) 무공변성이란 상속 관계에 상관없이, 자기 타입만 허용하는 것 공변성(covariant) 공변성은 자기 자신과 자신을 상속한 하위 객체의 타입을 허용하는 것 반공변성(contravariant) 공변성의 반대 개념 자기 자신과 자신이 상속한 부모 객체만 허용하는 것 제네릭은 불공변, 배열은 공변이다. public static void main(String[] args) { Object [] objects = new Long[10]; objects[0] = "boo"; // ArrayStoreException 발생 List objectList = new ArrayList(); // List 는 제네릭 타입으로 무공변이다. 컴파일 에러 발생 objectList.add("boo"); .. 더보기