본문 바로가기

자바

2-2. 자바 기본 프로그래밍 (공부메모)

*자바에서 키 입력

 

자바에서 입력받는 방식은 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 객체 생성

 

Scanner scanner = new Scanner(System.in);

 

-import문 사용(Scanner 클래스를 사용하기 위해선 해당 문장이  프로그램의 맨 앞줄에 있어야함)

 

import java.util.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' 포함)를 문자열 타입으로 리턴한다. 

 

 

사용 예시

 

Scanner scanner = new Scanner(System.in);

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