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()
}
}
scanner.next()
scanner.nextLine()
scanner.nextInt()
parseInt()
시킨 것scanner.nextDouble()
parseDouble(next())
: 문자열로 입력 받아 실수로 파싱(char) scanner.nextInt()
: int 로 받아 형변환scanner.next().charAt(0)
: 문자열로 받아 인덱싱char ch = 100;
: 아스키코드 값이 100인 문자 하나 할당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일
}
}