목차
- java.lang.Math - Math.random();
- java.util.Random 클래스
- Scanner 클래스
자바 API
- API(Application Programming Interface)의 약어이다. JDK 설치 통해 기본적으로 제공한 클래스, 인터페이스 등의 소스코드들을 의미한다.
- ctrl 누르고 String 누르면 String.class가 조회되듯이 API 문서들을 찾아 활용할 수가 있다.
- 설치된 JDK 버전에 맞춰 Google 검색창에 'JAVA API 11' 검색해 사이트 찾을 수 있다.
- java.lang 패키지 하위에 있는 클래스는 import 구문이 불필요하다. 대표적인 예로 java.lang.System, java.lang.String가 있다. 풀네임은 이러하나 굳이 import하지 않고 사용할 수 있는 예시들이다. 워낙 자주 사용하는 구문들이기에 컴파일러가 import.java.lang.*; 코드를 자동 추가해 컴파일하고 있다.
- 아래 예시에서처럼 java.lang을 꼭 붙이지 않아도 정상 출력되고 있음을 확인할 수 있다.
/* 절대값 출력 */
System.out.println(java.lang.Math.abs(-7));
System.out.println(Math.abs(-10.25));
7
10.25
1. java.lang.Math 클래스
- Math 클래스는 수학에서 자주 사용되는 상수 및 메소드들을 미리 구현해놓은 클래스이다.
- API 문서에서 확인할 수 있듯 Math 클래스는 모두 static으로 선언되어 있다. 이는 곧 static 메소드 호출 방식을 따른다는 뜻이다: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Math.html
❗ static 메소드 호출
클래스명.메소드명();
/* 최대값과 최소값 */
System.out.println(Math.max(10, 20));
System.out.println(Math.min(10, 20));
/* 원주율 */
System.out.println(Math.PI);
/* 난수 */
System.out.println(Math.random());
20
10
3.141592653589793
0.5966979530541449 * 출력마다 달라짐
Math.random();
❗ Math.random();은 0.0보다 크거나 같고 1.0보다 작은 double 값을 낸다.
- 실수가 아닌 정수 형태의 값을 필요로 할 때는 아래 공식을 활용할 수 있다.
- 구하고자 하는 특정 범위의 최대값을 max, 최소값을 min으로 놓고 본다.
❗ (int) (Math.random() * 구하려는 난수 갯수) + 구하려는 난수 최소값
== (int) (Math.random() * (max - min + 1) + min
/* 0 ~ 9 사이 난수 */
System.out.println((int)(Math.random() * 10));
/* 1 ~ 10 사이 난수 */
System.out.println((int)(Math.random() * 10) + 1);
/* 10 ~ 15 사이 난수 */
System.out.println((int)(Math.random() * 6) + 10);
/* byte 범위 난수 */
System.out.println((int)(Math.random() * 256) - 128);
✅ java.lang.Math에서 제공하는 메소드 및 상수의 의미를 이해할 수 있다.
✅ Math.random() 통해 난수를 구하고 활용할 수 있다.
2. java.util.Random 클래스
- 사용을 위해서는 import java.util.Random; 구문이 우선 선언되어야 한다.
- import 구문은 ctrl + shift + o 단축키를 통해서 자동완성 할 수 있다.
package com.reminder.api;
import java.util.Random;
public class Math02 {
public static void main(String[] args) {
Random random = new Random();
}
}
- nextInt 메소드를 이용해 난수를 생성할 수 있다.
- nextInt(Int bound)는 0부터 매개변수로 전달 받은 정수 범위까지의 난수를 발생시켜 정수 형태로 반환한다.
❗ random.nextInt(구하려는 난수의 갯수) + 구하려는 난수의 최소값
- byte 범위에 이르는 난수를 구하고자 하는 예시다.
- new Random().nextInt();의 경우는 객체 생성 후 바로 메소드를 호출할 수 있다. 하지만 이는 일회용에 그치고 다시는 사용하지 못하는 코드이다.
/* byte 범위 난수 */
int ranNumber4 = random.nextInt(256) - 128;
System.out.println("byte 범위의 난수 = " + ranNumber4);
int ranNumber5 = new Random().nextInt(256) - 128;
System.out.println("byte 범위의 난수 = " + ranNumber5);
✅ java.util.Random 통해 난수를 구하고 활용할 수 있다.
3. Scanner
- 사용자로부터 입력되는 정수, 실수, 문자열을 처리하는 클래스이다.
- java.util.Scanner라는 풀네임을 쓸 수도 있지만, 편의를 위해 import java.util.Scanner; 구문을 추가해 사용한다.
- Scanner 객체 생성은 다음과 같이 쓴다.
❗ Scanner scanner = new Scanner(System.in);
- Scanner는 자료형별로 값을 입력 받을 수 있다.
3-1. 문자열 입력 받기
- Scanner 사용 시 next();는 공백문자 미포함, nextLine();은 공백문자 포함한다는 차이에 주의하여야 한다.
- next();는 공백이나 개행 전까지만 읽는다.
- "안녕하세요 반갑습니다"를 입력했을 때, nextLine();는 문제 없이 출력하지만 next();는 공백 직전인 "안녕하세요"만 출력이 된다.
- "반갑습니다"라고 하는 버퍼에 남은 문자열 값이 int구문에 실행돼 오류로 읽힌 것이다.
- 이처럼 공백이 있는 문자열을 입력 받을 경우에는 nextLine()을 이용하는 것이 해결 방안이다.
Scanner scanner = new Scanner(System.in);
System.out.print("문장을 입력하세요. > ");
String str1 = scanner.next();
System.out.println("입력하신 문장은 " + str1 + "입니다.");
System.out.println("숫자를 입력하세요. > ");
int num = scanner.nextInt();
System.out.println("입력하신 숫자는 " + num + "입니다.");
문장을 입력하세요. > 안녕하세요 반갑습니다
입력하신 문장은 안녕하세요입니다.
숫자를 입력하세요. >
런타임 에러 메시지 : java.util.InputMismatchException
- 정수, 실수, 논리값 입력 후 nextLine()으로 문자열 입력 받을 때 앞에서 남긴 개행을 nextLine();이 읽고 넘어가서 아무 것도 입력하지 않았는데 출력되고 프로그램이 종료된다.
- 이런 경우에는 미리 nextLine();을 호출해서 버퍼를 비우고 동작시킨다.
System.out.println("숫자를 입력하세요. > ");
int num = scanner.nextInt();
System.out.println("입력하신 숫자는 " + num + "입니다.");
scanner.nextLine(); // 버퍼 비우는 용도
System.out.print("문장을 입력하세요. > ");
String str2 = scanner.nextLine();
System.out.println("입력하신 문장은 " + str2 + "입니다.");
3-2. 정수값 입력 받기
- nextByte(), nextShort(), nextInt(), nextLong() 모두 쓰일 수 있다.
- 단, 정수값만 받을 수 있다. "스무살", 'C'처럼 정수형에서 취급할 수 없는 값이나 효용 범위를 넘어선 숫자값을 입력하거든 런타임 에러 코드 InputMismatchException가 발생한다.
System.out.print("출생연도를 입력하세요. > ");
int year = scanner.nextInt();
System.out.println("당신의 출생연도는 " + year + "년입니다.");
System.out.print("희망 연봉을 입력하세요. > ");
long salary = scanner.nextLong();
System.out.println("당신의 희망 연봉은 " + salary + "입니다.");
2-3. 실수값 입력 받기
- nextFloat(), nextDouble() 모두 사용 가능하다.
- 지수부와 가수부에 값을 나누어 저장하는 실수형 특성상 유효자리 숫자가 달라 입력 받은 값이 float-double간에 동일하지 않을 수 있다. 예) 173.123456789 → 173.12346
System.out.print("평균 시력을 입력하세요. > ");
float sight = scanner.nextFloat();
System.out.println("당신의 평균 시력은 " + sight + "입니다.");
System.out.print("최고 점수를 입력하세요. > ");
double score = scanner.nextDouble();
System.out.println("당신의 최고 점수는 " + score + "입니다.");
2-4. 논리형 값 입력 받기
- nextBoolean() 또한 사용 가능하다. 값을 true 또는 false로만 받을 수 있다.
System.out.print("아침 드셨나요? true or false? > ");
boolean breakfast = scanner.nextBoolean();
System.out.println("당신의 아침 식사 여부는 " + breakfast + "입니다.");
2-5. 문자형 입력 받기
- 문자를 직접 입력 받는 기능은 제공하지 않는다. 문자열 String을 입력 받은 후 원하는 순번째 문자를 분리해 사용은 가능하다: char java.lang.String.charAt(int index)
- nextLine().charAt(); 또는 next().charAt() 형태로 쓰일 수 있다.
- chatAt(int index) 괄호 안에는 0부터 시작하는 정수형 숫자를 작성할 수 있고, 해당 index에 있는 문자 하나를 문자형으로 반환해주는 기능을 한다.
System.out.print("가장 좋아하는 영단어를 작성하세요. > ");
char ch = scanner.nextLine().charAt(3);
System.out.println("가장 좋아하는 영단어의 4번째 문자는 " + ch + "입니다.");
- 만일 입력한 문자열이 0~4까지의 인덱스를 가지고 있는 "hello"일 때, 9와 같은 범위 밖의 숫자를 입력하면 java.lang.StringIndexOutOfBoundsException 발생한다. 이런 경우 입력값을 변경해 오류를 해결한다.
✅ java.util.Scanner를 통해 값을 입력받고 활용할 수 있다.
'Java' 카테고리의 다른 글
조건문 수업 practice (0) | 2021.12.24 |
---|---|
[JAVA] 4-1. 조건문 if, switch (0) | 2021.12.23 |
메소드 수업 practice (0) | 2021.12.23 |
변수 수업 practice (0) | 2021.12.23 |
[JAVA] 3-1. 메소드, 패키지, 임포트 (0) | 2021.12.22 |