Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

햄발

Java 표준 입출력 본문

Java

Java 표준 입출력

햄발자 2024. 5. 23. 17:15

 

 

표준 입출력

 

자바에서 표준 입출력(Standard Input/Output) 은 프로그램과 사용자 간의 기본적인 데이터 교환 방법을 제공한다.

 

 

System.in

 System.in 은 자바 프로그램의 표준 입력 스트림이다. 기본적으로 이 스트림은 키보드 입력을 받는다.

이는 InputStream 객체로, 바이트 기반의 낮은 수준의 입력 기능을 제공한다. 일반적으로, 사용자로부터 텍스트를 읽기 위해 Scanner 클래스나 BufferedReader 와 같은 더 높은 수준의 래퍼(wrapper)를 사용하여 쉽게 데이터를 처리할 수 있다.

 

System.out

System.out 은 자바 프로그램의 표준 출력 스트림으로, 텍스트 데이터를 콘솔에 출력한다.

이 스트림은 PrintStream 객체로, println() , print() , printf() 등의 메소드를 제공하여 다양한 형식으로 데이터를 콘솔에 출력할 수 있다.

 

System.err

System.err PrintStream 객체로, 주로 에러 메시지나 중요한 경고 메시지를 콘솔에 출력할 때 사용된다.

System.out 과 기능적으로 동일하지만, 일반 출력과 에러 출력을 구분하여 사용자에게 보여주는 데 도움을 준다.

 

 

코드예시

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("Enter your name: ");
        String name = scanner.nextLine();

        System.out.println("Hello, " + name + "!");

        System.err.println("This is an error message!");
    }
}

 

 

코드예시

package io;

import java.io.IOException;

public class MySystemIn {

	public static void main(String[] args) {
		
		// 키보드에서 데이터를 응용 프로그램 안으로 넣기 
		System.out.println("알파벳 하나를 쓰고 Enter를 누르세요");
		// 바이트 동작 --> 0과1로 구성 
		// 정수 -> byte, short, int, long
		
		int i; 
		// 한 바이트씩 키보드에 값을 읽어라 
		
		try {
			i = System.in.read();
			System.out.println("----------------");
			
			// 출력 
			System.out.println("i : " + i);
			
			// 문자로 변환하고 싶다면 --> 컴퓨터 안에 있는 문자표를 활용(인코딩) 
			System.out.println( (char) i);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
		

	} // end of main 

}

 

 

 


 

 

바이트 기반 스트림

InputStream / OutputStream : 이 클래스들은 데이터를 바이트 단위로 읽고 쓰는 기본적인 기능을 제공합니다.

 

 

 

코드예시

한 바이트 씩 여러 글자를 받을 수 있도록 기능 확장 (while)
package io;

import java.io.IOException;

public class MySystemIn2 {

	public static void main(String[] args) {
		
		// 키보드에서 데이터를 응용 프로그램 안으로 넣기 
		System.out.println("알파벳 하나를 쓰고 Enter를 누르세요");
		// 바이트 동작 --> 0과1로 구성 
		// 정수 -> byte, short, int, long
		
		int i; 
		// 한 바이트씩 키보드에 값을 읽어라 
		
		try {
			//          97    !=     13 --> true
			while( ( i = System.in.read() ) != '\n' ) {
				System.out.println(" i : " + i);
				System.out.println(" (char)i : " + (char)i);
			}
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
		

	} // end of main 

}

 

 

중요 

버퍼를 사용하는 것은 입출력 작업에서 매우 중요한 역할을 하며, 그 원리를 이해하는 것은 데이터 처리의 효율성을 높이는 데 큰 도움이 됩니다. 버퍼의 사용 원리는 기본적으로 '일괄 처리' 또는 '집단 처리' 방식에 비유할 수 있습니다.

 

버퍼의 기본 원리

버퍼는 임시 저장 공간을 말하며, 데이터를 최종 목적지(파일, 네트워크, 디스플레이 등)에 쓰기 전에 일시적으로 데이터를 모아 두는 역할을 합니다.

 

  • 효율성 증가  : 작은 데이터 조각들을 바로 전송하거나 저장하는 대신 큰 덩어리로 모아서 한 번에 처리합니다. 이 방식은 특히 입출력 연산이 자주 발생하는 상황에서 유용하며, 시스템의 입출력 호출 횟수를 줄여 전체적인 성능을 향상시킵니다.

 

  • 시스템 부하 감소  :  버퍼를 사용하면 데이터를 모아 두었다가 한 번에 처리하기 때문에 자원 사용을 더욱 효율적으로 관리할 수 있습니다. 이는 디스크 접근 횟수를 줄이거나 네트워크 트래픽을 최적화하는 데 도움을 줍니다.

 

  • 데이터 전송 속도 개선  :  데이터를 물리적 장치에 기록할 때, 장치의 처리 속도에 따라 기록 속도가 제한될 수 있습니다. 버퍼를 사용하면 데이터 전송 속도가 물리적 장치의 속도보다 빠르게 유지될 수 있으므로, 전체 데이터 전송 시간을 단축시킬 수 있습니다.

 

 

버퍼 사용의 단점

버퍼를 사용하는 것은 많은 이점이 있지만, 일부 단점도 있습니다. 예를 들어, 버퍼가 완전히 채워질 때까지 기다려야 하는 경우 실시간 처리에는 적합하지 않을 수 있습니다. 또한, 시스템이 예기치 않게 종료될 경우 버퍼에 저장된 데이터는 손실될 수 있습니다.

 

 

 

파일 Copy

package io.file.ch03;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileCopy {
	
	public static void main(String[] args) {
		
		// 스트림은 기본적으로 단방향 이다. 
		// 입력 스트림, 출력 스트림 두개가 필요 하다. 
		
		// 파일 경로 (복사할 대상) 
		String sourceFilePath = "C:\\Users\\GGG\\Documents\\Lightshot\\a.zip";
		// 목적지 파일 
		String destinationFilePath = "copy1.zip";
		
		// 소요시간 확인 
		long startTime = System.nanoTime();
		
		try (FileInputStream in = new FileInputStream(sourceFilePath);
				FileOutputStream out = new FileOutputStream(destinationFilePath)){
			int data;
			while( (data = in.read() ) != -1  ) {
				// 파일에 출력 
				out.write(data);
			}
			System.out.println("입력스트림--> 출력스트림 --> 입력-->출력 에 반복 완료");
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		long endTime = System.nanoTime();
		long duration = endTime - startTime;
		System.out.println("복사의 소요 시간은 : " + duration);
		
		// 소요 시간을 추 단위로 변환 --> 포맷팅 
		double seconds =  duration / 1_000_000_000.0;
		// String 클래스에 format 메서드 사용해보기 
		String resultFormat = String.format("소요 시간은 : %.6f초 입니다.", seconds);
		// % 는 포맷 지정자의 시작 
		// f 지정자는 float, double 유형의 변수를 인자로 받아 처리 하겠다 
		System.out.println(resultFormat);
		
	}
}

 

'Java' 카테고리의 다른 글

Map 인터페이스  (0) 2024.05.30
Set 인터페이스  (0) 2024.05.29
Java I/O  (0) 2024.05.23
Inner class  (0) 2024.05.23
LinkedList  (0) 2024.05.22