문득 알고리즘 문제를 풀다 변수 초기화에 대해서 의문을 품게 되었었다.
(1) 문제 발생
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int f = scanner.nextInt();
int len = Integer.toString(n).length();
String result = ""; // 의문을 갖게 된 부분
String text = ""; // 의문을 갖게 된 부분
for(int i = 0; i < 100; i++) {
text = Integer.toString(n).substring(0, len - 2);
if(i < 10) {
result = "0" + i;
} else {
result = String.valueOf(i);
}
text += result;
if(Long.parseLong(text) % f == 0) {
break;
}
}
System.out.println(result);
}
}
* 해당 코드는 최종 제출 코드 이전의 코드이다.
인텔리제이 IDEA에서는 자동으로 코드 검사를 해주는 코드 인스펙션을 지원을 해준다.
자동 코드 검사를 통해 알게 된 사실은 result와 text라는 이름의 String 변수를 선언하는 부분에서 result는 변수를 초기화를 해주는게 맞다고 나왔고 text는 변수를 초기화 할 필요가 없다고 나왔다. 이 부분에서 의문을 갖게 되었다.
- 밑에 for문과 조건문에서 변수를 초기화 하고있는데? 굳이 변수를 초기화 해야할까?
궁금해서 result의 변수를 초기화 하지 않고 선언만 하고 코드를 쳐보니, 인스펙션이 컴파일 오류를 내뱉었다.
- 맨 밑에 출력문 변수에서 컴파일 오류를 내뱉고 있었다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int f = scanner.nextInt();
int len = Integer.toString(n).length();
String result; // 의문을 갖게 된 부분
String text; // 의문을 갖게 된 부분
for(int i = 0; i < 100; i++) {
text = Integer.toString(n).substring(0, len - 2);
if(i < 10) {
result = "0" + i;
} else {
result = String.valueOf(i);
}
text += result;
if(Long.parseLong(text) % f == 0) {
break;
}
}
System.out.println(result);
}
}
이 문제는 result와 text 변수 선언부에서 선언을 했지만 초기화를 하는 과정은 for문이나 if문과 같이 또 다른 스코프를 사용하고 있기 때문에, 해당 부분에서 초기화가 제대로 이뤄지지 않았을 때 출력문에는 무슨값이 출력이 될지 알 수 없기 때문에 내뱉는 오류이다.
컴파일러 입장
1. for 루프가 한 번도 실행되지 않을 수 있다.
2. if 조건문이 실행되지 않을 수 있다.
3. break문으로 인해 초기화가 안 될 수 있다.
(2) 문제 해결
해당 문제를 해결하기 위해서, result 변수를 for문과 if문 스코프에 넣어서 출력을하게 했다.
이런식으로 변수를 사용하게 된다면, 반드시 변수가 초기화가 된 이후에 이용을 할 수 있기 때문에 컴파일 오류 없이 코드를 실행할 수 있게 된다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int f = scanner.nextInt();
int len = Integer.toString(n).length();
String result;
String text;
for(int i = 0; i < 100; i++) {
text = Integer.toString(n).substring(0, len - 2);
if(i < 10) {
result = "0" + i;
} else {
result = String.valueOf(i);
}
text += result;
if(Long.parseLong(text) % f == 0) {
System.out.println(result);
break;
}
}
}
}
(3) 결론
변수 초기화는 필수이다.
(4) 회고
매우 기본적인 내용이지만, 처음 배울때 그냥 그렇구나 하고 넘어갔던 부분을 지금 와서 곰곰히 생각해보니 이유를 찾을 수 있었고 기본기에 대한 이해도가 더욱 늘어난 것 같다.
해당 알고리즘 문제는 백준 문제이고 해결한 코드는 깃허브에 올라가 있습니다.
'Java' 카테고리의 다른 글
[Java] Annotation 이란? ( 애노테이션 ) (0) | 2024.11.05 |
---|---|
[Java] JVM 동작 원리 (0) | 2024.10.23 |
[Java] 클래스와 객체의 정의 (9) | 2024.10.05 |
[Java] 상속 ( Extends ) (1) | 2024.05.01 |
[Java] 예외 ( Exception ) (2) | 2024.04.26 |