Java 공부 43일차(래퍼, Class 클래스란?)4편

임선구·2025년 3월 17일

몸 비틀며 Java

목록 보기
44/58

오늘의 잔디


오늘의 공부


System 클래스

System 클래스는 시스템과 관련된 기본 기능들을 제공한다.

package lang.system;
import java.util.Arrays;
public class SystemMain {
 public static void main(String[] args) {
 // 현재 시간(밀리초)를 가져온다.
 long currentTimeMillis = System.currentTimeMillis();
 System.out.println("currentTimeMillis: " + currentTimeMillis);
 // 현재 시간(나노초)를 가져온다.
 long currentTimeNano = System.nanoTime();
 System.out.println("currentTimeNano: " + currentTimeNano);
 // 환경 변수를 읽는다.
 System.out.println("getenv = " + System.getenv());
 // 시스템 속성을 읽는다.
 System.out.println("properties = " + System.getProperties());
 System.out.println("Java version: " +
System.getProperty("java.version"));
 // 배열을 고속으로 복사한다.
 char[] originalArray = new char[]{'h', 'e', 'l', 'l', 'o'};
 char[] copiedArray = new char[5];
 System.arraycopy(originalArray, 0, copiedArray, 0, 
originalArray.length);
 // 배열 출력
 System.out.println("copiedArray = " + copiedArray);
 System.out.println("Arrays.toString = " +
Arrays.toString(copiedArray));
 //프로그램 종료 System.exit(0);
 }
}

실행 결과

currentTimeMillis: 1703570732276
currentTimeNano: 286372106104583
getenv = {IDEA_INITIAL_DIRECTORY=/, COMMAND_MODE=unix2003, 
LC_CTYPE=ko_KR.UTF-8, SHELL=/bin/zsh, HOME=/Users/yh, PATH=/opt/homebrew/bin:/
usr/local/bin: ...}
properties = {java.specification.version=21, java.version=21.0.1, 
sun.jnu.encoding=UTF-8, os.name=Mac OS X, file.encoding=UTF-8 ...}
Java version: 21.0.1
copiedArray = [C@77459877
Arrays.toString = [h, e, l, l, o]
  • 표준 입력, 출력, 오류 스트림: System.in , System.out , System.err 은 각각 표준 입력, 표준 출력, 표준 오류 스트림을 나타낸다.
  • 시간 측정: System.currentTimeMillis()System.nanoTime() 은 현재 시간을 밀리초 또는 나노초
    단위로 제공한다.
  • 환경 변수: System.getenv() 메서드를 사용하여 OS에서 설정한 환경 변수의 값을 얻을 수 있다.
  • 시스템 속성: System.getProperties() 를 사용해 현재 시스템 속성을 얻거나
    System.getProperty(String key) 로 특정 속성을 얻을 수 있다. 시스템 속성은 자바에서 사용하는 설정값이다.
  • 시스템 종료: System.exit(int status) 메서드는 프로그램을 종료하고, OS에 프로그램 종료의 상태 코드를 전달한다.
    • 상태 코드 0 : 정상 종료
    • 상태 코드 0 이 아님: 오류나 예외적인 종료
  • 배열 고속 복사: System.arraycopy 는 시스템 레벨에서 최적화된 메모리 복사 연산을 사용한다. 직접 반복문을 사용해서 배열을 복사할 때 보다 수 배 이상 빠른 성능을 제공한다.

Math, Random 클래스

Math 클래스

Math 는 수 많은 수학 문제를 해결해주는 클래스이다. 너무 많은 기능을 제공하기 때문에 대략 이런 것이 있구나 하는 정도면 충분하다. 실제 필요할 때 검색하거나 API 문서를 찾아 보자.

1. 기본 연산 메서드

  • abs(x) : 절대값
  • max(a, b) : 최대값
  • min(a, b) : 최소값

2. 지수 및 로그 연산 메서드

  • exp(x) : e^x 계산
  • log(x) : 자연 로그
  • log10(x) : 로그 10
  • pow(a, b) : a의 b 제곱

3. 반올림 및 정밀도 메서드

  • ceil(x) : 올림
  • floor(x) : 내림
  • rint(x) : 가장 가까운 정수로 반올림
  • round(x) : 반올림

4. 삼각 함수 메서드

  • sin(x) : 사인
  • cos(x) : 코사인
  • tan(x) : 탄젠트

5. 기타 유용한 메서드

  • sqrt(x) : 제곱근
  • cbrt(x) : 세제곱근
  • random() : 0.0과 1.0 사이의 무작위 값 생성

Math 에서 자주 사용하는 기능들을 예제로 만들어서 실행해보자.

package lang.math;
public class MathMain {
 public static void main(String[] args) {
 // 기본 연산 메서드
 System.out.println("max(10, 20): " + Math.max(10, 20)); //최대값
 System.out.println("min(10, 20): " + Math.min(10, 20)); //최소값
 System.out.println("abs(-10): " + Math.abs(-10)); //절대값
 // 반올림 및 정밀도 메서드
 System.out.println("ceil(2.1): " + Math.ceil(2.1)); //올림
 System.out.println("floor(2.7): " + Math.floor(2.7)); //내림
 System.out.println("round(2.5): " + Math.round(2.5)); //반올림
 // 기타 유용한 메서드
 System.out.println("sqrt(4): " + Math.sqrt(4)); //제곱근
 System.out.println("random(): " + Math.random()); //0.0 ~ 1.0 사이의
double}
}

실행 결과

max(10, 20): 20
min(10, 20): 10
abs(-10): 10
ceil(2.1): 3.0
floor(2.7): 2.0
round(2.5): 3
sqrt(4): 2.0
random(): 0.006347084592260965

참고: 아주 정밀한 숫자와 반올림 계산이 필요하다면 BigDecimal 을 검색해보자.

Random 클래스

랜덤의 경우 Math.random() 을 사용해도 되지만 Random 클래스를 사용하면 더욱 다양한 랜덤값을 구할 수 있다.
참고로 Math.random() 도 내부에서는 Random 클래스를 사용한다.

참고로 Random 클래스는 java.util 패키지 소속이다.

package lang.math;
import java.util.Random;
public class RandomMain {
 public static void main(String[] args) {
 Random random = new Random();
 //Random random = new Random(1); //seed가 같으면 Random의 결과가 같다.
 int randomInt = random.nextInt();
 System.out.println("randomInt: " + randomInt);
 double randomDouble = random.nextDouble(); //0.0d ~ 1.0d
 System.out.println("randomDouble: " + randomDouble);
 boolean randomBoolean = random.nextBoolean();
 System.out.println("randomBoolean: " + randomBoolean);
 // 범위 조회
 int randomRange1 = random.nextInt(10); //0 ~ 9까지 출력
 System.out.println("0 ~ 9: " + randomRange1);
 int randomRange2 = random.nextInt(10) + 1; //1 ~ 10까지 출력
 System.out.println("1 ~ 10: " + randomRange2);
 }
}

실행 결과
실행 결과는 항상 다르다.

randomInt: -1316070581
randomDouble: 0.37735342193577215
randomBoolean: false
0 ~ 9: 5
1 ~ 10: 7
  • random.nextInt() : 랜덤 int 값을 반환한다.
  • nextDouble() : 0.0d ~ 1.0d 사이의 랜덤 double 값을 반환한다.
  • nextBoolean() : 랜덤 boolean 값을 반환한다.
  • nextInt(int bound) : 0 ~ bound 미만의 숫자를 랜덤으로 반환한다. 예를 들어서 3을 입력하면 0, 1, 2 를 반환한다.

1부터 특정 숫자의 int 범위를 구하는 경우 nextInt(int bound) 의 결과에 +1을 하면 된다.

씨드 - Seed

랜덤은 내부에서 씨드(Seed)값을 사용해서 랜덤 값을 구한다. 그런데 이 씨드 값이 같으면 항상 같은 결과가 출력된다.

//Random random = new Random();
Random random = new Random(1); //seed가 같으면 Random의 결과가 같다.

실행 결과
Seed 가 같으면 실행 결과는 반복 실행해도 같다.

randomInt: -1155869325
randomDouble: 0.10047321632624884
randomBoolean: false
0 ~ 9: 4
1 ~ 10: 5
  • new Random() : 생성자를 비워두면 내부에서 System.nanoTime() 에 여러가지 복잡한 알고리즘을 섞어서 씨드값을 생성한다. 따라서 반복 실행해도 결과가 항상 달라진다.
  • new Random(int seed) : 생성자에 씨드 값을 직접 전달할 수 있다. 씨드 값이 같으면 여러번 반복 실행해도
    실행 결과가 같다. 이렇게 씨드 값을 직접 사용하면 결과 값이 항상 같기 때문에 결과가 달라지는 랜덤 값을 구할 수 없다. 하지만 결과가 고정되기 때문에 테스트 코드 같은 곳에서 같은 결과를 검증할 수 있다. 참고로 마인크래프트 같은 게임은 게임을 시작할 때 지형을 랜덤으로 생성하는데, 같은 씨드값을 설정하면 같은 지형을 생성할 수 있다.

재밌는 문제 로또 문제 여기서 나온 번호로 1등 가능?

어 난 가능

문제와 풀이2
문제 - 로또 번호 자동 생성기

문제 설명

  • 로또 번호를 자동으로 만들어주는 자동 생성기를 만들자
  • 로또 번호는 1~45 사이의 숫자를 6개 뽑아야 한다.
  • 각 숫자는 중복되면 안된다.
  • 실행할 때 마다 결과가 달라야 한다.

실행 결과

로또 번호: 11 19 21 35 29 16

정답

package lang.math.test;
import java.util.Random;
public class LottoGenerator {
 private final Random random = new Random();
 private int[] lottoNumbers;
 private int count;
 public int[] generate() {
 lottoNumbers = new int[6];
 count = 0;
 while (count < 6) {
 // 1부터 45 사이의 숫자 생성
 int number = random.nextInt(45) + 1;
 // 중복되지 않는 경우에만 배열에 추가
 if (isUnique(number)) {
 lottoNumbers[count] = number;
 count++;
 }
 }
 return lottoNumbers;
 }
 // 이미 생성된 번호와 중복되는지 검사
 private boolean isUnique(int number) {
 for (int i = 0; i < count; i++) {
 if (lottoNumbers[i] == number) {
 return false;
 }
 }
 return true;
 }
}
package lang.math.test;
public class LottoGeneratorMain { public static void main(String[] args) {
 LottoGenerator generator = new LottoGenerator();
 int[] lottoNumbers = generator.generate();
 // 생성된 로또 번호 출력
 System.out.print("로또 번호: ");
 for (int lottoNumber : lottoNumbers) {
 System.out.print(lottoNumber + " ");
 }
 }
}
profile
끝까지 가면 내가 다 이겨

0개의 댓글