Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 메서드
- 인터페이스
- 배열
- 예외 처리
- SSR
- 새벽공부
- 문자 단위 스트림
- MPA
- 상속
- exception
- throws
- 자바
- 파이팅
- 인스턴스
- 초보개발자
- ArrayList
- 보조 스트림
- try-catch
- 다형성
- 자료형
- node.js
- 백엔드
- 바이트 단위 스트림
- 변수
- 코린이
- FileInputStream
- Java
- 졸리다
- 개발자
- 코딩
Archives
- Today
- Total
SHUSTORY
[ 백준 ] 2739번 : 구구단 _ JAVA 본문
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);
}
}
}
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);
});
}
}
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 값을 재할당 받고자 할 경우, 다음과 같이 코드를 수정하면 오류가 발생하지 않는다.
- final 로 변수를 선언하면 해당 변수는 재할당될 수 없다.
최종 수정 코드
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);
});
}
}
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);
});
}
}
'코딩테스트 > JAVA' 카테고리의 다른 글
[ 백준 ] 15552번 : 빠른 A + B _ JAVA (0) | 2023.11.28 |
---|---|
[ 백준 ] 10950번 : A + B - 3 _ JAVA (1) | 2023.11.28 |
[ 백준 ] 2480번 : 주사위 세개 _ JAVA (0) | 2023.11.27 |
[ 백준 ] 14681번 : 사분면 고르기 _ JAVA (1) | 2023.11.26 |
[ 백준 ] 9498번 : 시험 성적 _ JAVA (0) | 2023.11.26 |