본문 바로가기
Language/JAVA

JAVA 13일차 - 람다, 스트림

by 코젼 2022. 7. 6.
728x90
반응형

2022-07-06(13일차)


💡 람다(Lambda)

💬 람다식의 형식
◾ ( 인수목록 ) -> { 본체 }

💬 원론적인 람다식
◾ ( int i ) -> { System.out.println(i+1); }

💬 예시
// 정수형 인수 i를 받아 이 값에 1 더한 값을 리턴한다.
(int i) -> {return i+1;}

// 다음 함수와 같다.
int addone(int i) {
	return i+1;
}

// 인수가 두 개일 때
(a, b) -> a > b ? a : b

// 인수가 없을 때
() -> System.currentTimeMillis()​

 

💬 람다식 활용, 스레드 생성문을 단 한줄로 줄일 수 있다.
new Thread() -> System.out.print("스레드가 출력한 문장")).start();​

 💡 추상화
💬 클래스
◾ 다중 상속하기 위해 abstract화 한다.
◾ interface가 다중 상속을 할 수 있다.
💬 메소드
◾ 오버라이딩 할 수 있다.
💬 변수
◾ 인스턴스화가 안된다. (상수와 비슷하다.)

💡 외부 변수 액세스
◾ 로컬 클래스는 소속 메서드의 지역변수를 액세스할 수 있다.
◾ 람다식도 마찬가지이다.
◾ 람다식에서의 this는 람다식을 실행한 객체를 의미한다.
◾ ⭐ @FunctionalInterface 애노테이션을 붙이면 하나의 메서드만 허용한다.

📃 람다식을 사용해보자

💻 Console


📝 LambdaTest 클래스

package stream;

import java.io.*;

public class KeyboardStream {
	static String fname;

	public static void main(String[] args) {
		int idata = -1;
		// InputStreamReader : InputStream을 Reader로 변환시킨다.
		// Reader : 문자 단위로 입력을 수행한다, 추상 클래스이기 때문에 하위 클래스를 사용해서 구현해야 한다.
		Reader isr = new InputStreamReader(System.in); // 출력시 in -> out 변경
		System.out.println("키보드에서 문자입력[마지막에 엔터]");
		System.out.println("------------------------");

		try {
			while (true) {
				// 한 문자만 입력할 수 있게 하는 read 메서드
				idata = isr.read();
				if (idata == -1)
					break;
				System.out.print((char) idata);
			}
		} catch (IOException e) {
			System.out.println(e.toString());
		}
	}
}

💡 스트림(Stream)

💬 스트림?
◾ 입출력 장치, 메모리, 네트워크 등의 데이터 발생지나 목적지로 일련의 데이터가 들어오거나 나가는 처리를 정의해둔 것이다.
◾ 스트림에 연결하여 다른 처리를 해 주는 필터

💬 버퍼
◾ 임시기억장치 - KeyBoard Buffer, Monitor Buffer
◾ 기억장치 - Register, CPU (용량 부족)
◾ 보조기억장치 - USB, Hard Disk, 플로피디스크 (용량 부족 해결)

📃 스트림을 사용해보자

📝 BufferIOStream 클래스

package stream;

import java.io.*;

class BufferIOStream {
	// 예외 처리할 때, throws 사용
	// try-catch문과의 차이점 : 특정 부분만 예외 처리를 하는게 아니라 클래스 단위로 예외 처리를 할 수 있어 throws가 try-catch문보다 강력하다.
	public static void main(String[] args) throws IOException{
		System.out.println("문자를 입력하고 [엔터] 치세요");
		InputStreamReader isr = new InputStreamReader(System.in);
		
		// 버퍼 입출력 스트림 사용
		BufferedReader br = new BufferedReader(isr); // isr 객체를 매개변수로 사용
		System.out.print("입력한 문자 : ");
		String str = br.readLine(); // 한 줄 읽는다.
		System.out.print(str);
		System.out.println();
		
		System.out.println("출력 스트림 : ");
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		bw.write("버퍼 스트림 출력 : ");
		// 메모리를 비워준다. - java에서는 JVM이 있기 때문에 꼭 사용할 필요 없다.
		bw.flush();
	}
}

💡 입출력 스트림과 관련된 필터 스트림

스트림 관련된 리더/라이터
입력 InputStream InputStreamReader
FileInputStream FileReader
FilterInputStream FilterReader
BufferedInputStream BufferedReader
DataInputStream  
출력 OutputStream OutputStreamReader
FileOutputStream FileWriter
FilterOutputStream FilterWriter
BufferedOutputStream BufferedWriter
DataOutputStream  
PrintStream PrintWriter

💡 입력 바이트 스트림

클래스 서브클래스 기능 설명
ByteArrayInputStream   바이트 배열로부터 데이터를 읽어 들일 때 사용
FileInputStream   파일을 읽어 들일 때 사용
FilterInputStream   줄의 수 모니터링, 버퍼링, 원시데이터의 입력 등의 기능. 다음의 서브 클래스 제공
  BufferInputStream 버퍼링을 사용하여 입력에 사용
CheckedInputStream 데이터의 신뢰성을 향상시키기 위하여 읽혀지는 데이터의 체크섬을 사용
DataInputStream 기본 데이터 형식으로 데이터를 읽어들일때 사용
LineNumberInputStream 입력 라인의 수를 세는데 사용
PushbackInputStream 바이트를 읽고 여러개의 바이트로 구성된 병합 형태를 형성하며, 한 개의 문자를 스트림으로 밀어넣는 기능에 사용
ObjectInputStream   프로그램에서 주로 활용하며, 객체 형태의 데이터를 읽을 때 사용
PipedInputStream   PipedOutputStream으로부터 읽기를 지원하는 기능
SequenceInputStream   단일 스트림으로 FileInputStream을 연결할 때 사용
StringBufferInputStream   문자열을 버퍼링을 사용하여 입출력에 사용

💡 InputStream 클래스가 제공하는 대표적인 메소드

메소드 설명
abstract int read() 입력 스트림으로부터 1 바이트(한 문자)를 읽고, 읽은 문자를 int 형으로 반환한다. 스트림의 끝일 경우에는 -1을 반환한다. 읽어들인 데이터를 문자로 사용할 경우에는 데이터를 char형으로 캐스팅해 주어야 한다.
int read(byte[] b) 입력 스트림으로부터 바이트 배열 b의 크기만큼 읽어온다.
int read(byte[] b, int off, int len) 입력 스트림으로부터 시작위치인 off부터 len의 길이만큼 읽어서 바이트 배열 b의 크기만큼 입력한다.
int read(char[] cbuf) 입력 스트림으로부터 char 배열 cbuf의 크기만큼 읽어온다.
int available() 현재의 입력 스트림으로부터 지연되지 않고 읽어 들일 수 있는 바이트의 수를 반환한다.
void close() 해당 입력 스트림을 닫는다.
long skip(long n) 입력 스트림으로부터 읽어들인 데이터를 n 바이트 크기만큼 건너뛰게 된다.
void mark(int readlimit) 입력 스트림의 현재 위치를 표시한다. 후에 reset() 메소드를 사용하여 이 위치를 찾을수 있도록 해준다.
boolean markSupported() 입력 스트림이 표시(mark) 작업을 지원하면 true, 지원하지 않으면 false를 반환한다.
void reset() mark() 메소드의 마지막 호출이 지정한 위치로 입력 스트림의 위치를 다시 위치시킨다.

💡 OutputStream 클래스가 제공하는 대표적인 메소드

메소드 설명
abstract void write(int b) 출력 스트림에 1 바이트(한 문자)를 출력한다. int형의 정수를 인수로 받지만 byte로 자동 캐스팅된 후에 출력된다.
void write(byte[] b) 출력 스트림에 바이트 배열 b의 크기만큼 출력한다.
void write(byte[] b, int off, int len) 시작위치인 off부터 len의 길이만큼, 출력 스트림에 바이트 배열 b의 크기만큼 출력한다.
void write(char[] cbuf) 출력 스트림에 char 배열 cbuf의 크기만큼 출력한다.
void close() 출력 스트림을 닫는다.
void flush() 버퍼에 남아있는 데이터를 출력 스트림에 출력한다. 보통 출력 스트림에 들어있는 데이터는 어느 정도 내부 버퍼에 데이터가 쌓일 때까지 기다렸다가 출력하는것을 flush() 메소드를 써서 바로 출력한다.

💡 Reader 클래스가 제공하는 메소드

메소드 설명
int read() 하나의 문자를 읽어서 int 형으로 반환한다.
int read(char[] cbuf) 입력 스트림으로부터 char 배열 cbuf의 크기만큼 읽어온다.
abstract int read(char[] cbuf, int off, int len) 입력 스트림으로부터 시작위치인 off부터 len의 길이만큼 읽어서 char 배열 cbuf의 크기만큼 읽어온다.
int read(CharBuffer target) 입력 스트림으로부터 문자 버퍼인 target으로 문자들을 읽어온다.
boolean ready() 입력 스트림으로부터 읽을 준비가 되었으면 true, 그렇지 않으면 false를 반환한다.
abstract void close() 입력 스트림을 닫는다.
void mark(int readlimit) 입력 스트림의 현재 위치를 표시한다. 후에 reset() 메소드를 사용하여 이 위치를 찾을수 있도록 해준다.
boolean markSupported() 입력 스트림이 표시(mark) 작업을 지원하면 true, 지원하지 않으면 false를 반환한다.
void reset() mark() 메소드의 마지막 호출이 지정한 위치로 입력 스트림의 위치를 다시 위치시킨다.
long skip(long n) 입력 스트림으로부터 n 크기만큼의 문자를 읽어서 건너뛴다.

 


💡 Writer 클래스가 제공하는 메소드

메소드 설명
void write(String str) 문자열 str을 출력 스트림에 출력한다.
void write(String str, int off, int len) 시작위치인 off부터 len의 길이만큼, 문자열 str을 출력 스트림에 출력한다.
abstract void close() 출력 스트림을 닫는다.
abstract void flush() 출력 스트림을 비운다. 버퍼에 남아있는 데이터를 출력 스트림으로 전송한다.

 

728x90
반응형

댓글