ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 21일차 - 스트림, 시간과 날짜에 관련된 클래스, 파일 입출력(I/O) 모델과 스트림, 파일입출력 필터 스트림과 버퍼링 기능.
    AI 솔루션 개발자과정(Java, Python) 2022. 11. 7. 17:28

    필터링과 맵핑

    필터링

    필터링은 스트림을 구성하는 데이터 중 일부를 조건에 따라 걸러내는 연산이다.

     

     

    맵핑

    맵핑은 주어진 자료를 받아서 새로운 데이터를 내보내는 연산(반환형)이다.

     

    리덕션과 reduce 메소드: 최종 연산

    reduce 메소드의 매개변수는 스트림이 비어있을 때 최종 대체제 역할을 한다.

    또한 스트림의 맨 앞에 추가되는 또 다른 멤버 역할을 한다.

    reduce 메소드에 추가된 "very nice" 인자는 리스트를 기반으로 만든 스트림의 제일 앞에 붙은 멤버가 되어 비교연산을 하게된다.

     

     

    병렬 스트림

    일반적인 스트림과 다른 부분은 연산과정과 parallelStream() 스트림생성 메소드이다.

    연산 과정은 스트림을 나누어 연산을 따로 진행하고, 그 결과끼리 모아서 다시 진행한다.

     

     

    스트림의 생성과 연결

    스트림 생성에 필요한 데이터를 직접 전달하는 of

    하나의 컬렉션 인스턴스로 이루어진 스트림이란, Toy나 Robot또는 Box 하나의 객체가 아닌, 이 객체들을 모두 포함하는 리스트를 지칭한다.

     

     

    range() 메소드는 시작점부터 끝나는 지점-1 까지의 요소를 가지는 스트림을 생성한다.

    rangeClosed() 메소드는 끝나는지점까지 포함한다. range는 ~이상 ~미만이라고 생각하고, rangeClosed는 ~이상 ~이하 라고 생각하면 쉽다.

     

     

    병렬 스트림으로 변경

    직렬 스트림을 병렬 스트림으로 변경할 때는, .parallel() 메소드를 이용하여 변경한다.

     

     

     

     

    스트림의 연결

    문자열 연산처럼 concat메소드를 이용하여 스트림도 더할 수 있다.

     

     

     

    스트림의 중간연산

    맵핑(Mapping)에 대한 추가 정리

    Map은 스트림의 개별 요소에 대해 순차적으로 접근하여 어떤 작업을 수행한 후에 작업 결과물을 반환한다. 

           반환한 자료들은 다시 하나의 스트림을 형성하게 된다.

     

    flatMap은 스트림의 개별 요소에 대해 순차적으로 접근하여 어떤 작업을 수행한 후에 작업 결과물을 스트림 형태로 반환한다. 반환된 스트림들은 이어져서 다시 하나의 스트림을 형성하게 된다.

     

    1,2,3 / 4,5,6/ 7,8,9 멤버를 가지는 3개의 스트림이 있다. 1을 더하는 Map메소드를 적용한다면 Map 메소드는 2,3,4 / 5,6,7/ 8,9,10 3개의 스트림을 반환한다.

    flatMap 메소드를 적용하면 2,3,4,5,6,7,8,9,10 모두 이어진 스트림이 형성된다.

     

     

    정렬

    IntStream은 오름차순 정렬만 가능하고, 인수를 따로 받지 않는다.
    따라서 정렬 방법을 부여하고 싶으면, Stream<T> 를 사용해야 한다.

     

     

     

    루핑(Looping)

    루핑은 요소 전체를 반복하는 것이다.

    대표적인 루핑연산으로 forEach와 peek가 있다.

    루핑 연산 forEach는 ‘최종 연산’ 이고, 다음 메소드들은 ‘중간 연산’으로 루핑 연산을 한다.

    forEach는 각각의 멤버에 작용한 후 스트림이 종료된다. 하지만 peek메소드는 연산 후에도 스트림이 남아있다.중간연산은 최종 처리 메소드가 존재하지 않으면 동작하지 않는다.

    따라서 첫 스트림의 peek()메소드는 최종 처리 메소드가 없기 때문에 동작하지 않는다.

     

     

     

    스트림의 최종 연산

    스트림의 최종연산 메소드들 : sum(), count(), average(), min(), max()

    합을 구한다.

    개수를 센다.

    평균을 구한다.

    최솟값을 구한다.

    최댓값을 구한다.

     

     

     

    forEach

    forEach는 함수형 인터페이스 Consumer를 사용하여 반환형이여서 최종연산이다.

     

     

    allMatch, anyMatch, noneMatch

    논리연산자 and, or, not을 생각하면 쉽다.

     

     

     

    데이터를 모으는 Collect

    collect는 매개변수가 3개 있다.

    첫 번째 매개변수로 저장소를 가진다.

    두 번째 매개변수는 2개의 인자를 가지는데,  첫 인자로 첫 매개변수에서 생성된 저장소를 가지고, 두 번째 인자로 저장소에 들어갈 데이터를 가진다.

    세 번째 매개변수로 직렬 스트림에서는 의미없지만, 병렬 스트림일 경우 연산할 방법을 제시한다.

     

     

     

    시각과 날짜 관련 코드의 작성

    시간과 관련된 Instant 클래스

    시각 : 시간의 어느 한 시점.  ex) 12시 30분

    시간 : 어떤 시각과 어떤 시각 사이  ex) 시험시간은 60분이다.

     

     

     

     

    LocalDate 클래스

    LocalDate는 시각 정보가 생략된 ‘날짜 정보’ 표현하기 위한 클래스

     

     

     

    날짜의 차를 표현하기 위한 Period 클래스

    period는 데이터를 반환한다. 

     

    P1M18D에서 P는 period를 1M 18D가 날짜를 나타낸다. 1달 18일차이이다.

     

     

     

     

    LocalTime 클래스와  LocalDateTime

    LocalDate는 날짜 정보를, LocalTime은 시각 정보를, LocalDateTime은 두 가지를 동시에 나타낸다.

     

     

    두 LocalDateTime 인스턴스 간의 시각과 날짜의 차

    날짜와 시간 정보를 따로 나타낼 수 있다.

    toLocalDate() 메소드를 이용해야 오류가 발생하지 않는다.

     

     

     

    시간대를 적용한 코드 작성

    세계 협정시 : 영국의 그리니치 천문대를 중심으로 측정한 시간

    한국의 시간대는 utc+9 이며 세계 협정시보다 9시간 빠르다.

     

     

    시간대를 표현하는 ZoneId 클래스

    시간대 고려한 코드 작성을 위해서는 ZonedId 인스턴스 생성

     

     

     

     

    필터링을 이용하여 원하는 정보만 찾을 수 있고, 정렬도 가능하다.

     

     

    시간대를 반영한 ZonedDateTime 클래스

    ZonedDateTime 클래스는 날짜와 시간을 동시에 표기할 수 있는 클래스이다.

     

     

     

     

     

    날짜와 시각 정보의 출력 포맷 지정

    yyyy는 모든 연도를, ex) 2018년 , 2022년
    yy는 연도의 뒷자리2개를, ex) 15년, 22년
    M은 간략한 월을, ex) 1월, 4월, 11월
    MM은 0을 쓸 수 있는 월에 0을 추가한다. ex) 03월 , 08월
    시간단위또한 위와 동일하다.

    VV는 일종의 약속이다.

     

     

     

    I/O 스트림에 대한 이해

    ‘스트림’과 ‘I/O 스트림’의 차이

    스트림 : 데이터를 어떻게 원하는 형태로 걸러내고 가공할 것인가?

    I/O 스트림 : 어떻게 데이터를 입력하고 출력할 것인가?

    • 파일에 저장된 문자열을 꺼내어 컬렉션 인스턴스에 저장
       → ‘I/O 스트림’으로 해결해야 할 부분

    • 컬렉션 인스턴스에 저장된 문자열 중 길이가 5 이상인 문자열만 출력
       → ‘스트림’으로 해결해야 할 부분

     

     

    I/O 스트림 모델

    프로그램의 상당 부분은 다음 대상의 입출력과 관련이 있다. 그리고 이들에 대한 자바의 입출력 방식을 가리켜 I/O 모델이라 한다.

     • 파일
     • 키보드와 모니터
     • 그래픽카드, 사운드카드
     • 프린터, 팩스와 같은 출력장치
     • 인터넷으로 연결되어 있는 서버 또는 클라이언트

     

     

    I/O 모델과 스트림(Stream)의 이해

    • 입력 스트림 (Input Stream): 실행 중인 자바 프로그램으로 데이터를 읽어 들이는 스트림
    • 출력 스트림 (Output Stream): 실행 중인 자바 프로그램으로부터 데이터를 내보내는 스트림

    입력 스트림과 출력 스트림은 한쪽 방향으로 밖에 데이터를 처리할 수 있다. 이를 단방향 스트림 이라고 한다.

     

     

     

    파일 대상 입출력 스트림 생성

    InputStream과 OutputStream은 IOException 예외를 포함하고있다.

    따라서 throws 키워드를 이용하여 사전에 예외를 처리한다.

     

    파일 입출력시 존재하지 않는 파일에 출력을 하기 위한 스트림을 생성하면, 파일이 새롭게 만들어진다.

    그러나 입력 스트림은 존재하지 않는 파일에 대해 생성할 수 없다.

     

     

    입출력 스트림 관련 코드의 개선: finally 기반 close

    스트림 생성에 성공했을 때 프로그램을 종료한다.

     

     

    입출력 스트림 관련 코드의 개선: try-with-resource 기반

    try-with-resource를 사용하여 예외를 처리한다.

     

     

    바이트 단위 입력 및 출력 스트림

    while 반복문을 통해 자료를 불러와서 쓴다. 불러올 자료가 없다면 반복을 종료하는 조건을 건다.

     

     

    보다 빠른 속도의 파일 복사 프로그램

    바이트 단위 복사는 단점이 명확하다.

    첫째 속도가 느리다.

    둘째 바이트 단위로 복사를 하는데, 숫자로 치면 4바이트로 구성되어있다. 그럼 4바이트를 1바이트씩 쪼개서 복사를 하는데, 우리가 알아보기 힘들 수 있다.

    이때 버퍼 기반 파일 복사를 한다.

    버퍼는 자료를 모아서 한번에 보내는 기능이다. 인터넷에 있는 영상을 실시간으로 시청할 때 버퍼링을 통해서 영상이 끊기지 않고 이어서 볼 수 있게 미리 로딩되듯, 자료를 모아서 한번에 보낸다.

     

    버퍼를 이용하면 입출력 시 속도 개선의 효과가 있다.

     

     

    필터 스트림의 이해와 활용

    입출력 필터 스트림의 이해

     

     

    입출력 필터 스트림의 예

    DataOutputStream과 DataInputStream은 기본 자료형의 입력과 출력을 위한 필터 스트림이다.

    사용할 때는 인스턴스생성후 입력값에 자료형만 입력하면 된다. 입력시에는 출력할 때의 처럼 자료형을 같이 입력해야한다.

     

     

    버퍼링 기능에 대한 대책 : flush 메소드의 호출

    출력할 때 15바이트의 자료를 10바이트의 버퍼로 전달한다면 5바이트의 자료는 남게된다.

    버퍼에 자료가 가득차지 않는다면 내용물을 전달하지 않는다.

    이때 flush 메소드는 목적지로 데이터를 전송하여 버퍼를 비워주는 역할을 한다.

     

    close() 메소드가 내부적으로 flush 메소드를 호출한다고 한다.

    두 메소드의 차이점은 flush() 메소드는 사용자가 원할 때 버퍼를 비운다는 것과,

    코드를 종료할 때 버퍼를 비운다는 것이다.

     

     

    파일에 필터 스트림과 버퍼링 기능 적용하기

    기본 자료형 입력을 위한 필터스트림의 매개변수로 버퍼링 기능을 제공하는 필터스트림을 넣고 이 버퍼링스트림의 매개변수로 파일출력을 위함 스트림을 넣고 파일이름을 지정한다.

    마지막으로 이 코드를 기본자료형 필터스트림에 참조변수를 선언하여 참조한다.

Designed by Tistory.