SHUSTORY

[ 백준 ] 2739번 : 구구단 _ JAVA 본문

코딩테스트/JAVA

[ 백준 ] 2739번 : 구구단 _ JAVA

어서오시우 2023. 11. 27. 17:51
728x90
문제

 

내 풀이
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
while (N < 1 || N > 9) {
System.out.println("숫자의 범위를 1부터 9까지로 입력해주세요.");
N = sc.nextInt();
}
sc.close();

for (int i = 1; i < 10; i++) {
System.out.println(N + " * " + i + " = " + N*i);
}
}
}
  • 나는 받을 수 있는 범위를 아예 따로 지정하고 조건에 맞는 값을 받아온 뒤 구구단을 출력하는 코드를 작성하였다.
    그런데 IntStream.range( ) 함수와 forEach( ) 함수를 통해 더욱 간결하고 가독성이 좋은 코드를 작성할 수 있다.

 

IntStream.range( )
forEach( )
  • IntStream.range( a,b )
    • 데이터 타입이 Integer 인 것을 범위에 맞게 차례대로 출력해주는 것을 의미한다.
    • a 부터 b-1 까지의 숫자를 출력해준다.
  • IntStream.rangeClosed( a,b )
    • 거의 대부분의 언어는 range를 사용할 때 (a,b)가 범위일 경우 a ~ b-1 까지 사용한다.
    • rangeClosed를 사용할 경우 a부터 b 까지가 범위가 된다.

 

  • forEach( )
    • forEach( ) 메서드는 JAVA8에서 추가된 Iterator 인터페이스의 기본 메서드이다.
    • 스트림의 각 요소를 반복하면서 지정된 동작을 수행하는 역할을 한다.

 

람다식
import java.util.Scanner;
import java.util.stream.IntStream;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
while (N < 1 || N > 9) {
System.out.println("입력값을 1 이상 9 이하의 범위 내에서 입력하세요.");
N = sc.nextInt();
}
sc.close();

IntStream.rangeClosed(1, 9).forEach(i -> {
System.out.printf("%d * %d = %d%n", N, i, N * i);
});
}
}
  • 새롭게 코드를 작성했는데, 정작 실행했을 때 다음과 같은 에러가 발생하는 것을 볼 수 있다.

  • 이 오류는 람다 표현식 내에서 외부 변수 'N'을 참조할 때 발생하는 것으로, 
    람다 표현식에서 사용되는 외부 변수가 final이거나 effectively final 형태여야 한다.
    • final 로 변수를 선언하면 해당 변수는 재할당될 수 없다.
      그런데 내가 수정한 코드에서는 입력받은 N 값이 조건에 따라 while 문 내에서 재할당 받기 때문에
      effectively final 값으로 간주되지 않기 때문에 오류가 발생한다.
    • 만약 while 문 내부에 N = sc.nextInt( ) 부분을 주석처리 한다면
      final로 선언하지 않더라도 effectively final로 간주되어 에러가 발생하지 않는다.
    • 하지만 조건에 따라 N 값을 재할당 받고자 할 경우, 다음과 같이 코드를 수정하면 오류가 발생하지 않는다.

 

최종 수정 코드
import java.util.Scanner;
import java.util.stream.IntStream;

public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
while (N < 1 || N > 9) {
System.out.println("입력값을 1 이상 9 이하의 범위 내에서 입력하세요.");
N = sc.nextInt();
}
sc.close();

final int finalN = N;
IntStream.rangeClosed(1, 9).forEach(i -> {
System.out.printf("%d * %d = %d%n", finalN, i, finalN * i);
});
}
}