[백준 2438번] 별 찍기 - 1(JAVA)
서론
Scanner를 졸업하고 BufferedReader, BufferWriter를 연습하는 차원으로 문제에 접근했다.
시행착오(Trial&Error)
50966086 - 컴파일 에러
출력예시를 참고하기 위해 코드에 복붙했는데, 지우거나 주석처리를 하지 않아서 '컴파일 에러'가 발생했다.
50966095 - 컴파일 에러
Main.java:12: error: unreported exception IOException; must be caught or declared to be thrown
int num = Integer.parseInt(br.readLine());
^
1 error
IOException은 'Exception클래스와 자손들'에 속한다. 따라서, '예외처리' & 'try-catch문' 작성이 필수다. check예외이기 때문에 컴파일러가 예외처리 여부를 체크한다. try-catch문을 작성하지 않았기 때문에 '컴파일 에러'가 발생했다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
class Main {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num = Integer.parseInt(br.readLine()); // 에러!!! error: unreported exception IOException; must be caught or declared to be thrown
String str = "";
for(int i = 1; i <= num; i++) {
if(i != num) {
str += "*";
}
System.out.println(str);
}
}
}
50966164 - 틀렸습니다.
for(int i = 1; i <= num; i++) {
if(i != num) {
str += "*";
}
System.out.println(str);
}
예제 입력에 따라 5를 입력 받은 경우, 5줄을 할애하여 첫 째줄에는 * 한 개, 마지막 줄에는 * 다섯개를 출력해야 한다. 하지만 위와 같이 조건문을 작성하면, 마지막 줄에서는 *을 추가하지 않게 되기 때문에 n번째 줄에서 n-1개의 *이 출력되고 말 것이다. 따라서 '틀렸습니다'가 떴다.
풀이(Solution)
java.util.Scanner를 사용할 수도 있지만, 몇 가지 장점이 더 있기 때문에 BufferedReader, BufferedWriter를 사용했다.
몇 줄을 할애할 것인지에 대한 입력 값은 br.readLine() 메서드로 받았고, 숫자이기 때문에 Integer.parseInt()로 변환했다.
반복문 중 for문을 사용했고, 초기화식에 사용된 변수 i는 0이 아닌 1을 사용했다. 1을 사용해야 첫 째줄에 * 한 개를 작성해야 한다는 뜻을 명확히 전달할 수 있기 때문이다. 따라서, 증감식도 자연스럽게 <= 를 사용했다.
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num = Integer.parseInt(br.readLine());
String str = "";
for(int i = 1; i <= num; i++) {
str += "*";
System.out.println(str);
}
bw.close();
br.close();
} catch(IOException e) {}
}
}
bw.close() ? br.close() ?
bw.close()와 br.close()는 참고 블로그에서 작성하길래 썼는데, 왜 쓰는지 몰라서 검색을 해봤다.
자바에서는 '가비지 컬렉터'가 BufferedReader의 close메서드를 명시하지 않아도 되게금 자동으로 정리를 해주지만, BufferedWriter의 close메서드는 명시해주어야 한다.
가비지 컬렉터 : 자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 더 이상 사용되어질 수 없으므로 가비지 컬렉터에 의해서 자동적으로 메모리에서 삭제된다.
출처 : https://edu.goorm.io/qna/4699
구름EDU - 모두를 위한 맞춤형 IT교육
구름EDU는 모두를 위한 맞춤형 IT교육 플랫폼입니다. 개인/학교/기업 및 기관 별 최적화된 IT교육 솔루션을 경험해보세요. 기초부터 실무 프로그래밍 교육, 전국 초중고/대학교 온라인 강의, 기업/
edu.goorm.io