강좌 Course 2. part 5. 실전프로젝트
"이력 정보와 자기소개서를 입력받아 Excel 파일을 생성하는 프로그램"
설계:
1. Model, View, Controller 클래스를 만들어서 MVC 패턴을 구성한다.
2. View 클래스에서 Scanner를 사용하여 사용자로부터 정보를 입력받는다.
3. 입력받은 정보를 Model 클래스에 저장한다.
4. Controller 클래스에서 Model에 저장된 정보를 이용하여 엑셀 파일을 생성한다.
5. 엑셀 파일을 생성할 때, Apache POI 라이브러리를 사용한다.
6. 엑셀 파일 생성이 완료되면 View 클래스에서 "이력서가 생성되었습니다." 라는 메시지를 출력한다.
7. 자기소개서의 경우 Scanner.nextLine() 메서드를 사용해 여러 줄에 걸쳐 입력을 받을 수 있도록 하고, 엑셀 파일에 저장할 때는 "\n"을 사용하여 줄바꿈을 유지한다.
8. PNG 형식의 이미지를 엑셀 파일에 저장하기 위해, Apache POI라이브러리를 사용해 이미지를 삽입할 수 있도록 한다.
trim()
문자열의 메서드로, 문자열의 앞과 뒤에 오는 공백을 제거해준다. 문자열 사이의 공백은 제거하지 않는다.
String - StringBuffer - StringBuilder
String 객체는 한 번 할당되면 수정이 불가능하다(Immutable). 덧셈 연산자로 문자열을 합칠 수는 있지만, 문자열 a와 문자열 b를 합치면, 새로운 문자열 c가 만들어지며 a와 b는 삭제된다. 이런 방식으로 많은 문자열을 연결하게 되면 메모리 효율적이지 않다.
이를 계기로 등장한 것이 StringBuilder, StringBuffer인데, 이들은 변경 가능한 문자열 객체를 만들어준다. 기존의 문자열을 변경하면 되기 때문에 할당된 메모리 공간이 바뀌지도 않는다. 따라서 문자열을 합치는 작업을 여러 번 할 때는 이 둘을 사용하게 된다.
둘의 차이는 동기화 여부이다. StringBuffer는 동기화를 보장하지만, StringBuilder는 동기화를 보장하지 않는다.
때문에 동기화가 필요한 멀티스레드 환경일 때 StringBuffer를 사용하는 것이 안전하고, 동기화가 따로 필요없는 단일스레드 환경일 때는 StringBuilder를 사용하는 것이 좋다고 한다. (참고문서: 자바 문서 - StringBuilder)
FileInputStream - FileOutputStream
자바는 이미지나 오디오 파일을 열 때 Stream을 통해 열어야한다. 파일을 읽어올 때는 FileInputStream을, 파일을 저장할 때는 FileOutputStream을 사용한다.public class FileExample { public static void main(String[] args) { try { // FileInputStream to read from a file FileInputStream fis = new FileInputStream("input.txt"); int data; while ((data = fis.read()) != -1) { // Process the data read from the file System.out.print((char) data); } fis.close(); // Close the FileInputStream // FileOutputStream to write to a file FileOutputStream fos = new FileOutputStream("output.txt"); String message = "this is an example"; fos.write(message.getBytes()); // Write the string to the file as bytes fos.close(); // Close the FileOutputStream } catch (IOException e) { e.printStackTrace(); } } }
FileInputStream으로 읽을 파일이 Working Directory에 있다면 파일 이름만 파라미터로 넘겨도 된다. 주로 실행하는 파일과 같은 디렉토리에 있으면 잘 실행되나, 프로젝트와 다른 디렉토리에 파일이 있거나, 실제 파일의 디렉토리와 워킹 디렉토리가 다르게 잡혀있는 경우에는 상대경로를 주거나 절대경로로 파일을 잡아줄 필요가 있다. 현재 워킹 디렉토리는
System.out.println(System.getProperty("user.dir"));
로 볼 수 있다.
FileOutputStream을 close()하면 스트림이 닫히는 동시에 파일이 저장된다. 만약 FileOutputStream에 경로를 넘겼다면 해당 경로로 파일이 저장된다(해당 경로가 존재하지 않는다면 생성되지 않는다). 이미 같은 이름의 파일이 존재했다면 파일을 새로 덮어쓴다.
IOException
IOException은 java.io 패키지에 있는 예외 클래스이다. try-catch 블록으로 잡거나 메서드의 헤더에서 throw로 선언해야 한다. 주로 파일이나 스트림, 소켓을 읽어오거나, 저장할 때 문제가 발생하면 IOException이 발생한다.