본문 바로가기

토비의봄13

4.1. Reactive Streams 1. Iterable Iterable 구조 Iterable을 구현하면 for-each loop에 타겟이 될 수 있다. public static void main(String[] args) { Iterable iter = Arrays.asList(1, 2, 3, 4, 5); // for-each loop for(Integer i : iter) { System.out.println(i); } } Iterable Interface 2개의 default 메소드, 1개의 메소드를 갖고있다. Iterator : Iterable Interface의 원소 순회를 하나씩 하기위해서 사용하는 도구 public interface Iterable { Iterator iterator(); default void forEach(.. 2021. 2. 28.
3.2. Generics 1. WildCard vs Generics 언제 제너릭을 사용하고 언제 wildcard를 사용할까? 아래의 예시에서는 wildcard의 한계를 보여준다. static void method1(List list) { } static void method2(List list) { /** * list.add(1); list.add("string"); -> 불가 */ list.add(null); list.size(); list.clear(); Iterator it = list.iterator(); list.equals(); } wildcard는 list 그 자체의 기능을 사용할 뿐, 원소를 추가할 수는 없는 모습이다. 예시) isEmpty() 함수를 만들어보자. public static void main(Stri.. 2021. 2. 25.
3.1. Generics 1. 타입파라미터와 타입 아규먼트 public class Generics { static class Hello { // T-> 타입 파라미터 T t; T method(T val) {return null;} } public static void main(String[] args) { new Hello(); // 타입 아규먼트 } } 2. 제너릭 쓰는이유 1. 컴파일시점에서 컴파일러가 정확하게 타입체킹을 할 수 있다. public static void main(String[] args) { List list = Arrays.asList(1, 2, 3); list.add("runTimeError"); List listWithGen = Arrays.asList(1, 2, 3); listWithGen.add("c.. 2021. 2. 24.
2. 슈퍼 타입 토큰 1. 제너릭 아래의 코드에서 s.value 컴파일 타임에서는 컴파일러가 미리 체크를하고, 캐스팅해준다. s.value = "String" ==(컴파일러)==> s.value = (String) "String"; 런타임에서 value 의 타입은 Object이다. type erasure 가 타입 파라미터를 지운다. public class TypeToken { static class Generic { T value; void set(T t) {} T get() {return null;} } public static void main(String[] args) throws Exception { Generic s = new Generic(); s.value = "String"; Generic i = new Gen.. 2021. 2. 20.