19044_4일차 자바의 입력,

자바의 입력

  • 프로그램 실행 도중 필요한 시점에 데이터를 입력받는 것.

  • 왜 필요할까?! => 변경되는 데이터를 소스프로그램 없이 외부에서 전달하기 위해 사용.

    (학점 구하기, 성별 구하기 등등…)

    1. byte 단위 입력

      • 숫자입력
      /*
      System.in.read();
      <hr />
      
      System.in : 표준입력 => 키보드 입력
      */
      int su = System.in.read() - 48;
      /*
      -48을 하지 않으면?
      int su =  System.in.read();
      키보드 입력     프로그램에서 받는 값
      0                   48
      1                   49
      5                   53
      
      이렇게 48이 더해져서 나온다...
      */
      • 문자입력
      /*
      (char)System.in.read();
      <hr />
      
      (char)를 앞에 붙여준다.
      키보드 입력     프로그램에서 받는 값
      a                   97
      b                   98
      A                   65
      9                   57
      
      자료형 = (기본자료형, 참조(클래스,사용자정의)자료형)
      (자료형)데이터
      <hr />
      
      캐스팅(casting) 연산자 : 형변환연산자!
      */
      int su = 300; double d = 3.14; 
      
      int su2 = 3.14; // 에러? => 발생
      su2 = (int)3.14; //3.14데이터를 int로 형변환 하겠음. 변환하고 나머지값을 버려버리겠다라고 명시하는 것.
      System.out.println(su2); // 3 나옴
      
      double d2 = 300; //에러? => 이상없음, 자동형변환 
      System.out.println(d2); // 300.0
      
      
      System.out.println(97); ==> 97 출력
      System.out.println( ( char ) 97 ); // 결과 a
      char ch = (char)System.in.read();
      */
      /*exception 에러 (unhandled, unreported)
      InputTest.java:9: error: unreported exception IOException; must be caught or declared to be thrown
      예외처리 해달랬는데 안했어, 방법은?
      */
      public static void main(String[] args) throws Exception
      //예외처리 하기
      
      class InputTest 
      {
      public static void main(String[] args) throws Exception 
      {
          System.out.println( "프로그램 실행도중 입력테스트 !" );
          System.out.println( 97 );
          System.out.println( ( char ) 97 );
      
          System.out.print( "한자리 수를 입력 : " );
          int su = System.in.read() - 48; // 입력받는 시점
          // 다시 3을 입력받고 싶다면 애래처럼 13 과 10처리 하기
          /*
              System.in.read();
              System.in.read();
          */
          System.out.print( "동일한 수를 다시 입력 : " );
          int su2 = System.in.read();
          int su3 = System.in.read();
      
          System.out.println( "당신이 입력한 값은 su = " + su + "아스키 코드는" + su2 );
          System.out.println( "10 나오나? = " + su3 );
      
          System.out.println( "===end===" );
      }
      }
      //엥? 왜 아스키코드는 13이 나오지? 3 입력하고 엔터를 입력해서 엔터의 아스키코드는 13임.
      //키보드 : 3   엔터
      //컴퓨터 : 51 13(CR) 10(LF)
      /*
      문제) 아래와 같이 실행하는 프로그램을 작성하시오(for문 사용)
      [실행결과]
      
      <3단>
      3 * 1 = 3
      ...
      3 * 9 = 27
      */
      
      class GugudanTest 
      {
      public static void main(String[] args) 
      {
          System.out.println( "<3단>" );
          for(int i = 1; i < 10; i++)
          {
              System.out.println( " 3 * " + i + " = " + ( 3 * i ) );
          }
      }
      }
      //미션 구구단!
      class GugudanTest 
      {
      public static void main(String[] args) 
      {
          for(int dan = 3; dan < 6; dan++)
          {
              System.out.println( "<" + dan + "단>" );
      
              for(int i = 1; i < 10; i++)
              {
                  System.out.println(  dan + " X " + i + " = " + ( 3 * i ) );
              }
      
              System.out.println( "\t" );
          }
      }
      }
      
      class GugudanTest4 
      {
      public static void main(String[] args) throws Exception
      {
          System.out.print( "시작단을 입력하세요 : " );
          int start = System.in.read() - 48;
          System.in.read();
          System.in.read();
          System.out.print( "끝단을 입력하세요 : " );
          int end = System.in.read() - 48;
          end++;
      
          for(int dan = start; dan < end; dan++)
          {
              System.out.println( "<" + dan + "단>" );
      
              for(int i = 1; i < 10; i++)
              {
                  System.out.println(  dan + " X " + i + " = " + ( 3 * i ) );
              }
      
              System.out.println( "\t" );
          }
      }
      }
    2. 라인단위 입력

    - 객체생성
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    
    - 문자열 입력
    String str = in.readLine(); // a b c d 엔터 ---> "abcd"
                            // 1 2 3 4 엔터 ---> "1234"
    str + 300 ? 1534(X) , "1234300"(이렇게 나옴)
    
    - 숫자입력 ( 위에서 입력된 값에 대해 사칙연산을 하고 싶다! )
    "" 큰 따옴표를 제거하자 ( 많이 쓰는 기능 )
    Integer.parseInt( str ) ; // parseInt();는 숫자로 구성된 문자열을 숫자로 변환하는 기능을 갖는다.
    su + 300 ? 1534 (0) 
    Integer.parseInt( "123" ); // 결과값 123
    import java.lang.*; //기본패키지 =>> 컴파일러가 자동으로 추가시켜줌! *=  모든것, 와일드카드가 뭐야?
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
        // 사용하겠음, 사용하고자 하는 클래스의 소속( 폴더 , 패키지 )를 알려주는 역할
       //형식) import 패키지명.클래스명;
       // 근데 왜 String은 그냥씀? =>> 자주 쓰는 기능들은 임포트하기 넘나 귀찮, 자바 기본패키지에 모아둠
    
    class LineInputTest 
    {
    public static void main(String[] args) throws Exception
    {
        BufferedReader in = new BufferedReader( new InputStreamReader( System.in) );
    
        System.out.println( "숫자를 입력? " );
        String str = in.readLine(); // 입력시점
        System.out.println( "STR = " + str );
        System.out.println( str + 500 ); // 123500
    
    
        //숫자문자열 ---- 변환 ----> 숫자 "123" ----> 123 ( 큰따옴표 제거 ) : parseInt( 숫자문자열 )
        int su = Integer.parseInt( str ); // Integer.parseInt("123") ---> 123
        System.out.println( su + 500 ); // 123 + 500 =>> 623
    
    
    
        /*
            <자바 I/O의 4대 클래스>
                        ㅣ       읽기      ㅣ   쓰기
                =======================================
                byte단위  ㅣ   InputStream ㅣ   OutputStream
                문자단위    ㅣ   Reader      ㅣ   Write
    
                클래스 모아둔것 = 패키지 , 윈도우 폴더처럼 
        */
    
    }
    }
    import java.util.Calendar;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    
    class JuminBunhoTest 
    {
    public static void main(String[] args) throws Exception
    {
        //주민번호를 입력받아 화면에 나이를 출력하기!! (readLine()메소드사용)
        //"920306-1012345"
        // =>> 전체문자열에서 "92"만 추출하기 : String
    
        //나이계산하기?       92라는 숫자를 가져왓, 2019 - ( 1900 + 92 ) + 1
        //자바 날짜 관련된 클래스 : 대표적 2가지 Date, Calendar Date는 별로 잘 안씀
    
        Calendar cal = Calendar.getInstance(); //객체를 Instance, Object를 사용하는데 특정 클래스 하나를 표현할땐 Instance를 사용함
        //cal 변수안에 현 시스템의 모든 날짜관련정보가 저장됨.
        //cal.get( 얻고자 하는 세부정보);
        //java 사용 설명서 https://www.oracle.com/technetwork/java/api-141528.html
        //https://docs.oracle.com/javase/8/docs/api/
    
        int year = cal.get( Calendar.YEAR );
        System.out.println( "year = " + year );
    
        BufferedReader in = new BufferedReader( new InputStreamReader( System.in) );
        String id = in.readLine(); // "931025-2011111"
                            //인덱스     012345-
        String birthYear = id.substring( 0, 2 ); //"92"
    
        System.out.println(birthYear);
        int age = year - ( 1900 + Integer.parseInt( birthYear ) ) + 1;
    
        System.out.println( "당신의 나이는 " + age );
    }
    }
궁금상자
1. 왜 키보드 숫자 입력받을때 -48? 왜?... 2진코드 머시기 알아보자
    - 아스키코드때문, 아스키코드 공부 하기!
    https://commin.tistory.com/41

2. 키보드 숫자 입력 받을 때, int -48이지만 short byte도? 다를거 같은데

3. 자바의 유명한 에러 뭐가 있을까?!

4. 입력 read(); 와 Scanner 의 차이?!

5. 자바 와일드카드가 무엇?!

6. import 시 특정 클래스 기재 안하고 * 해버리면 안됨?

+ Recent posts