일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Perfect Watermarks
- 가변성
- Heuristic Watermark
- processing time
- event time
- watermark
- Generic
- covariant
- ingestion time
- coroutines
- flink watermarks
- java
- watermarks
- lambda
- apache flink
- flink
- Perfect Watermark
- MapReduce
- 공변
- Heuristic Watermarks
- 불공변
- flink watermark
- Hadoop
- kotlin
- Coroutine
- HDFS
- Generics
- Stream
- contravariant
- Today
- Total
목록개발/Java (8)
mm Home
Generic JDK 1.5에서 타입 안정성을 위해 generic 추가 됨. //아래와 같이 raw type을 쓰게되면 ClassCastException을 발생하기 쉬웠다 List list = new ArrayList(); list.add(1); list.add("jess"); Generic을 만들었는데, JDK 1.5 미만의 버전의 호환을 선택. 그래서… Type Erasure 하위 호환을 위해 Type Parameter 정보를 지운다. JDK 1.5 미만에서 컴파일이 되어도 Generic을 사용했을때와 동일하게 하기 위함이다. List list = new ArrayList(); //위의 코드는 Type Erasure에 의해 실제 Runtime 시에 아래와 같다. List list = new Array..
최근 발표된 Java 9의 새로운 피쳐들에 대해 많은 글들이 올라온다. 능력은 안되지만 나도 나름대로 공부한걸 정리해보았다. try-with-resourcesjava 7 에서 추가되었던 try-with-resources 구문을 더 간결하게 사용할 수 있다.try-with-resources : AutoCloseable 를 구현한 클래스에 대해 try 구문이 끝날때 자동으로 close 처리해주는 기능변경된 내용//java 9 이하try (ByteInputStream b = new ByteInputStream()) {} catch (Exception e) {} //java 9 try (a; b) { //이전과 동일하게 다수의 자원 선언 가능.} catch (Exception e) { }추가 사항try-with..
중첩 클래스를 생성할 일이 생겼었다. static으로 만들까 non-static 으로 만들까 고민을 했다. 그런데 static을 그저 객체 생성없이 사용 가능하게하는 키워드로만 알고 있었으니, static 중첩 클래스는 객체가 생성이 안되는것인가?? 라는 착각마저 불러일으켰다. static에 대해서 잘 모르는 부분이 있어서 공부를 해보았다. static이란? 정적이라는 뜻의 단어이다. 이 단어만 가지고서는 잘 이해하기 어려운것 같다. 고정된이라는 뜻이면 좀 더 이해가 쉬울까? 어쨋든.. static 은 프로그램상의 고정된 자원이다. 동적인 자원과 달리, 라이프사이클이 어플리케이션의 구동과 함께 생성되어지고, 종료시에 사라지게 될 것이다. 모든 클래스가 static? 본론에 들어가기 앞서 일반 클래스는 s..
스트림 API이란? 연속적인 데이터 항목들의 모임들을 처리하는 API 라고 생각한다. 연속적인 데이터를 생성하여, 사용자에 맞는 중간 연산과, 종료연산을 통해 원하는 결과를 추출하도록 도와준다. 가볍게 구조를 나누어보면 이렇게 나눌 수 있다. - Stream 생성 - 중간 연산 (Intermediate Operations) - 종료 연산 (Terminal Operations) 구조별로 살펴보자. 스트림 생성 스트림을 생성하는 방법은 여러가지 있다. 연속적인 데이터를 어떻게 Stream의 인터페이스로 생성하느냐의 문제이다. (parallelStream 은 나중에) Array to Stream //#1 String[] arr = { "program", "creek", "program", "creek", "j..
Lambda Translation어떻게 람다가 바이트코드로 변환되어지고, 사용되어지는지 대략적으로 살펴보자. 람다식은 functional interface를 구현한 구현체 오브젝트를 생성하는 것이 아니다. (익명 클래스와 다르다) 해당 클래스 내에 바이트코드를 생성한다. public void test5() { Consumer consumer = (Integer i) -> System.out.println(i); } 위와 같은 람다식이 있다고 가정하자. 저것은 람다식일 뿐, 실제 사용은 consumer.accept(1) 과 같이 클로져(closure)의 형태로 사용할 것이다. 이제 Translation 과정이 어떻게 이루어지는 살펴보자. 우선 (Integer i) -> System.out.println(i..
앞에서 변화하는 요구사항에 효과적으로 대응하는 코드 구현 방법을 살펴보았다. 람다 표현식을 어떻게 만드는지, 어떻게 사용하는지, 어떻게 간결하게 만들 수 있는지 살펴본다. 람다란 무엇인가? 익명함수를 단순화한 것이라고 할 수 있다. 람다는 세 부분으로 이루어져 있다. 파라미터 리스트, 화살표, 바디. 아래의 람다 표현식을 살펴보자. (Apple a1, Apple a2) -> log.debug("a1 : {}, a2 : {}", a1.getWeight(), a2.getWeight()) (Apple a1, Apple a2) : 파라미터 부분-> : 화살표 (파라미터와 람다 바디의 구분) log.debug("a1 : {}, a2 : {}", a1.getWeight(), a2.getWeight()) : 바디 람..
소비자의 요구사항은 항상 바뀐다. 기능은 쉽게 구현할 수 있어야 한다. 동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드 블록을 의미한다. 동작(함수)를 파라미터화 한 것. 동작 파라미터화의 과정은 이보다 훨씬 길지만.. 간략히 적어보면! 사과의 종류에 따른 분류를 하려고 한다면?? 매번 분류하는 작업마다 코드를 추가하는건 쉬운 방법이지만 코드의 중복 + 복잡. 동작 파라미터화를 사용하면,, filter를 하는 동작과 실제 분별하는 동작을 구분하여, 인자로 받게 된다. 실제 filter를 하는 시점에 분별하는 동작을 수행하게 되므로 다양한 분별 작업만 정의해서 건네주면 된다. 아래와 같은 코드로 표현할 수 있다. (ApplePredicate라는 test메소드가 있는 인터페이스. 인터페이스..
예전에 Java 8 공부했던 내용을 블로그에 옮겨본다. Java 8에 함수형언어의 기능이 들어간게 가장 큰 특징이 아닐까? 함수형이란건?함수가 중심인 언어한마디로 수학적 함수는 참조 투명성!! 프로그램 동작의 변경없이 관련 값을 대체할 수 있다면 표현식을 참조상 투명하다고 한다.관련 값은 모두 입력으로 받을 수 있기 때문에 동일한 값에 대해 동일한 결과를 반환하게 된다. 어떠한 상태도 가지고 있지 않으며(stateless), 동일한 값에 동일한 결과를 반환한다 (side-effect-free)위의 함수(표현식)를 순수 함수라고 부른다.수학적 함수란,,동일한 입력에 대해 동일한 출력 (출력은 입력에만 의존)side-effect-freestateless→ 그래서 함수형 언어에서 immutable 강조! Ja..