본문 바로가기

국비 2019.03.11/3월

03.18 수업정리

콘솔 입력)

- 출력과 마찬가지로 버퍼를 사용한다.

- 입력은 키보드에서 받아지고 버퍼에서 입력을 읽어오기 때문에 버퍼를 먼저 만든다(System.in)

-> 이미 만들어져 있는 in(입력버퍼)에 있는 값을 읽기 위해서는 int code = System.in.read()를 사용한다. 

-> read(), skip()의 기능이 존재한다. 

-> 읽어있는 것은 무조건 1바이트밖에 안읽고 정수형으로 반환한다.

    3바이트의 경우면 3번 읽어야 하는 상황임. (단점) - 이것을 보완할 응용객체?가 존재한다


-> 정수형 숫자를 입력할 때: ex) int x = System.in.read() - '0';

-> 문자형을 입력할 때 ex) char x = (char)System.in.read();

* Scanner s= new Scanner(System.in);

  char x = s.next().charAt(0); 

  By using the charAt function you are able to get the value of the first char without using external casting.


-> 연속해서 두번 또는 그 이상의 문자를 입력받을 때는 skip을 써서 버퍼에 쌓인 개행 문자를 버린다

->

ex)

public static void main(String[] args) throws IOException {

// TODO Auto-generated method stub

System.out.println("kor: "); 

int a = System.in.read(); //1. 50 입력 - read()가 바이트 값 하나만 읽어서 5만 읽힌다.

//read떄 prompt가 뜬 이유는 in에 아무것도 없었기 때문이다. 2. a는 5의 dec값인 53이 들어간다

System.out.println(a); //아스키값 5에 해당되는 53이 println에 맞춰 문자열 형식으로  5/3으로 출력된다. 

System.out.write(a); //53의 아스키 문자인 5를 출력 

System.out.flush();

System.out.println();

a = System.in.read(); //읽히지 않은 0에대한 바이트 값인 48이 a에 저장된다.

System.out.println(a); // 문자열 4 8이 출력된다.

System.out.write(a); // 48의 아스키 코드인 0 이 출력된다. 

System.out.flush();

System.out.println();

a = System.in.read(); //엔터키 값의 13이 a에 들어간다

System.out.println(a); //문자열 13이 출력된다

System.out.write(a); // 출력될 것이 안보이니 아무것도 안출력된것처럼 보인다. 

System.out.flush();

}


- 화이트 스페이스/캐릭터: 출력되었지만 보이지 않는 문자

 ex)엔터 구분자: space, enter 등 


- 문자열 5 0으로 읽어온 것을 53, 48 거기서 다시 숫자 50으로 바꾸는 것은 번거롭기 때문에 응용장치를 사용한다. 

-> Scanner사용: Scanner scan = new Scanner(System.in); -> system.in으로 입력한 값을 바이트 단위로 읽는다. 

-> scan이라는 변수를 Scanner타입으로 선언한다.

import java.util.Scanner; 


-> nextInt()는 next의 기술로 구분자 까지 읽어온 후 integer로 바꿔준다 : 5 0 을 50으로 바꾸고 싶을때 사용

이 때 앞의 변수도 int로 선언해준다. 

ex)

System.out.println("kor: ");

int a = scan.nextInt();

System.out.printf("%d", a);


이때 printf쪽에 정수로 읽을 수 없는 수가 들어가면 에러가 뜨면서 무한루프를 돌 수 있다.


-> 20 30 40 을 입력할 때 printf문을 한번만 쓰면 하나의 숫자만 출력되서 뒤에 두 번 더 nextInt() 작성해주면 나머지 수들이 출력된다.  두 번 prompt가 뜨는 것. 

첫 번째 읽을 때는 20 + 스페이스 구분자 같이 읽어진다. 그런식으로 다음 것들도 구분자도 같이 인식해서 읽어버림... 


-> ex)


// TODO Auto-generated method stub

Scanner scan = new Scanner(System.in); 

Scanner scan1 = new Scanner(System.in);

System.out.println("kor: ");

int a = scan.nextInt();

System.out.printf("%d", a);

System.out.println("문자열을 입력하세요 ");

String aa = scan1.nextLine();

System.out.println(aa);

-> scanner를 두번 선언한 이유는 in이라는 버퍼안에 이미 a의 문자가 들어있어서 문자열을 따로 선언 하려면 scan1을 만들어서 그안에 넣어주는 것이 나음


-> 

int i = scan.nextInt(); // (1)

String s = scan.nextLine(); // (2)

 

변수 s에 사용자가 입력할 한 줄을 모두 저장할려고 하는데, 실제로 Run시켜보면 입력부는 건너 띄고 그 다음줄이 실행되는 현상을 볼수 있습니다. 일단 왜 그런거냐면 사용자가 int i에 입력할 정수를 입력한 뒤 Enter를 누르면 \r\n이라는 개행문자가 남아있게 되는데, 이걸 nextLine()이 읽어들여서 그렇습니다. 실제로 Run시킨 결과를 자세히 보시면 개행이 한번 실행되는걸 볼수 있습니다...

 

해결책으로는 여러가지가 있겠는데,

 

1) (1)과 (2)에 사용될 Scanner을 따로 만든다

 

Scanner scan1 = new Scanner(System.in);

Scanner scan2 = new Scanner(System.in);

 

이렇게 두개를 선언해서 각각 사용해 주면 됩니다.

 

2) (1)과 (2) 사이에,

scan.skip("[\\r\\n]+");

이렇게 집어넣어서 개행문자들을 skip시켜주는 방법도 있습니다.

 

3) 가장 추천하는 방법인데, (1)과 (2)사이에 scan.nextLine();을 넣어서 개행문자들을 미리 읽어버리는 방법입니다.


- 산술 연산자)

-> 10/3.0의 경우 : 묵시적형변환 - int가 double로 형변환된다. 3.3333.....


- int 변수 초기화 0과 null: 

             null -> 변수를 선언하고, 'null'이라는 빈 값을 할당한 경우이다.

(이 '빈 값'의 경우 자료형에 따라 여러가지가 있지만,

null은 객체형 데이터-ex: array, object-의 빈 값을 의미한다.

문자열(string)의 경우 '',

숫자(number)의 경우 0이 빈값이고,

이들 빈값 모두는 if문에서 false로 형 변환된다.)

오류를 방지하기 위해서는 반드시 변수를 선언할 때 명시적으로 초기화를 시켜주는 습관을 들여야 합니다. C/C++ 에서는 static 변수에 대해서는 0으로 자동으로 초기화하지만, 자동 변수(automatic variable)에 대해서는 자동으로 초기화시키지 않습니다. Java의 경우 초기화를 시켜주지 않아도 자동으로 해당 타입의 기본값으로 초기화됩니다. boolean 형은 false로, 정수형 타입은 0으로, 레퍼런스형에는 null로 초기화 됩니다.

- 문자 하나 입력 받는 것: ex) sc.next().charAt(0);

* nextLine()은 한 줄을 다 읽어온다. 개행문자도 한 줄로 인식한다

 *next()는 개행문자, 공백은 무시하고 문자를 입력받는다. 


Scanner 클래스의 메소드

Scanner 클래스의 메소드는 다양하지만 입력받을 수 있는 몇 가지만 소개하면 다음과 같다. 각 타입별로 입력받을 수 있다.

주의) 사용한 메소드의 타입에 맞게 입력하지 않으면 에러가 발생한다.


메소드

설명 

 String next()

 입력받은 값을 문자열 타입으로 반환한다.

 byte nextByte()

 입력받은 값을 byte 타입으로 반환한다. 

 short nextShort()

 입력받은 값을 short 타입으로 반환한다. 

 int nextInt()

 입력받은 값을 int 타입으로 반환한다. 

 long nextLong()

 입력받은 값을 long 타입으로 반환한다. 

 float nextFloat()

 입력받은 값을 float 타입으로 반환한다.

 doulbe nextDouble()

 입력받은 값을 double 타입으로 반환한다.

 String nextLine()

 입력받은 라인 전체를 문자열 타입으로 반환한다. ('\n'포함)



문자열은 String 타입에 저장하여 사용하면 되고 입력한 문자열을 숫자로 변환할 때는 다음과 같은 메소드를 사용하면 된다.

String input = scanner.nextLine();

int num = Interger.parseInt(input); // input에 저장된 숫자형식 문자열을 정수로 변환


- / 은 몫 , %은 나머지 

- 증가 ++, 감소--, 부정 연산자!(!sucess = !가 붙으면 갖고있는 값의 반대값이 출력된다)

- 비교/ 관계 연산자: && 교집합 연산자(모두 true인 경우), || 합집합 연산자(하나만 true인 경우)

 ex) -2<x<=2   -> -2<x && x<=2 (and는 x를 안으로 모아주고) 

 ex) x<=2 || 3<=x (or는 x를 밖으로 써주면 보기 편함)

* ~보다 작거나 ~보다 크다 등 다른 범위를 써주면 ||


- 제어구조: 선택문, 반복문(*), 분기문

-> 제어변수, 상태변수

-> while(true) 무한반복 ->true는 상수라 거짓이 될 수 없기 때문

-> 강제종료: ctrl + z


- kor = scan.nextInt();

System.out.println(kor<100); 에서 100보다 작은 수를 넣으면 true가 출력된다. 


- 1. if(kor<0 || kor>100)

  2. if(!(kor>=0 && kor<=100)){ 

System.out.println("점수는 0~100까지의 범위만 입력이 가능합니다. 다시입력");

System.out.println("국어 1:");

kor = scan.nextInt();

}

'국비 2019.03.11 > 3월' 카테고리의 다른 글

03.15 과제  (0) 2019.03.15
03.15 수업정리  (0) 2019.03.15
03.14 과제  (0) 2019.03.14
03.14 수업정리  (0) 2019.03.14
03.13 과제 정리  (0) 2019.03.13