Presentation is loading. Please wait.

Presentation is loading. Please wait.

명품 JAVA Programming.

Similar presentations


Presentation on theme: "명품 JAVA Programming."— Presentation transcript:

1 명품 JAVA Programming

2 스트림(Stream) 자바의 스트림 입출력 스트림 기본 단위 : 바이트 자바 입출력 스트림 특징
자바 스트림은 입출력 장치와 자바 응용 프로그램 연결 입출력 장치와 프로그램 사이의 데이타 흐름을 처리하는 소프트웨어 모듈 입력 스트림 입력 장치로부터 자바 프로그램으로 데이터를 전달하는 소프트웨어 모듈 출력 스트림 자바 프로그램에서 출력 장치로 데이터를 보내는 소프트웨어 모듈 입출력 스트림 기본 단위 : 바이트 자바 입출력 스트림 특징 단방향 스트림, 선입선출 구조

3 자바의 입출력 스트림 종류 바이트 입출력 스트림과 문자 입출력 스트림 JDK는 입출력 스트림을 구현한 다양한 클래스 제공
입출력되는 데이터를 단순 바이트의 스트림으로 처리 예) 바이너리 파일을 읽는 입력 스트림 문자 입출력 스트림 문자만 입출력하는 스트림 문자가 아닌 바이너리 데이터는 스트림에서 처리하지 못함 예) 텍스트 파일을 읽는 입력 스트림 JDK는 입출력 스트림을 구현한 다양한 클래스 제공 다음 슬라이드

4 JDK의 바이트 스트림 클래스 계층 구조 입력(入力) 출력(出力) 클래스 이름이 공통적으로 Stream으로 끝남

5 JDK의 문자 스트림 클래스 계층 구조 입력(入力) 출력(出力) 클래스 이름이 공통적으로 Reader/Writer로 끝남

6 스트림은 연결될 수 있다 InputStreamReader rd = new InputStreamReader(System.in);
* 별 모양의 쿠키를 굽는 스트림 * 표준 입력 스트림 System.in에 InputStreamReader 스트림을 연결하는 사례 InputStreamReader rd = new InputStreamReader(System.in); int c = rd.read(); // 키보드에서 문자 읽음

7 바이트 스트림 클래스 바이트 스트림 바이트 스트림 클래스 바이트 단위의 바이너리 값을 읽고 쓰는 스트림
java.io 패키지에 포함 InputStream/OutputStream 추상 클래스 바이트 스트림을 다루는 모든 클래스의 슈퍼 클래스 FileInputStream/FileOutputStream 파일로부터 바이트 단위로 읽거나 저장하는 클래스 바이너리 파일의 입출력 용도 DataInputStream/DataOutputStream 자바의 기본 데이터 타입의 값(변수)을 바이너리 값 그대로 입출력 문자열도 바이너리 형태로 입출력

8 FileInputStream을 이용한 파일 읽기
파일 전체를 읽어 화면에 출력하는 코드 샘플 C:\test.txt 파일을 열고 파일과 입력 바이트 스트림 객체 fin 연결 FileInputStream fin = new FileInputStream("c:\\test.txt"); int c; while((c = fin.read()) != -1) { System.out.print((char)c); } fin.close(); 파일 끝까지 바이트씩 c에 읽어 들임. 파일의 끝을 만나면 read()는 -1 리턴 바이트 c를 문자로 변환하여 화면에 출력 스트림을 닫음. 파일도 닫힘. 스트림과 파일의 연결을 끊음. 더 이상 스트림으로부터 읽을 수 없음

9 예제 8-1 : 윈도우에 있는 system.ini 파일을 읽어 화면에 출력하기
FileInputStream을 이용하여 사용자 컴퓨터의 windows 디렉터리에 있는 system.ini 파일을 읽고 화면에 출력하라. system.ini 파일은 텍스트 파일이다. import java.io.*; public class FileInputStreamEx { public static void main(String[] args) { FileInputStream in = null; try { in = new FileInputStream("c:\\windows\\system.ini"); int c; while ((c = in.read()) != -1) { System.out.print((char)c); } in.close(); } catch (IOException e) { System.out.println("입출력 오류"); ; for 16-bit app support [386Enh] woafont=dosapp.fon EGA80WOA.FON=EGA80WOA.FON EGA40WOA.FON=EGA40WOA.FON CGA80WOA.FON=CGA80WOA.FON CGA40WOA.FON=CGA40WOA.FON [drivers] wave=mmdrv.dll timer=timer.drv [mci] 파일 끝을 만나면 -1 리턴

10 FileOutputStream을 이용한 파일 쓰기
바이너리 값을 파일에 저장하는 바이트 스트림 코드 FileOutputStream fout = new FileOutputStream("c:\\test.out"); int num[]={1,4,-1,88,50}; byte b[]={7,51,3,4,1,24}; for(int i=0; i<num.length; i++) fout.write(num[i]); fout.write(b); fout.close(); c:\test.out 파일을 열고, 출력 바이트 스트림인 객체와 연결 파일에 배열 num[i]의 정수 값(바이너리)을 그대로 기록 파일에 바이트 배열(바이너리) 값을 그대로 기록 스트림을 닫음. 파일도 닫힘. 더 이상 스트림으로부터 읽을 수 없음 파일에 있는 각 바이너리 값들은 문자 정보가 아님. 바이너리 값에 대응하는 그래픽 심볼들 test.out 파일의 내부

11 예제 8-2 : FileOutputStream을 이용한 파일 쓰기
import java.io.IOException; public class FileOutputStreamEx { public static void main(String[] args) { try { FileOutputStream fout = new FileOutputStream(“c:\\test.out"); FileInputStream fin = null; for (int i=0; i<10; i++) { int n = 10-i; // 계산의 결과를 저장 fout.write(n); // 파일에 결과값을 바이너리로 저장(바이트) } fout.close(); //스트림을 닫는다. fin = new FileInputStream(“c:\\test.out"); int c=0; while ((c = fin.read()) != -1) { System.out.print(c + " "); fin.close(); } catch (IOException e) { System.out.println("입출력 오류"); 정수 타입의 결과 값을 FileOutputStream을 이용하여 파일에 저장한다. 다시 이 파일에서 정수형 변수로 읽고 이전에 계산된 결과 값과 같은지 확인하라.

12 문자 스트림 문자 스트림 문자 스트림을 다루는 클래스 유니 코드로 된 문자를 입출력 하는 스트림 Reader/Writer
문자로 표현되지 않는 데이터는 다루지 않음 문자 스트림은 이미지, 동영상과 같은 바이너리 데이터는 입출력 할 수 없 음 - 문자 스트림은 문자 데이터만 입출력 가능 문자 스트림을 다루는 클래스 Reader/Writer java.io 패키지에 포함 추상 클래스. 문자 스트림을 다루는 모든 클래스의 슈퍼 클래스 InputStreamReader/OutputStreamWriter 바이트 스트림과 문자 스트림을 연결시켜주는 다리 역할 지정된 문자집합 이용 InputStreamReader : 바이트를 읽어 문자로 인코딩 OutputStreamWriter : 문자를 바이트로 디코딩하여 출력 FileReader/FileWriter 텍스트 파일에서 문자 데이터 입출력

13 예제 8-3 : FileReader를 이용한 텍스트 파일 읽기 - system.ini 파일 읽기
FileReader를 이용하여 사용자 컴퓨터의 windows 디렉터리에 있는 system.ini 파일을 읽고 화면에 출력하라. system.ini 파일은 텍스트 파일이다. import java.io.*; public class FileReaderEx { public static void main(String[] args) { FileReader in = null; try { // 파일로부터 문자 입력 스트림 생성 in = new FileReader("c:\\windows\\system.ini"); int c; while ((c = in.read()) != -1) { // 한 문자씩 읽는다. System.out.print((char)c); } in.close(); } catch (IOException e) { System.out.println("입출력 오류"); ; for 16-bit app support [386Enh] woafont=dosapp.fon EGA80WOA.FON=EGA80WOA.FON EGA40WOA.FON=EGA40WOA.FON CGA80WOA.FON=CGA80WOA.FON CGA40WOA.FON=CGA40WOA.FON [drivers] wave=mmdrv.dll timer=timer.drv [mci] 파일의 끝을 만나면 read()는 -1 리턴

14 문자 집합과 InputStreamReader로 텍스트 파일 읽기
FileInputStream fin = new FileInputStream("c:\\tmp\\hangul.txt"); InputStreamReader in = new InputStreamReader(fin, "MS949"); while ((c = in.read()) != -1) { System.out.print((char)c); } 한글 완성형 확장형 문자 집합 문자 집합 사용 (윈도우에서 MS949) fin in in.read()     ‘가’, ‘나’ FileInputStream InputStreamReader

15 예제 8-4 : 한글 텍스트 파일 읽기 InputStreamReader를 이용하여 MS949 문자 집합으로
한글 텍스트 파일을 읽고 출력하라. import java.io.*; public class FileReadHangulSuccess { public static void main(String[] args) { InputStreamReader in = null; FileInputStream fin = null; try { fin = new FileInputStream("c:\\tmp\\hangul.txt"); in = new InputStreamReader(fin, "MS949"); int c; System.out.println("인코딩 문자 집합은 " + in.getEncoding()); while ((c = in.read()) != -1) { System.out.print((char)c); } in.close(); fin.close(); } catch (IOException e) { System.out.println("입출력 오류"); hangul.txt MS에서 만든 한글 확장 완성형 문자 집합 인코딩 문자 집합은 MS949 가나다라마바사아자차카타파하

16 예제 8-5 : 문자 집합 지정이 잘못된 한글 텍스트 파일 읽기
InputStreamReader의 문자 집합을 US-ASCII로 지정하여 한글 파일을 읽고 출력하라. import java.io.*; public class FileReadHangulFail { public static void main(String[] args) { InputStreamReader in = null; FileInputStream fin = null; try { fin = new FileInputStream("c:\\tmp\\hangul.txt"); in = new InputStreamReader(fin, "US-ASCII"); int c; System.out.println("인코딩 문자 집합은 " + in.getEncoding()); while ((c = in.read()) != -1) { System.out.print((char)c); } in.close(); fin.close(); } catch (IOException e) { System.out.println("입출력 오류"); 문자 집합 지정이 잘못된 경우의 예를 보이기 위해 일부러 틀린 문자 집합 지정 hangul.txt 문자 집합 지정이 잘못되어 읽은 문자가 제대로 인식되지 못함. 출력 결과가 깨짐 인코딩 문자 집합은 ASCII ????????????????????????????

17 FileWriter 사용 예 c:\test.txt 파일에 문자 출력 스트림을 생성하는 코드 파일에 문자 출력
FileWriter fout = new FileWriter("c:\\tmp\\test.txt"); FileWriter fout = new FileWriter("c:\\tmp\\test.txt"); fout.write(‘A’); // 문자 ‘A’ 출력 fout.close();

18 예제 8-6 : 키보드 입력을 파일로 저장하기 키보드에서 입력 받은 데이터를 c:\tmp\test.txt 파일에 저장하는 코드를 작성하라. import java.io.*; public class FileWriterEx { public static void main(String[] args) { InputStreamReader in = new InputStreamReader(System.in); FileWriter fout = null; int c; try { fout = new FileWriter("c:\\tmp\\test.txt"); while ((c = in.read()) != -1) { fout.write(c); } in.close(); fout.close(); } catch (IOException e) { System.out.println("입출력 오류"); abcdef 입력 후 <Enter> 키와 ctrl-z키 입력 실행 결과 test.txt 파일 생성

19 버퍼 입출력 스트림과 버퍼 입출력의 특징 버퍼 스트림(Buffer Stream) 버퍼 입출력의 목적 버퍼를 가진 스트림
입출력 데이터를 일시적으로 저장하는 버퍼를 이용하여 입출력 효율 개선 버퍼 입출력의 목적 입출력 시 운영체제의 API 호출 횟수를 줄여 입출력 성능 개선 <출력시> 여러 번 출력되는 데이터를 버퍼에 모아두고 한 번에 장치로 출력 <입력시> 입력 데이터를 버퍼에 모아두고 한번에 프로그램에게 전달

20 버퍼 스트림의 종류 바이트 버퍼 스트림 문자 버퍼 스트림 바이트 단위의 바이너리 데이터를 처리하는 버퍼 스트림
BufferedInputStream와 BufferedOutputStream 문자 버퍼 스트림 유니코드의 문자 데이터만 처리하는 버퍼 스트림 BufferedReader와 BufferedWriter 버퍼 기본크기 : 8192 char (즉, byte)

21 20바이트 버퍼를 가진 BufferedOutputStream
BufferedOutputStream bout = new BufferedOutputStream(System.out, 20); FileReader fin = new FileReader("c:\\windows\\system.ini"); int c; while ((c = fin.read()) != -1) { bout.write((char)c); } fin.close(); bout.close(); 20바이트 크기의 버퍼 설정. System.out 표준 스트림에 출력 파일 전체를 읽어 화면에 출력 스트림 닫음 fin in.read() ‘;’ ‘f’ ‘o’ ‘r’ ‘;’ ‘f’ ‘o’ ‘r’ FileReader ‘;’ ‘f’ ‘o’ ‘r’ int c ; for 16-bit app support [386Enh] woafont=dosapp.fon EGA80WOA.FON=EGA80WOA.FON EGA40WOA.FON=EGA40WOA.FON CGA80WOA.FON=CGA80WOA.FON CGA40WOA.FON=CGA40WOA.FON bout System.out     BufferedOutputStram OutputStream 20바이트 버퍼

22 예제 8-7 : 버퍼 스트림을 이용하는 출력 예제 버퍼 크기를 5로 하고, 표준 출력 스트림과 연결된 버퍼 출력 스트림을 생성하라.그리고 키보드에서 입력 받은 문자를 출력 스트림에 출력하고, 입력의 끝을 알리면(ctrl-z) 버퍼에 남아 있는 모든 문자를 출력하는 프로그램을 작성하라. import java.io.*; public class BufferedIOEx { public static void main(String[] args) { InputStreamReader in = new InputStreamReader(System.in); BufferedOutputStream out = new BufferedOutputStream(System.out, 5); try { int c; while ((c = in.read()) != -1) { out.write(c); } out.flush(); // 버퍼에 남아 있던 문자 출력 if (in != null) { in.close(); out.close(); } catch (IOException e) { System.out.println("입출력 오류"); ctrl-z가 입력될 때까지 반복 <Enter>키를 입력했을 때 버퍼에 저장된 12345까지만 출력. 버퍼가 비게 되고 다시 678이 버퍼에 저장됨 버퍼가 다 찰 때 문자가 화면에 출력 ctrl-z 키를 입력했을 때 버퍼에 남아있던 678 모두 출력

23 Check Time p.440 3. 버퍼의 크기를 2048바이트로 하고,FileReader 스트림을 연결하여 c:\windows\system.ini 파 일을 읽고 화면에 출력하는 프로그램을 버퍼스 트림을 이용하여 작성하기. BufferedReader in = new BufferedReader(new FileReader(“c:\\windows\\system.ini”), 2048); while((c = in.read()) != -1) { Syetem.out.print((char) c)); } in.close();

24 File 클래스 File 클래스 파일의 경로명을 다루는 클래스 파일 이름 변경, 삭제, 디렉터리 생성, 크기 등 파일 관리
java.io.File 파일과 디렉터리 경로명의 추상적 표현 파일 이름 변경, 삭제, 디렉터리 생성, 크기 등 파일 관리 File 객체는 파일 읽고 쓰기 기능 없음 파일 입출력은 파일 입출력 스트림 이용

25 File 클래스 생성자와 주요 메소드

26 File 클래스 사용 예 파일 객체 생성 파일인지 디렉터리인지 구분 서브 디렉터리 리스트 얻기
File f = new File("c:\\test.txt"); 파일인지 디렉터리인지 구분 File f = new File("c:\\windows\\system.ini"); String res; if(f.isFile()) // 파일 타입이면 res = "파일"; else // 디렉터리 타입이면 res = "디렉터리"; System.out.println(f.getPath() + "은 " + res + "입니다."); c:\windows\system.ini은 파일입니다. 서브 디렉터리 리스트 얻기 File f = new File("c:\\tmp\\java_sample"); String[] filenames = f.list(); // 파일명 리스트 얻기 for (int i=0; i<filenames.length; i++) { File sf = new File(f, filenames[i]); System.out.print(filenames[i]); System.out.print("\t파일 크기: " + sf.length()); }

27 예제 8-8 : File 클래스 활용한 파일 관리 File 클래스를 이용하여 파일의 타입을 알아내고, 디렉터리에 있는
파일들을 나열하며, 디렉터리 이름을 변경하는 프로그램을 작성해보자. import java.io.File; public class FileClassExample { // 디렉터리에 포함된 파일과 디렉터리의 이름, // 크기, 수정 시간을 출력하는 메소드 public static void dir(File fd) { // 디렉터리에 포함된 파일 리스트 얻기 String[] filenames = fd.list(); for (String s : filenames) { File f = new File(fd, s); long t = f.lastModified(); // 마지막으로 수정된 시간 System.out.print(s); System.out.print("\t파일 크기: " + f.length()); // 파일 크기 System.out.printf("\t수정한 시간: %tb %td %ta %tT\n",t, t, t, t); } public static void main(String[] args) { File f1 = new File("c:\\windows\\system.ini"); File f2 = new File("c:\\tmp\\java_sample"); File f3 = new File("c:\\tmp"); String res; if(f1.isFile()) // 파일 타입이면 res = "파일"; else // 디렉터리 타입이면 res = "디렉터리"; System.out.println(f1.getPath() + "은 " + res + "입니다."); if (!f2.exists()) { //f2가 나타내는 파일이 존재하는지 검사 if (!f2.mkdir()) // 존재하지 않으면 디렉터리 생성 System.out.println("디렉터리 생성 실패"); if(f2.isFile()) // 파일 타입이면 res = "파일"; else // 디렉터리 타입이면 res = "디렉터리"; System.out.println(f2.getPath() + "은 " + res + "입니다."); dir(f3); // c:\tmp에 있는 파일과 디렉터리 화면에 출력 // 파일 이름 변경 f2.renameTo(new File("c:\\tmp\\javasample")); dir(f3); } c:\windows\system.ini은 파일입니다. c:\tmp\java_sample은 디렉터리입니다. hangul.txt 파일 크기: 28 수정한 시간: 11월 29 일 21:04:46 Hello.java 파일 크기: 469 수정한 시간: 10월 06 수 13:23:59 Hello2010.java 파일 크기: 126 수정한 시간: 10월 06 수 10:01:56 HelloDoc.java 파일 크기: 669 수정한 시간: 10월 06 수 14:23:32 java_sample 파일 크기: 0 수정한 시간: 11월 14 일 16:46:27 hangul.txt 파일 크기: 28 수정한 시간: 11월 29 일 21:04:46 Hello.java 파일 크기: 469 수정한 시간: 10월 06 수 13:23:59 javasample 파일 크기: 0 수정한 시간: 11월 14 일 16:46:27 C:\tmp의 파일과 디렉터리 리스트 %tb 월 %td 일 %ta 요일 %tT 시각

28 예제 8-9 : 텍스트 파일 복사 문자 스트림을 이용하여 텍스트 파일을 복사하는 프로그램을 작성하라
import java.io.*; public class TextCopy { public static void main(String[] args){ File src = new File("c:\\windows\\system.ini"); // 소스 파일 File dst = new File("c:\\tmp\\system.txt"); // 목적 파일 FileReader fr = null; FileWriter fw = null; BufferedReader in = null; BufferedWriter out = null; int c; try { fr = new FileReader(src); fw = new FileWriter(dst); in = new BufferedReader(fr); out = new BufferedWriter(fw); while ((c = in.read()) != -1) { out.write((char)c); } in.close(); out.close(); fr.close(); fw.close(); } catch (IOException e) { System.out.println("파일 복사 오류"); } 예제 실행

29 예제 8-10 : 바이너리 파일 복사 바이트 스트림을 이용하여 바이너리 파일을 복사하는 프로그램을 작성하라
import java.io.*; public class BinaryCopy { public static void main(String[] args) { File src = new File("c:\\windows\\explorer.exe"); // 소스 파일 File dst = new File("c:\\tmp\\explorer.bin"); // 목적 파일 FileInputStream fi = null; FileOutputStream fo = null; BufferedInputStream in = null; BufferedOutputStream out = null; int c; try { fi = new FileInputStream(src); fo = new FileOutputStream(dst); in = new BufferedInputStream(fi); out = new BufferedOutputStream(fo); while ((c = in.read()) != -1) { out.write((char)c); } in.close(); out.close(); fi.close(); fo.close(); } catch (IOException e) { System.out.println("파일 복사 오류"); } 예제 실행 explorer.exe와 파일 크기 동일

30 Open Challenge 8. Hangman 게임만들기
간단한 행맨 게임을 만들어보자. 프로그램 은 사용자 모르게 영어 단어 하나를 선택하 고 몇 개의 글자를 숨긴 다음 화면에 출력 하여 사용자에게 이 단어를 맞추게 하는 게 임이다. 숨긴 글자의 개수가 많을수록 난이 도가 높다. 이 도전 주제는 2개의 글자만 숨 기도록 하자. 한 단어에 대해 5번 틀리면 오 류메시지를 출력하고 정답을 출력하도록 하 라. 게임을 계속할 지를 물어 다음 게임을 진행하도록 하라. 단어사전은 words.txt 파 일을 이용하여라.(이 파일은 한 줄에 한 단 어씩 총 25143개 단어가 있다.) 0th 1st 2nd 3rd 4th 5th 6th 7th 8th 9th a AAA AAAS Aarhus Aaron AAU ABA Ababa aback abacus abalone abandon abase abash abate Abater words.txt

31 Cactus의 복수형

32 HangManGameApp String 객체는 변경이 불가!!!  StringBuffer import java.util.*;
import java.io.*; public class HangManGameApp { final int HIDDENCHAR = 2; // 숨기는 글자 개수 StringBuffer hiddenWord; // 숨긴 글자를 가진 단어 String newWord; // 게임을 위해 선정된 단어 Scanner scanner; // 키 입력 int failCount; // 틀린 횟수 public HangManGameApp() { scanner = new Scanner(System.in); } // 게임을 시작하는 메소드 public void run() { System.out.println("지금부터 행맨 개임을 시작합니다."); Words words = new Words("words.txt"); // 단어 선택하는 객체 생성 while(true) { newWord = words.getRandomWord(); // 랜덤한 단어 선택 if(newWord == null) break; // 단어 선택에 문제가 있는 경우 프로그램 종료 makeHidden(); // 2개의 글자를 숨긴 단어 만들기 go(); // 게임 진행 System.out.print("Next(y/n)?"); String answer = scanner.next(); if(answer.equals("n")) // n을 입력하면 종료 break; } String 객체는 변경이 불가!!!  StringBuffer

33 // 선택된 단어 newWord에 2 개의 글자를 숨긴 단어 hiddenWord를 만든다.
void makeHidden() { hiddenWord = new StringBuffer(newWord); Random r = new Random(); for(int k=0; k<HIDDENCHAR; k++) { int index = r.nextInt(newWord.length()); char c = newWord.charAt(index); for(int i=0; i<newWord.length(); i++) { if(hiddenWord.charAt(i) == c) hiddenWord.setCharAt(i,'-'); } } // 사용자 키를 입력받으면서 행맨 게임을 진행한다. 5 번 틀리면 종료한다. // 한 단어 진행 후 y/n 물음에 대해 n를 입력하면 종료한다. void go() { failCount=0; char key; do { if(failCount == 5) { System.out.println("5번 실패 하였습니다."); break; System.out.println(hiddenWord); System.out.print(">>"); String text = scanner.next(); key = text.charAt(0); }while(!complete(key)); System.out.println(newWord);

34 // 사용자가 입력한 문자 key가 숨긴 글자와 일치하는지 검사하고 일치하면 true를 리턴한다.
// 그리고 나서 hiddenWord의 '-'문자를 key 문자로 변경한다. boolean complete(char key) { boolean hit = false; for(int i=0; i<newWord.length(); i++) { if(hiddenWord.charAt(i) == '-' && newWord.charAt(i) == key) { hiddenWord.setCharAt(i, key); hit = true; } if(!hit) failCount++; if(hiddenWord.charAt(i) == '-') return false; return true; public static void main(String[] args) { HangManGameApp app = new HangManGameApp(); app.run();

35 // words.txt 파일을 읽고 파일에서 랜덤하게 단어를 추출하는 클래스
class Words { final int WORDMAX = 25143; // words.txt파일에 들어 있는 총 단어의 개수 private String fileName; // 단어 파일 이름. 현재는 words.txt private Random r = new Random(); // 난수 발생기 public Words(String fileName) { this.fileName = fileName; } public String getRandomWord() { // 파일을 읽기 위한 BufferedReader 객체를 생성한다. BufferedReader in = null; try { // 파일을 열고 파일을 읽기 위한 BufferedReader 객체 생성 in = new BufferedReader(new FileReader(fileName)); catch(FileNotFoundException e) { System.out.println("file not found error"); System.exit(0); int n = r.nextInt(WORDMAX)+1; // 랜덤한 라인 번호 생성. n 번째 단어를 게임에 사용 return readWord(in, n); // in 파일에서 n 번째 라인의 단어를 읽어서 리턴

36 비효율적임  개선의 여지가 있음 // in 파일에서 n 번째 라인의 단어를 읽어 리턴하는 메소드
private String readWord(BufferedReader in, int n) { String line=null; // 한 라인을 저장할 문자열 객체. 한 라인에는 하나의 단어만 있음 try { while (n>0) { line = in.readLine(); // 파일에서 한 라인(한 단어)를 읽는다. if(line == null) // eof를 만나면 문제 발생. 루프 종료 break; n--; } } catch (IOException e) { System.exit(0); return line; // n 번째 라인의 단어 리턴 비효율적임  개선의 여지가 있음

37 실습문제 10. HangManGameApp 게임의 난이도(숨겨진 문자 수)를 지정할 수 있게 수정할 것.
final int HIDDENCHAR = 2; // 숨기는 글자 개수  final 삭제, 초기값 삭제 run 메소드 내에서 HIDDENCHAR을 물어서 설정할 것. (1에서 5사이만 허용) HIDDENCHAR 값보다 짧거나 같은 길이 단어는 제외하고 게임 실행 Challenge 답안과 같이 하면  비효율적임! Word 클래스 생성자에서 파일의 모든 단어를 읽어와 String 배열에 넣을 것! while(true) { newWord = words.getRandomWord(); if(newWord == null) break; makeHidden(); go(); // 게임 진행 System.out.print("Next(y/n)?"); String answer = scanner.next(); if(answer.equals("n")) break; } while (true) { newWord = words.getRandomWord(); if (newWord.length() <= HIDDENCHAR) // 단어 길이가 난이도보다 작은 경우 다른 단어 선택 continue; else break; }

38 public String getRandomWord()
private String readWord(int n) __________// n 번째 라인의 단어 리턴 private String[] dic = new String[WORDMAX]; public Words(String fileName) {


Download ppt "명품 JAVA Programming."

Similar presentations


Ads by Google