콘솔에 입출력하기

TIL·2022년 12월 9일
0

Java (최은빈)

목록 보기
3/27

콘솔로 입력받기

package me.day02.input;

import java.util.Scanner;

// 입력 from 사용자 (아이디, 패스워드, 메시지의 텍스트, …), 출력 to 화면
// 입력은 입력을 위한 임시 저장 공간 메모리 (buffer)가 있음

public class InputExample {
    public static void main(String[] args) {

        // 콘솔로 입력받기 위한 객체 생성
        Scanner scanner = new Scanner(System.in);

        String name;
        int age;
        String gender;
        double height;
        char alphabet; // 문자 하나

        char cha = ' ';
        String str = "    "; // 공백, 느낌표, 엔터... 도 하나의 문자(아스키코드)

        // nextLine()
        // 엔터(\n) 들어오기 전까지의 모든 문자 가져옴  -> 글자의 한계 없이 들고올 수 있음 (코드랑 콘솔이랑 소켓 열어서 통신. 파일의 코드가 아무리 길어도 다 가져올 수 있듯이, 계속 for문 돌려 가져옴)
        System.out.print("이름 입력: ");
        name = scanner.nextLine(); // sally choi 에러 안나도록 (next는 스페이스 앞에 있는 것만 가져옴)

        // next()
        // .next() 로 sally choi 받으면 buffer에 choi 남아있으므로 .nextInt()로 choi 가져오려 해서 에러나는 것 (InputMismatchException - nextInt() 는 int 반환하므로 데이터 타입 안맞음)
        // System.out.print(scanner.next()); -> choi 출력

        // 정수 입력 받기
        System.out.print("나이 입력: ");
        age = scanner.nextInt(); // 내부 함수를 뜯어보면, 문자열로 입력 받아 parseInt() 시킨 것

        // 문자열 입력 받기
        System.out.print("성별 입력: ");
        gender = scanner.next();

        // 실수 입력 받기
        System.out.print("키 입력: ");
        height = scanner.nextDouble(); // parseDouble(next()) - 문자열로 입력 받아 실수로 파싱

        // nextInt(), nextDouble() 는 사실 잘 사용안됨
        // 정수, 문자, 불린 다 포함 할 수 있는 건 문자열 + 웹 상에서 전달되는 데이터는 거의 문자열 (비밀번호, 핀번호, ..)
        // 문자열 next() 로 받고 나중에 파싱시키는게 좋음 (int, double 로 변환)

        // 문자 하나 입력받기
        // 1. int 로 받아 형변환
        System.out.print("알파벳 입력: ");
        alphabet = (char) scanner.nextInt(); // 'a' 문자하나 아니라 "a" 문자열로 콘솔에 들어가서 int로 받으려니 InputMismatchException // 강제 형변환 해도 int 범위를 벗어나는 알파벳은 없으므로 그건 문제 안됨
        // 2. 문자열로 받아 인덱싱
        alphabet = scanner.next().charAt(0); // 일단 문자열로 받고 첫번째 인덱스 받기

        // 캐스팅
        char ch = 100; // 아스키코드 값이 100인 문자 하나 할당 (자동 캐스팅). 일부 책에서는 char를 문자로 구분하지 않고 그냥 정수로봄
//        ch = 100000000; // 바이트 크기가 달라서 컴파일 에러 (정수 4byte -> char 2byte = 16bit = 2^16)
        ch = (char) 100000000; // -> 강제 형변환 (데이터 손상)

        System.out.println("name = " + name);
        System.out.println("age = " + age);
        System.out.println("gender = " + gender);
        System.out.println("height = " + height);
        System.out.println("alphabet = " + alphabet);

        scanner.close();

        // nextByte(), nextShort(), nextLong(), nextBoolean()
    }
}

  1. scanner.next()
  • \t 전까지의 모든 문자(문자열) 가져옴

  1. scanner.nextLine()
  • 엔터(\n) 들어오기 전까지의 모든 문자 가져옴
  • 글자의 한계 없이 들고올 수 있음 (코드랑 콘솔이랑 소켓 열어서 통신. 파일의 코드가 아무리 길어도 다 가져올 수 있듯이, 계속 for문 돌려 가져옴)

  1. scanner.nextInt()
  • 내부 함수를 뜯어보면, 문자열로 입력 받아 parseInt() 시킨 것

  1. scanner.nextDouble()
  • parseDouble(next()) : 문자열로 입력 받아 실수로 파싱
  • nextInt(), nextDouble() 는 사실 잘 사용안됨
    • 정수, 문자, 불린 다 포함 할 수 있는 건 문자열 & 웹 상에서 전달되는 데이터는 거의 문자열 (비밀번호, 핀번호, ..) 이기 때문
    • 문자열 next() 로 받고 나중에 파싱시키는게 좋음 (int, double 로 변환)

  1. 문자 하나 입력받기
  • (char) scanner.nextInt() : int 로 받아 형변환
  • scanner.next().charAt(0) : 문자열로 받아 인덱싱
  • 자동 형변환
    • char ch = 100; : 아스키코드 값이 100인 문자 하나 할당
    • 일부 책에서는 char를 문자로 구분하지 않고 그냥 정수로봄

  1. nextByte(), nextShort(), nextLong(), nextBoolean()



콘솔에 출력하기

package me.day02.output;

public class OutputExample {
    public static void main(String[] args) {
        int month = 2;
        int day = 10;

        // souf : "문자열"을 포맷대로 출력해라
        // %d : decimal (10진수)
        System.out.printf("%d월 d일\n", month, day); // 2월 10일

        // month, day 출력할 때 최대 두칸을 할당하겠다
        System.out.printf("%02d월 %2d일\n", month, day); // 02월 10일
        System.out.printf("%2d월 %2d일\n", month, day);  //  2월 10일
        month = 12;
        day = 31;
        System.out.printf("%2d월 %2d일\n", month, day);  // 12월 31일 // 상위 3개가 오른쪽 정렬되어 출력됨
        System.out.printf("%02d월 %2d일\n", month, day); // 02월 10일 (공간이 남으면 0으로 채우기 -> 문자열은 안되고 숫자일때만(%d) 가능)

        String data2 = String.format("%2d월 %d일\n", month, day);
        System.out.println("data2 = " + data2); // data2 = 12월 31일

        // %d 는 숫자 정렬, %s 는 문자열 정렬
        String m = "2";
        String d = "10";
        System.out.printf("%2s월 %2s일\n", m, d);
        System.out.printf("%-2s월 %2s일\n", m, d); // 2 월 10일 (- 붙이면 왼쪽 정렬)

        // 비트를 1바이트로 나눠서 이진수의 유효범위 표현할때 많이 사용 (십진수 -> 이진수)
        // 10 (4byte) -> 00000000 00000000 00000000 00000000
        // 프로그래머스 카카오 기출 비밀지도 문제 (과제)

        // %f 는 실수, %c 는 문자
        final double PI = 123.1415927;
        System.out.printf("%.3f\n", PI); // 뒤에 소수점 3개까지만 출력 (네번째에서 반올림)
        System.out.printf("%e\n", PI); // 부동소수점 x 10^2 -> x10^ = e (지수표기법)
        // 컴퓨터는 지수표기법으로 바꾼뒤 이진수(정수, 가수 따로)로 바꿔 저장 (소수점 뒤에 6번째자리까지만 보여지고 생략되어 부정확하므로 같다라는 표현말고 오차범위내에 같은지를 체크해야함)

        // a, 'a', "a" 의 차이점은?
        // 변수, 문자, 문자열

        // %x : hex (16진수 : 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13 ...)
        System.out.printf("%x월 %x일\n", month, day); // c월 1f일

        // %o : octal (8진수 : 0 1 2 3 4 5 6 7 10 11 12 13 14 ...)
        System.out.printf("%o월 %o일\n", month, day); // 14월 37일
    }
}

0개의 댓글

관련 채용 정보