[혼공자] 02-4. 변수와 시스템 입출력

Benjamin·2023년 2월 16일
0

혼공자

목록 보기
7/27

02-4. 변수와 시스템 입출력

일반적으로 표준 출력 장치는 모니터이고, 표준 입력 장치는 키보드이다.

System.out은 시스템의 표준 출력 장치를 말한다.
표준 입력 장치는 다음과 같이 in을 사용한다
System.in.read();

모니터로 변수값 출력하기

우리는 지금까지 표준 출력장치인 모니터로 출력하기위해 System.out의 print()메소드를 사용했다.
괄호안에 리터럴을 넣으면 리터럴이 그대로 출력되고, 변수를 넣으면 변수에 저장된 값이 출력됐다.

println()에서 ln은 line의 줄임말로 행을 바꾸라는 의미이다.

다음은 출력장치 out이 제공하는 메소드이다.

메소드의미
println(내용);괄호 안의 내용을 출력하고 행을 바꿔라
print(내용);괄호 안의 내용을 출력만 해라
printf("형식문자열", 값1, 값2, ...);괄호 안의 첫 번째 문자열 형식대로 내용을 출력하라

printf()메소드는 개발자가 원하는 형식화된 문자열(format string)을 출력할 수 있다.
예를들어, 전체 출력 자릿수와 소수 자릿수를 제한할 수 있다.

printf() 괄호에는 출력형식 문자열과 제공될 값을 쉼표로 구분해 나열해주면 된다.

형식문자열에서 %와 conversion(변환문자)은 필수!
그 외 항목은 모두 생략 가능하다.

  • % = 형식 문자열의 시작을 의미
  • conversion = 제공되는 값의 타입에 따라 d(정수) f(실수) s(문자열)을 입력.

System.out.printf("이름 : %s", "감자"); // 이름 : 감자

형식 문자열에 포함될 값이 2개 이상일 경우에는 값의 순번(argument_index$)를 알려주어야한다.
예를들어, 1$는 첫번째 값, 2$는 두번째 값을 뜻한다.

System.out.printf("이름 : %1$s, 나이 : %2$d", "감자", 25); // 이름 : 감자, 나이 : 25

flags는 빈자리를 채우는 방법인데, 생략되면 왼쪽이 공백으로 채워지고, -가 오면 오른쪽이 공백으로 채워진다. 0은 공백 대신 0으로 채운다.

width는 전체자릿수(소수점(.)도 포함)이며, .precision은 소수 자릿수이다.

자주사용되는것들의 예시를 보자.

[정수]

  • %6d : 6자리 정수, 왼쪽 빈자리 공백 ; _ _ _123
  • %-6d : 6자리 정수, 오른쪽 빈자리 공백 ; 123_ _ _
  • %06d : 6자리 정수, 왼쪽 빈자리 0으로 채움 ; 000123

[실수]

  • %10.2f : 소수점 이상 7자리, 소수점 이하 2자리, 왼쪽 빈자리 공백 : _ _ _ _123.45

[문자열]

  • %s : 문자열 : abc
  • %6s : 6자리 문자열, 왼쪽 빈자리 공백 : ___abc

주의할 점!
아래와같이 왼쪽을 0으로 채우는 플래그는 문자열을 출력할 때 사용할 수 없다.

String a = "abc";
//System.out.printf("%06s", a);

[특수문자]

  • \t : 탭
  • \n : 줄바꿈
  • %% : % 출력

❓ 의문점

%%는 언제사용하는거지???

Double area = 314.159;
System.out.printf("반지름이 %d인 원의 넓이 :%10.2f\n", 10, area); //반지름이 10인 원의 넓이 :    314.16

위 예시를 보면, 소수점아래 나타내야하는 자릿수가 있을경우, 그 하나 아래숫자에서 반올림해준다!

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

키보드에서 키 하나 입력하면 프로그램에서는 숫자로 된 키코드를 읽을 수 있다.
ex) 알파벳 a 입력하면 97번을 읽을 수 있다.

키코드를 읽기 위해서는 System.in의 read()를 이용한다.

int keyCode = System.in.read();

//System. : 시스템이 가지고있는
//in. : 입력 장치에서
//read(); : 입력된 키코드를 읽어라

주요 키에 대한 키코드들

-CR : Carriage Return (\r)
-LF : Line Feed (\n)
해당 용어(CR, LF)와 이 용어들의 조합(CRLF)은 새로운 줄 (New line) 으로 바꾸는 방식을 의미한다.
CR 과 LF 는 타자기 시절 부터 줄바꿈을 위해 사용하던 방식인데 각각의 의미는 다음과 같다.
-CR : 현재 커서를 줄 올림 없이 가장 앞으로 옮기는 동작
-LF : 커서는 그 자리에 그대로 둔 상황에서 종이만 한 줄 올려 줄을 바꾸는 동작
이 방식(CR + LF)은 타자기 이후 컴퓨터에서도 줄바꿈을 의미할 때도 사용되었으나, 줄바꿈을 할 때 굳이 2 byte 를 사용할 필요가 없기에 메모리/Storage 절약을 위해 CR 혹은 LF 만 사용하기도 하였다.
대표적으로 Microsoft 사의 Windows 는 CRLF (\r\n) 을 기본으로 사용하는 반면
Unix/Linux 에서는 LF (\n) 만으로 줄바꿈을 하고 있다.
(Mac 의 초기 버전, 9 버전 이하는 CR (\r) 을 줄바꿈으로 사용)

public class keyCode {

	public static void main(String[] args) throws Exception {
		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

위와같은 결과가 나올수도있다.

throws Exception

  • System.in.read()에 대한 예외 처리 코드이다.
  • 모니터에 예외 내용을 출력만 한다.

System.in.read()가 실행되면 이클립스의 Console뷰는 엔터키가 입력될 때까지 대기상태가 된다.
엔터키가 입력되면 System.in.read()는 입력된 키들에 대한 키코드를 하나씩 읽는다.

엔터키는 다른키와는 다르게 캐리지리턴(CR:13)과 라인피드(LF:10)로 구성된 2개의 키코드가 입력된다. 따라서 2번에 걸쳐서 System.in,read()로 읽어야한다.

다음 예제는 키의 개수와 상관없이 키코드를 모두 읽는다.
System.in.read()가 입력된 키코드들을 모두 읽고나면 다음 엔터키가 입력될때까지 다시 대기상태가 된다.

public class keyCode {
	public static void main(String[] args) throws Exception {
		int keyCode;
		while(true) {
        	keyCode = System.in.read();
        	System.out.println("실행 ");
            System.out.println("keyCode:" + keyCode);
        }
	}
}

아래는 결과이다.

사용자가 q를 입력했을때 반복이 중지되게 하려면,

if(keyCode == 113) {
	break;
}

while문안에 위 코드를 추가하면된다.

System.in.read()의 단점은 키코드를 하나씩 읽기 때문에 2개 이상의 키가 조합된 한글을 읽을 수 없다는 것이다.
그리고 키보드로부터 입력된 내용을 통 문자열로 읽지못한다.
이 단점을 보완하기위해 자바는 Scanner클래스를 제공하고있다.

Scanner scanner = new Scanner(System.in);

//Scanner scanner : Scanner 변수 선언 
//new Scanner(System.in); : 시스템 입력장치로부터 읽는 Scanner생성 

String inputData = scanner.nextLine();

// scanner.nextLine(); : Enter키 이전까지 입력된 문자열을 읽음 (언제든지 키보드에서 읽고싶을 때 이 메소드를 실행하면됨)

scanner.nextLine() : 엔터키가 입력되기 전까지 대기상태가 되며, 엔터키가 입력되면 입력된 모든 내용을 문자열로 읽음

import java.util.Scanner;
public class keyCode {

	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		String input;
		
		while(true) {
        	input = sc.nextLine();
        	System.out.println("문자열 : \"" + input + "\"");
        	if(input.equals("q")) {
        		break;
        	}
        }
		System.out.print("종");
	}
}

import java.util.Scanner; : import문이라고 하는데, Scanner가 java.util 패키지에 있다는것을 컴파일러에게 알려주는 역할
-> 이 코드가 없으면, Scanner를 찾을 수 없다는 컴파일 에러가 발생 (Scanner cannot be resolved to a type)

위 두 예제에서 q가 입력되었는지 검사하는 코드가 다름을 알 수 있다.
if(keyCode == 113) : System.in.read()로 읽었기 때문에 int타입의 키코드를 얻음
if(input.equals("q")) : sc.nextLine()으로 읽었기때문에 String타입의 문자열 얻음

자바는 기본타입(byte,short,int,long,float,double,boolean)의 값이 동일한지 비교할 때 '=='를 사용하고, 문자열이 동일한지 비교할 때 equals()메소드를 사용한다.

(저장된 문자열).equals("비교문자열") -> 같으면 true 다르면 false 반환

next() : 스페이스, 즉 공백전까지 입력받은 문자열 리턴
nextInt() : System.in으로 입력 받은 시스템 값 중 int값만 뽑아내 return 전까지 반환한다.
nextDouble() : System.in으로 입력 받은 시스템 값 중 double값만 뽑아내 return 전까지 반환한다.


출처
혼자 공부하는 자바

0개의 댓글