본문으로 바로가기

[Java]변수와 시스템 입출력

category Java 2022. 1. 23. 23:11
문장 구조 의미
// 출력문
System.out.println("출력 내용");

// 입력문
System.in.read();
  • System.out 은 시스템의 표준 출력 장치 → 모니터
  • System.in은 표준 입력 장치 → 키보드

System.out

  • 시스템의 표준 출력 장치(모니터)로 출력
  • System.out.println("출력 내용");

 

 

println() 메소드 / print() 메소드 / pringf 메소드

  • System.out.println(): 괄호안에 주어진 매개값을 모니터로 출력하고 행을 이동
  • System.out.printl(): 괄호안에 주어진 매개값을 모니터로 출력( 행을 이동 x)
  • System.out.printf(): 괄호안에 주어진 형식대로 출력

       - 개발자가 원하는 형식화된 물자열 (formal string) 출력

       - 전체자리수 및 소수자리수 제한

 

-%와 conversion 외에는 모두 생략 가능

-conversion 에는 제공되는 값의 타입에 따라 d(정수) , f (실수) , s(문자열)입력

 

출처 : printf() 와 지시자 (velog.io)

System.out.printf("이름:%s\n", "김자바");
System.out.printf("나이:%d\n", 27); // %d 의미 : decimal(10진수)즉 정수
System.out.printf("신장:%f\n", 186.5);
이름:김자바
나이:27
신장:186.500000

- flags : 빈자리를 채우는 방법

- 생략 시 왼쪽이 공백으로 채워짐, -가 오면 오른쪽이 공백으로 채워짐. 0은 공백 대신 0으로 채워짐.

 

* 자주 사용되는 형식 문자열

printf() 문법이 필요한 이유
  •   코드가 길어질수록 printf문이 더 보기 편하다
System.out.println("[이름:" + "김자바" + "], " + "[나이:" + 27 + "]"); // 알아보기 힘듦
System.out.printf("[이름:%s], [나이:%d]", "김자바",27); // 더 깔끔함
[이름:김자바], [나이:27]
[이름:김자바], [나이:27]

 

printf() 메소드 사용 예제 
int value = 123;
System.out.printf("상품의 가격: %d원\n", value);
System.out.printf("상품의 가격: %6d원\n", value);
System.out.printf("상품의 가격: %-6d원\n", value);
System.out.printf("상품의 가격: %06d원\n\n", value);

double area = 3.141592 * 10 * 10;
System.out.printf("반지름이 %d인 원의 넓이: %f\n", 10 , area);
System.out.printf("반지름이 %d인 원의 넓이: %010.2f\n", 10 , area);
System.out.printf("반지름이 %d인 원의 넓이: %03.2f\n", 10 , area);
상품의 가격: 123원
상품의 가격:    123원
상품의 가격: 123   원
상품의 가격: 000123원

반지름이 10인 원의 넓이: 314.159200
반지름이 10인 원의 넓이: 0000314.16
반지름이 10인 원의 넓이: 314.16

 

키보드에서 입력된 내용을 변수에 저장하기

 

System.in

  • 시스템의 표준 입력장치(키보드)에서 읽음
  • System.in.read();
  • 하나의 키에 대해서만 읽고 여러키가 조합된 한글이나 전체 문자열은 읽을 수 없음

키코드

  • 키보드에서 키를 입력할 때 프로그램에서 숫자로 된 키코드를 읽음
  • System.in.read() 를 이용하여 입력된 내용을 저장
  • 얻은 키코드는 대입 연산자 사용하여  int 변수에 저장

** 주요 Key Code Table 

 

 

** Key Code 활용한 예제 

public static void main(String[] args) throws IOException {
// 예외 처리 발생 -> Ch_10 에서 배울 예정

  int keyCode;
  keyCode = System.in.read();	
  System.out.println("KeyCode: "+ keyCode);

  keyCode = System.in.read();	
  System.out.println("KeyCode: "+ keyCode);

  keyCode = System.in.read();	
  System.out.println("KeyCode: "+ keyCode);
}
a
KeyCode: 97
KeyCode: 13
KeyCode: 10

- a의 키코드는 97

- 우리가 누른 Enter 키에 대한 키코드는 2개의 키코드를 받음

- 캐리지 리턴 ( CR : 13 ) 과 라인 피드 ( LF : 10 ) 로 구성된다.

 

Q Stop 예제

** 예제 1

boolean working = true;
int keyCode;
while(true) {
	try {
		keyCode = System.in.read();
		System.out.printf("keCode: %d\n",System.in.read());

		//if(keyCode == 113) //113 보다는 아래 q가 낫다
		if(keyCode == 'q' || keyCode == 'Q') {
		working = false;
		} 
	} 
    
    catch (IOException e) {
		e.printStackTrace();
	}
}

 

** 예제 2

while(true) {
	try {
		System.out.printf("keCode: %d\n",System.in.read());
//		break;					int형 숫자
	} catch (IOException e) {
		e.printStackTrace();
		}
	}

system.in.read()의 단점

  • 2개이상 키가 조합된 한글을 읽을수 없음
  • 키보드로 입력된 내용을 통문자열로 읽을 수 없음 

Scanner 로 해결

  • System.in.read()는 키코드를 하나씩 읽기 대문에 2개 이상의 키가 조합된 한글을 읽을 수 없으며 키보드로부터 입력된 내용을 통 문자열로 읽지 못하기 때문에 이러한 단점을 보완한 Scanner클래스 사용
  • 키보드로부터 입력된 내용을 통 문자열로 쉽게 읽을 수 있음
  • 한글 문자열 뿐만 아니라 엔터를 입력하기 전 전체 문자열을 매우 쉽게 읽을 수 있음

 

** 우선 다음 예제를 통해  Scanner 의 필요성에 대해 알아보자. 

 

 예제  - 여러 문자의 key code 출력하기

public static void main(String[] args) throws IOException {
				
// int keyCode; 
// keyCode = System.in.read(); 에러발생
// 한번만 사용할 경우 변수를 굳이 선언해주지않고 print문 안에서 해도됨 
		
  try {
    System.out.printf("keCode: %d\n",System.in.read());
    System.out.printf("keCode: %d\n",System.in.read());
    System.out.printf("keCode: %d\n",System.in.read());
    System.out.printf("keCode: %d\n",System.in.read());
    System.out.printf("keCode: %d\n",System.in.read());
          //				int형 숫자
 	} catch (IOException e) {
      e.printStackTrace();
  	}
}

 

abcde
keCode: 97
keCode: 98
keCode: 99
keCode: 100
keCode: 101

 

- 문자를 6개 이상 입력해도 5개의 key code만 알려준다. -> 결론 : printf 문장수 만큼만 읽어준다

- 더 더 많이 입력받고싶다면?? 

- 해결법 1 : while문 이용하기 -> but 이 방법도 불편함 

- 해결법 2 : Scanner 이용하기 

 

Scanner 를 사용한 예제

 

예제 1 - 문자열 입력 받기

Scanner scan = new Scanner(System.in);
scan.hasNextLine();
String inputData;
        
while(true) {
  inputData = scan.nextLine(); 
  System.out.println("입력된 문자열:" + inputData);
  if(inputData.equals("q")) {
  	break;
  }		
} System.out.println("종료");
떡볶이
입력된 문자열:떡볶이

 

 예제 2 - 메뉴 주문

// 메뉴 고르기
Scanner scn = new Scanner(System.in);
String str = "";

while(true) {
  System.out.println("♥___________♥");
  System.out.println("   메    뉴  ");
  System.out.println("♥___________♥");
  
  str = scn.nextLine();
  System.out.printf("입력하신 메뉴는 \"%s\"입니다.\n",str);
 
  if(str.equalsIgnoreCase("q")) {
  	System.out.println("종료");
 	break;
	} 
}
♥________________♥
     메     뉴               
♥________________♥
1
입력하신 메뉴는 "1"입니다.
♥________________♥
     메     뉴               
♥________________♥
q
입력하신 메뉴는 "q"입니다.
종료

 


코딩 공부하는 블로그
블로그 이미지 서하현 님의 블로그
VISITOR 오늘 / 전체