입력받은 숫자가 소수인지 아닌지 판별하는 문제를 통해 배운게 꽤 많아서 정리하려고 한다.
첫 번째 내가 푼 풀이이다.
import java.util.Scanner;
public class FindPrimeNumberRunner {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Input any number!");
boolean isPrime = true;
int number = input.nextInt();
for (int i = 2; i < Math.sqrt(number); i++) {
if (number % i == 0) {
isPrime = false;
}
}
System.out.println(number + " is %s Prime Number"
.formatted(isPrime ? "" : "not"));
}
}
인풋을 입력받기 위해 Scanner 클래스를 사용했다.
System.in 을 통해 console 창에서 사용자로부터 콘솔을 입력받을 수 있다고 한다.
생성된 Scanner 객체의 메소드인 nextInt를 통해 공백이 오기전 int를 받아올 수 있다.
nextLine, nextDouble 등의 메소드가 있다고 한다.
다음은 리팩터링을 하여 메소드를 만들어 코드를 나누고 소수가 되는 조건을 수정했다.
import java.util.Scanner;
public class FindPrimeNumberRunner {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Input any number!");
int number = input.nextInt();
boolean isPrime = isPrimeNumber(number);
System.out.println(number + " is %s Prime Number"
.formatted(isPrime ? "" : "not"));
}
static boolean isPrimeNumber(int number) {
if(number < 2) return false;
for (int i = 2; i <= Math.sqrt(number); i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
}
아래는 GPT가 해준 리팩터링이다.
import java.util.InputMismatchException;
import java.util.Scanner;
public class PrimeNumberFinder {
public static void main(String[] args) {
try (Scanner inputScanner = new Scanner(System.in)) {
System.out.println("Enter a number:");
int inputNumber = 0;
boolean isValidInput = false;
while (!isValidInput) {
try {
inputNumber = inputScanner.nextInt();
isValidInput = true;
} catch (InputMismatchException e) {
System.out.println("Invalid input. Please enter a number:");
inputScanner.nextLine(); // Clear invalid input
}
}
boolean isPrime = isPrime(inputNumber);
System.out.println(inputNumber + " is " + (isPrime ? "a" : "not a") + " prime number.");
}
}
static boolean isPrime(int number) {
if (number < 2) {
return false;
}
for (int i = 2; i <= Math.sqrt(number); i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
}
FindPrimeNumberRunner-> PrimeNumberFinder, input -> inputScanner, number -> inputNumber 와 같이 네이밍을 확실하게 리팩터링했다.
그리고 try 문을 사용해서 Scanner 객체가 필요하지 않을때 자동으로 종료해줘 메모리 누수를 막는다고 한다.
try(Scanner inputScanner = new Scanner(System.in)){}
이처럼 try 괄호에 객체를 생성해 주면 해당 리소스가 AutoCloseable 인터페이스가 구현되있는 리소스인 경우에 try문을 빠져나갈때 자동으로 해당 리소스의 close() 메소드를 호출해 준다고 한다.
이를 try-with-resources라고 한다.
close() 메소드를 찾아보면 아래와 같이 되어있다.
public void close() {
if (closed)
return;
if (source instanceof Closeable) {
try {
((Closeable)source).close();
} catch (IOException ioe) {
lastException = ioe;
}
}
sourceClosed = true;
source = null;
closed = true;
}
close() 가 실행되면 source를 닫은 다음 비워주고, closed = true로 만들면서 객체를 닫아버린다.
Closeable을 타고 들어가보면 AutoCloseable 인터페이스를 extends 하고 있다는 것을 알수 있다.
AutoCloseable 인터페이스를 구현하면 try-with-resources를 사용할 수 있다고 한다.
마지막으로 InputMismatchException을 통해서 int가 아닌 값을 입력받았을때 int값을 입력받을 때까지 while문을 돌며 반복한다.
'개발 > JAVA' 카테고리의 다른 글
[Java] 필드 주입시 생성자에 this 꼭 써야할까? (0) | 2023.06.05 |
---|---|
[Java] @Override 꼭 적어야 하나? (0) | 2023.05.04 |
[Java] 인터페이스가 가진 객체지향의 특징 (0) | 2023.05.03 |
[Java] List<T> list = new ArrayList<>(); (0) | 2023.04.25 |
[JAVA] java 기본개념 (+ jshell) (0) | 2023.04.04 |