*자바에서 키 입력
자바에서 입력받는 방식은 2가지
1. 표준 입력 스트림인 System.in 을 이용
2. JDK가 제공하는 Scanner 클래스를 이용
사용하기는 Scanner를 이용하는게 쉽지만, 말그대로 표준방식이므로 쓸 줄 알아야함.
*System.in
System.in은 저수준(low-level)의 입력 스트림 객체로 키보드 장치와 연결되어 있다.
System.in만으로도 키보드 장치로부터 입력을 받아 들일 수는 있으나 System.in이 입력받은 값을 바이트정보로 반환하기 때문에 이를 문자 정보로 변환하는 과정이 필요하다.
그래서 고수준(high-level)방법에 InputStreamReader 클래스를 이용하는 방법이 있는데, 이것은 System.in을 이용해 입력 키 입력을 받고, 이것을 문자 정보로 변환하여 리턴해준다.
사용 방법은 아래와 같이 InputStreamReader 객체를 생성하고, 입력을 받아들인다.
InputStreamReader rd = new InputStreamReader(System.in); //키보드 입력 스트림 생성
int c = rd.read( ); //키보드로부터 문자 하나 읽고 c변수에 저장
실습예제
import java.io.*; //InputStreamReader사용을 위한 임포트문 //import도 잘 모르고, *은 또 뭐야? //처음에 작성할 때 틀린 것처럼 나오는데 내용을 살펴보니 문법이 틀린게 아니고 사용이 안되었는데 쓰여 있다는 걸 알려주는 거였음 public class InputExample { public static void main(String arg[]) { //rd라는 인풋스트림리터 객체를 생성하는데 입력은 system.in으로 부터 받아온다 , 라는 뜻 같음 InputStreamReader rd = new InputStreamReader(System.in); try { while(true) { int a = rd.read(); if (a == -1) //ctrl+z가 입력되면 read()가 -1을 리턴한다고 한다. break; System.out.println((char)a); //입력된 문자를 출력 } } catch (IOException e) { System.out.println("입력 오류 발생"); } } } //궁금한 것들 //1. import와 * 의미 ? //2. a를 왜 굳이 int로 선언하지? 처음부터 char로 선언하는게 낫지 않나? //2번 check : int로 바꿔썼더니 오류메세지-> read()메소드가 반환형이 int니까 바꿔야 된데 //3. catch 메소드 인거 같은데, parameter가 내가 아는 C언어들과 다르다. //3번 추측 : catch라는 메소드가 여러개 있어서(overload)되어 있어서 parameter의 타입을 명시해서 메소드를 구분하려고 하는게 아닐까? 동시에 e의 선언도 하면서 말이야. //IOException이 뭔지? 클래스임 자바 메소드 오버로딩 지원은 하는지? ㅇㅇ 지원함
//궁금해하고 넘어가자 앞으로 공부하다보면 나오겠지.
실행 결과는 글씨쓰면 초록색으로 표시되고 엔터를 누르면 이것이 입력으로 전달되고 위 코드내용에 따라 한글자씩 출력함
*Scanner 클래스를 이용한 키입력
// 공부하다보니까 InputStreamReader가 Scanner로 바뀐건데? 얘도 System.in 이용하네? 그럼 이것도 표준입력인가?
-Scanner 객체 생성
-import문 사용(Scanner 클래스를 사용하기 위해선 해당 문장이 프로그램의 맨 앞줄에 있어야함)
import문의 대략적인 정체가 밝혀졌다!
import는 사용하려는 객체를 불러들이기 위해 해당 객체의 경로명을 명시해주는 것.
즉, Scanner라는 클래스가 java.util 패키지에 존재한다는 이야기!
더 자세한건 나중에 더 나올 듯.
-Scanner 클래스 특징
사용자가 입력하는 키 값을 공백('\t', '\f', '\r', ' ', '\n')으로 구분하여 아이템 단위로 읽는다.
ex) 사용자 입력 : "Kim Seoul 33 65.1" ---------------> Scanner 인식 : "Kim", "Seoul", "33" , "65.1" , 한 아이템씩 읽음
-Scanner 클래스의 메소드
메소드 |
설명 |
String next( ) |
다음 아이템을 문자열 타입으로 리턴한다 |
byte nextByte( ) |
" byte 타입으로 " |
short nextShort( ) |
" short 타입으로 " |
유사하므로 쭉 생략 |
" int 타입으로 " |
|
" long 타입으로 " |
|
" float 타입으로 " |
|
" double 타입으로 " |
String nextLine( ) |
한 라인 전체 ('\n' 포함)를 문자열 타입으로 리턴한다. |
사용 예시
String name = scanner.next();
int age = scanner.nextInt();
*연산자
연산의 종류 |
연산자 |
증감 |
++ -- |
산술 |
생략 |
시프트 |
>> << >>> //의미 모름 |
비교 |
생략 |
비트단위 논리 |
& | ^ ~ //비트단위 논리연산 // 기억하는게 맞다면 and or xor not 일 걸, not만 단항 연산자 |
논리 |
&& || ^ ! //피연산대상이 논리표현식(ex. 3>5 , 1==1 ..) |
조건 |
? : //삼항 연산자임 |
대입 |
= *= /= += -= &= |= ^= <<= >>= >>>= |
시프트는 처음 봤고 , 조건이랑 대입의 일부를 모름 // 대입은 비트단위 논리와 시프트 이해하니까 알겠음.
* 시프트
-형식
(바꿀 변수) (시프트연산자) (시프트할 비트수)
-예시 및 정의
a << 2 : a 를 2진수로 바꾼 다음 왼쪽으로 2bit 이동 (2bit 왼쪽이동은 사실상 4곱해준거나 다름 없음) //산술적 왼쪽 시프트
byte a = 5;
byte b = (byte) (a << 2); // b = 20
추가적으로 확인 해볼만 한 것
- byte의 메모리 크기를 1 값이 넘어가면 ex) 10100000(2) --> 1010000000(2) 일거 같긴한데 확인해보기
- 강제 타입 변환 없애면 b가 이진수 값으로도 출력이 될까?
a >>> 2 : a를 오른쪽으로 2bit 이동하고 왼쪽에 비는 값들은 0으로 채움 //논리적 오른쪽 시프트
byte a= 20;
byte b= (byte) (a>>>2); // b = 5
a >> 2 : a를 오른쪽으로 2bit 이동하고 , 왼쪽에 비는 값을 이전 최상위 비트 유지(시프트가 1bit씩 이뤄지는 걸로 생각해야 혼란이 없음)
// 산술적 오른쪽 시프트
byte a= 20;
byte b= (byte) (a>>2); // b = 5
byte c = (byte) 0xf8; 1bit 1bit
byte d = (byte) (c<<2) ; // 1111 1000(2) ------> 1111 1100(2) -----> 1111 1110(2) d = 0xfe
참고로 c = -8 ---> d = -2 된것으로 나누기 4한 결과가 되었다.
*조건 연산자(삼항 연산자 = tenary operator)
-형식
condition? opr1 : opr2 //condition이 true 이면 opr1 , false이면 opr2 선택
-예시
(a>b)? (a-b): (b-a) ; // 두 수의 차를 양수값으로 얻도록 하는 식임.
*연산자에는 우선순위 - 이건 생략하고 닥치고 ( )쓰는게 가독에도 좋고, 작성할 때도 안 헷갈림
if와 switch 문은 C언어랑 동일한 듯. 생략
'자바' 카테고리의 다른 글
3-3. main() 과 예외처리 (0) | 2018.06.03 |
---|---|
3-2. 배열 (0) | 2018.06.03 |
3-1. 반복문 (0) | 2018.06.02 |
2-1 자바 기본 프로그래밍 (공부 메모) (0) | 2018.05.28 |
1. 자바 시작 (공부 메모) (0) | 2018.05.27 |