The A :

728x90
반응형
 

Today I Lean

I/O, 스트림 심화

 

스트림과 사랑에 빠질 것 같은 느낌..?

스트림이랑 람다가 좀 재밌다고 느껴진다.

지금까지 약 한달간 코딩을 배우면서 재밌다? 라고 느껴진건 이번이 처음인것 같다!

막 더 알아보고 싶고 배우지 않은 것도 검색해서 정리하고

스트림에 대해서 더 알아가는게 신나고 좋다.

 

 

 

학습목표 및 개념정리

# 파일 입출력 (I/O)

- 바이트 기반 스트림과 문자 기반 스트림의 간단한 입출력 코드를 이해하고 활용한다.

- 파일 클래스를 이해하고 활용한다.

 

# 스트림 심화학습

- 스트림에 대해 더 알아보자

 

 

 

배운 것

# 파일 입출력 (I/O)

 : 스트림은 단방향으로만 데이터를 전송할 수 있기 때문에 입력과 출력을 담당하는 각각의 스트림이 필요함

 : file을 다룰 때는 FileInputStream / FileOutputStream

 : 프로세스를 다룰 때는 PipedInputStream / PipedOutputStream

 

1. InputStream

- FileInputStream

echo code >> codestates.txt
// 터미널에 입력하면 code 내용의 파일 생성
// 호출할 코드와 같은 디렉토리에 있어야 함
import java.io.FileInputStream;
import java.io.BufferedInputStream;

public class FileInputStreamExample {
    public static void main(String args[]) {
        
        try {
            // FileInputStream 클래스를 사용하여 codestates.txt 파일을 열어서 fileInput 변수에 대입
            FileInputStream fileInput = new FileInputStream("codestates.txt");
            	// 한번에 많은 양의 데이터를 입출력 할 수 있도록 도와주는 임시 저장 공간
		BufferedInputStream bufferedInput = new BufferedInputStream(fileInput);
        
            int i = 0;
            
            // 파일 내용 읽어오기
            while ((i = fileInput.read()) != -1) {
                // 읽어온 값이 -1이 아니라면, 즉 파일의 끝이 아니라면 파일의 내용을 출력
                
                // 읽어온 값을 문자형으로 형변환하여 출력합니다.
                System.out.print((char) i);
            }
            
            // 파일닫기
            fileInput.close();
        }
        catch (Exception e) {
            // 예외 발생시 예외 정보를 출력
            System.out.println(e);
        }
    }
}

 

 

 

2. OutputStream

- FileOutputStream

import java.io.FileOutputStream;

public class FileOutputStreamExample {
    public static void main(String args[]) {
        
        try {
        // FileOutputStream 클래스를 사용하여 txt 파일을 fileOutput 변수에 대입
            FileOutputStream fileOutput = new FileOutputStream("codestates_Outputstream.txt");
            
            // 파일 안에 적힐 내용
            String word = "codestats";
            
		
            byte b[] = word.getBytes();	// 문자열을 byte배열로 변환
            fileOutput.write(b);	// 변환된 바이트 배열을 파일에 작성
            fileOutput.close();		// 파일 닫기
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }
}

 

 

 

 

# 스트림 심화학습

* .toArray(String[]::new); 와 .collect(Collectors.toList()); 의 차이?

두 메소드는 모두 Stream 객체를 이용하여 컬렉션을 변환하는데 사용되지만, 반환하는 컬렉션의 타입이 다름

- .toArray(String[]::new)

Stream 객체에서 배열로 변환하는 메소드

메소드 인자로 생성자 레퍼런스 전달 -> 배열의 타입 지정가능

toArray() 메소드는 스트림의 모든 요소를 지정한 타입의 배열로 변환하여 반환.

 

- .collect(Collectors.toList())

Stream 객체에서 List로 변환하는 메소드입니다.

Collectors 클래스의 toList() 메소드를 이용하여 List로 변환할 수 있습니다.

collect() 메소드는 스트림의 모든 요소를 지정한 타입의 컬렉션으로 변환하여 반환

 

 

* .toArray()와 .collect()의 활용방법

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);

    // 1. toArray() 메소드
    
    Integer[] arr1 = stream.toArray(Integer[]::new);



    // 2. toArray() 메소드 (또 다른 형태)
    
    stream = Stream.of(1, 2, 3, 4, 5);
    Object[] arr2 = stream.toArray();



    // 3. toArray() 메소드 (변환 대상 배열이 이미 있는 경우)

    stream = Stream.of(1, 2, 3, 4, 5);
    Integer[] arr3 = new Integer[5];
    arr3 = stream.toArray(arr3);



    // 4. collect() 메소드

    stream = Stream.of(1, 2, 3, 4, 5);
    Integer[] arr4 = stream.collect(Collectors.toList())
    .toArray(new Integer[0]);

 

 

* 스트림 요소를 수집하는 메서드의 종류

  1. toList() : 스트림 요소를 List 타입으로 수집
  2. toSet() : 스트림 요소를 Set 타입으로 수집
  3. joining() : 스트림 요소를 구분자로 구분하여 String 타입으로 수집
  4. toMap() : 스트림 요소를 Map 타입으로 수집
  5. groupingBy( ): 스트림 요소를 그룹화하여 Map 타입으로 수집
  6. partitioningBy() : 스트림 요소를 조건에 따라 true와 false로 분할하여 Map 타입으로 수집

 

 

* getAs*() 사용법

이 때 *은 타입을 의미함

  1. getAsBoolean(): 부울형 데이터로 변환
  2. getAsNumber(): 숫자형 데이터로 변환
  3. getAsCharacter(): 문자형 데이터로 변환
  4. getAsString(): 문자열 데이터로 변환

- 만약 getAs*() 메서드에서 *에 해당하는 타입을 생략하면, Gson 라이브러리에서 해당 데이터를 가장 적합한 자바 데이터 타입으로 자동으로 변환하여 반환해줌

 

 

 

*Stream에서 Optional 객체를 반환하는 메소드

요소 찾기

  • findFirst()
  • findAny()

 

최대/최소값 찾기

  • max()
  • min()

 

요소 누적 처리

  • reduce()

 

요소 일치 여부 확인

  • anyMatch()
  • allMatch()
  • noneMatch()

 

위와 같은 메소드들은 Optional 객체를 반환하기 때문에,

orElse()orElseGet() 메소드를 사용하여 Optional 객체가 비어있을 때 처리할 로직을 구현할 수 있음

 

 

 

*Stream에서 Optional 객체를 반환하지 않는 메소드

중간 연산 (Intermediate operations)

  • filter(Predicate<T> predicate)
  • map(Function<T, R> mapper)
  • flatMap(Function<T, Stream<R>> mapper)
  • distinct()
  • sorted()
  • peek(Consumer<T> action)
  • unordered()
  • limit(long maxSize)
  • skip(long n)

 

최종 연산 (Terminal operations)

  • forEach(Consumer<T> action)
  • forEachOrdered(Consumer<T> action)
  • toArray()
  • reduce(T identity, BinaryOperator<T> accumulator)
  • collect(Collector<T, A, R> collector)
  • min(Comparator<T> comparator)
  • max(Comparator<T> comparator)
  • count()
  • anyMatch(Predicate<T> predicate)
  • allMatch(Predicate<T> predicate)
  • noneMatch(Predicate<T> predicate)
  • findFirst()
  • findAny()

위의 메소드 들은 모두 Stream<T> 형태의 스트림을 다루며, Optional 객체를 반환하지 않음

 

 

 

* double 값을 반환할때 getAsDouble()과 orElse() 중 어떤 것을 사용해야 하는지?

getAsDouble()와 orElse() 둘다 OptionalDouble 객체의 값을 가져와서 double값으로 반환함
(둘 중 하나를 사용하면 double 타입으로 반환됨)
단, orElse() 메서드는 OptionalDouble 객체가 비어있을 경우 기본값으로 지정한 값을 반환하고
getAsDouble() 메서드는 OptionalDouble 객체가 비어있다면 NoSuchElementException에러가 발생함

따라서 OptionalDouble 객체가 비어있을 가능성이 있다면 orElse()메서드를 사용하고, 
그게 아니라면 getAsDouble()메서드를 사용하는것이 좋다,

 

 

 

 

 

 

 

Tomorrow Chapter

# 스레드 (Thread)

# 자바 가상 머신 (Java Virtual Machine)

 

 

 


 

 

↓ 이전 글 ↓

 

[코드스테이츠] 05_03_TIL : 애너테이션, 람다, 스트림

Today I Lean 애너테이션, 람다, 스트림 학습목표 및 개념정리 # 애너테이션 (Annotation).reduce((a,b) -> a + b) 1+2 = 3+3 = 6+4 = 10+5 = 15 // 계산이 끝나면 위로 올라가서 .map(element -> element * 2) 15*2 = 30 // 초기값

theflower01.tistory.com

 

↓ 코트스테이츠 부트캠프 관련 글 한번에 보기 ↓

 

'IT/코드스테이츠 부트캠프' 카테고리의 글 목록

Flower, Plant, Study

theflower01.tistory.com

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading