Chapter 15 실전 프로젝트 01 친구 연락처 관리 프로그램 02 사진 처리 프로그램 예제 모음 요약 연습문제
지금까지 내용을 종합하여 2개의 프로젝트 수행하기
Section 01 친구 연락처 관리 프로그램(1) 프로그램의 개요 연락처를 파일에 저장, 필요할 때마다 꺼내서 보거나 삭제하는 연락처 관리 프로그램
Section 01 친구 연락처 관리 프로그램(2) 프로그램 구현 방법 친구의 연락처는 파일에 저장, 프로그램 종료해도 기록 남게 함 파일 처리 위해 FileReader, FileWriter, BufferedReader, BufferedWriter 클래스 사용. 연락처 출력, 입력, 삭제 기능은 별도의 메소드로 작성, 네 가지 중 하나 선택 메뉴 화면도 별도의 메소드로 작성. main( ) 메소드에서는 while 문을 사용 사용자가 종료 할 때까지 반복하는 기능 넣음 사용자의 입력에 따라 별도의 메소드 각각 호출. while 문, switch~case 문 사용.
Section 01 친구 연락처 관리 프로그램(3)
Section 01 친구 연락처 관리 프로그램(4) 프로그램 코딩 선언부 : 본격적인 메소드 프로그래밍 전, 전체 프로그램에서 필요한 클래스, 메소드 준비
Section 01 친구 연락처 관리 프로그램(5)
Section 01 친구 연락처 관리 프로그램(6) ❶ 1~31행 HandPhone 클래스 전체 범위로, 소스코드는 HandPhone.java가 되고 컴파일 결과는 HandPhone.class가 됨. ❷ 2행 사용자가 입력한 정보를 ‘c:\temp\juso.txt’ 파일에 저장하기 위해 파일명을 변수에 고정. ❸ 4~14행 연락처 클래스를 정의. 연락처는 이름, 나이, 전화번호로 구성, 필요시 주소, 이메일 등 추가 나이(age)를 문자열로 한 이유는, 단지 기록을 위한 것일 뿐 숫자로 다루는 과정이 없기 때문. ❹ 16, 17행 메인 메소드 구현. ❺ 19~29행 프로그램에서 사용될 4개의 메소드 준비. print_menu( ) 메소드는 초기의 메뉴 화면 출력, view_ juso( ) 메소드는 현재 저장된 c:\temp\juso.txt 파일에서 연락처 읽어 화면 출력. 또한 add_ juso( ) 메소드는 새로 입력하는 연락처를 c:\temp\juso.txt 파일에 저장, delete_ juso( ) 메소드는 사용자가 선택한 연락처를 파일에서 삭제.
Section 01 친구 연락처 관리 프로그램(7) main 메소드 : 사용자의 선택에 따라 해당 기능을 하는 각각의 메소드 호출
Section 01 친구 연락처 관리 프로그램(8)
Section 01 친구 연락처 관리 프로그램(9) ❶ 3행 사용자가 선택하는 번호 저장 위해 select 변수를 선언, 초깃값으로 “4”(종료)가 아닌 아무 값이나 넣음. 여기서는 “ ”를 넣었음. ❷ 6행 사용자가 입력한 값이 “4”가 아닌 동안에는 계속 반복. ❸ 7, 8행 7행에서는 사용자에게 보여줄 메뉴 출력, 8행에서는 사용자로부터 1~4의 입력 값 받음. ❹ 10~24행 사용자가 입력한 값에 따라 각각 다른 기능 하는 메소드 호출. 사용자가 4를 입력하면 21행의 return 문에 의해 프로그램 종료. 또한 사용자가 1~4 이외의 값을 입력하면 23행의 오류 메시지 출력 다시 6행으로 가서 처음부터 반복.
Section 01 친구 연락처 관리 프로그램(10) 초기 메뉴 출력 : 사용자가 무엇을 입력해야 할지 설명해주는 메뉴 출력 3~7행에서 사용자가 선택할 수 있는 메뉴를 화면에 도움말로 출력. 사용자는 이 메뉴 화면을 보고 원하는 기능 선택
Section 01 친구 연락처 관리 프로그램(11) 연락처 출력 : 사용자가 1번을 선택하면 연락처 파일에 입력된 내용 읽어와 출력
Section 01 친구 연락처 관리 프로그램(12)
Section 01 친구 연락처 관리 프로그램(13) ❶ 2행 파일 관련 예외 처리 위해 throws IOException 추가. ❷ 6~10행 6행에서 juso.txt 파일에 접근. 이 프로그램 처음 실행한다면 아직 juso.txt 파일 없으므로 8, 9행에서 비어 있는 파일 생성. 즉 쓰기용으로 잠깐 열었다가 닫으면 빈 파일 생성. ❸ 12, 29행 juso.txt 파일을 읽기용으로 열고 닫음. ❹ 16~24행 for 문에는 초깃값과 증가 값만 있을 뿐 조건식이 없으므로 무한 루프. 18행에서 파일의 끝 만나면(파일을 읽을 준비가 되지 않았으면) 무한 루프를 빠져나옴. 22행에서 연락처의 순번(i)과 내용 함께 출력. 이때 juso.txt 파일에 저장된 내용 하나도 없다면 i 값이 1인 상태로 for 문 빠져나옴. ❺ 26, 27행 i 값이 1이면 27행에서 전화번호가 하나도 없다는 메시지 출력. 이 내용은 없어도 되지만 사용자의 편의 위해 추가
Section 01 친구 연락처 관리 프로그램(14) 연락처 추가 : 사용자가 2번 선택하면 연락처 추가로 등록 가능
Section 01 친구 연락처 관리 프로그램(15)
Section 01 친구 연락처 관리 프로그램(16) ❶ 4행 주소를 입력받기 위한 adr 인스턴스 변수를 선언하고 모두 공백으로 초기화. ❷ 9행 추가(Append) 모드로 juso.txt 파일 열기. FileWriter(파일명, true) 형식으로 파일 열기. ❸ 11~16행 연락처 등록 위해 우선 인스턴스 변수(4행에서 선언)에 이름, 나이, 전화번호 각각 입력. ❹ 19행 입력된 값들을 모두 한 줄의 문자열(wstr)로 만듬. ❺ 21, 22행 wstr을 파일에 쓰고 한 행 넘김.
Section 01 친구 연락처 관리 프로그램(17) 연락처 삭제 사용자가 3번을 선택하면 기존의 연락처 삭제. 연락처를 삭제하기 위해 기존의 연락처를 juso.txt 파일에서 문자열 배열에 읽어오되 삭제를 지정한 행은 빼놓고 읽어오는 방법 사용. 그리고 새로 읽어들인 문자열 배열의 내용을 다시 juso.txt 파일에 쓰면 사용자가 지정한 행이 삭제되는 효과 나타남.
Section 01 친구 연락처 관리 프로그램(18)
Section 01 친구 연락처 관리 프로그램(19)
Section 01 친구 연락처 관리 프로그램(20) ❶ 5행 juso.txt 파일의 내용을 전부 읽어오기 위해 50행의 배열 선언. 이때 사용자의 최대 연락처 개수가 50개라고 가정. ❷ 12~15행 처음 프로그램을 실행하면 juso.txt 파일이 아직 존재하지 않음. 그런 상태에서 3번을 입력하여 연락처 삭제하면 삭제할 내용이 없어 파일이 없다는 메시지 출력하고 메소드 빠져나감. ❸ 17, 18행 사용자가 삭제하는 행의 번호를 del_line 변수에 입력.
Section 01 친구 연락처 관리 프로그램(21) ❹ 20~31행 반복해서(최대 50번) juso.txt 파일의 내용을 read_str 변수에 저장. 파일의 끝인 경우 readLine( )이 null을 반환하므로 for 문 빠져나옴. 22행에서 한 줄을 읽어 str 변수에 저장한 다음, 25행에서 읽어온 행(i가 0부터 시작하므로 i+1번째 행)이 사용자가 지정한 행(del_line)이 아니라면 read_str 배열에 정상적으로 저장, 만약 사용자가 지정한 행이라면 read_str 배열에 저장 않고 30행에서 행이 삭제되었다는 메시지만 출력. 또한 28행에서는 read_str 배열에 몇 개를 읽어왔는지 개수를 센다. 그리고 33행에서 읽기용으로 연 파일을 닫는다. 이렇게 되면 현재 read_str 배열에는 사용자가 입력한 행을 제외한 juso.txt의 모든 내용이 저장된 상태. ❺ 36행 다시 juso.txt를 쓰기용으로 열면 파일의 기존 내용 모두 사라짐. ❻ 38~41행 읽어들인 내용(read_str 배열)을 읽은 개수(count)만큼 juso.txt에 새로 기록. 그러면 사용자가 지정한 행을 제외한 내용이 juso.txt 파일에 새로 기록되므로 사용자가 지정한 행이 삭제되는 효과 나타남.
Section 01 친구 연락처 관리 프로그램(22) 전체 소스
Section 01 친구 연락처 관리 프로그램(23)
Section 01 친구 연락처 관리 프로그램(24)
Section 01 친구 연락처 관리 프로그램(25)
Section 01 친구 연락처 관리 프로그램(26)
Section 01 친구 연락처 관리 프로그램(27)
Section 01 친구 연락처 관리 프로그램(28)
Section 01 친구 연락처 관리 프로그램(29)
Section 01 친구 연락처 관리 프로그램(30)
Section 02 사진 처리 프로그램(1) 프로그램의 개요 주어진 사진 파일의 이미지 반전, 사진의 모양을 거울과 같이 반전시키는 기능 구현한 간단한 이미지 처리 프로그램. 또한 원본 사진과 처리 결과 사진을 화면에 출력 이 프로그램의 제약 사항 기존에 잘 알려진 이미지 파일이 아닌 간단한 8bit(1byte) 그레이(Gray) 이미지로, 5123512 픽셀 크기의 raw 파일만 처리. 프로그램에서 처리할 원본 사진 파일은 ‘c:\temp\prince.raw’로 고정, 변환이 완료되고 사용자가 저 장한 사진 파일의 이름은 ‘result.raw’로 고정. 일반적으로 이미지 파일은 jpg, png, bmp, gif 등의 확장자 사용. 이러한 이미지 파일은 구조가 복잡하여 코드에서 별도의 라이브러리 없이 사용하기 어려움. JAVA 코드에서 직접 조작하기 쉽도록 가장 단순한 사진 파일 포맷인 raw 파일 사용. 여기서 사용할 사진 파일인 *.raw는 5123512 픽셀 크기의 그레이 이미지. raw 파일은 가장 단순한 형식의 이미지 파일로, 별도의 헤더 정보 없이 각 픽셀이 바로 영상 값을 갖는 파일을 말함. raw 파일을 포토샵(또는 페인트샵)에서 읽으려면 사용자가 raw 파일의 픽셀 크 기를 미리 알고 있어야 함.
Section 02 사진 처리 프로그램(2) 이 프로그램의 실행 화면 [그림 15-3]. GUI를 적극 활용 완전한 윈도 응용 프로그램으로 메뉴도 작성해서 사용. 메뉴에 나와 있듯이 각 메뉴 선택하면 prince. raw 파일에 이미지 처리 진행되고, 결과의 저장 및 프로그램의 종료도 이루어짐. 처리한 결과는 c:\temp\result.raw 파일로 생성.
Section 02 사진 처리 프로그램(3)
Section 02 사진 처리 프로그램(4) 프로그램 구현 방법 이 프로그램에서 사용하는 prince.raw 파일의 구조 5123512의 이미지 파일에서 각각의 점(픽셀)은 0~255의 값 갖음. 0에 가까울수록 검은색에 가까운 회색이 되고, 255에 가까울수록 흰색에 가까운 회색이 됨.
Section 02 사진 처리 프로그램(5) 이 사진 파일을 네 가지 형태로 변환. 각각의 처리 방식을 메소드와 함께 살펴보자. 또한 사진 파일 처리 위해 사진 파일과 크기가 동일한 배열을 2개 선언. 프로그램을 통해 사진 파일을 처리하는 과정은 [그림 15-6]과 같다. [그림 15-6]을 잘 이해하면 프로그래밍이 그리 어렵지 않다. 먼저 loadImage( ) 메소드가 원본 사진 파일인 prince.raw를 5123512 메모리인 inImage 배열에 불러들인다. 그리고 그림에는 표현되지 않았지만 사용자가 처리할 방법을 [그림 15-3]과 같이 메뉴에서 선택. 선택한 메뉴에 따라영상 처리 메소드인 equal( ), negative( ), mirror1( ), mirror2( )가 작동. 각 메소드의 기능 equal( ) : inImage 배열의 내용을 동일하게 outImage에 넣음. negative( ) : inImage 배열의 값을 ‘255-원래 값’으로 만듬. 그러면 색상 반전. mirror1( ) : inImage 배열의 위치가 좌우 대칭이 되도록 outImage에 넣음. mirror2( ) : inImage 배열의 위치가 상하 대칭이 되도록 outImage에 넣음.
Section 02 사진 처리 프로그램(6) 메소드가 처리되면서 displayImage( )도 함께 실행되도록 함으로써 outImage 배열의 내용 화면에 출력하여 사용자가 눈으로 확인. 마지막으로 사용자가 메뉴의 [저장]을 선택하면 결과가 result.raw 파일로 저장되도록 처리
Section 02 사진 처리 프로그램(7) 프로그램 코딩 : 전체 틀 작성 이미지 배열을 선언하고 사진 파일을 배열에 불러오기 : loadImage() 본격적인 프로그래밍 전에 전체 프로그램에서 사용할 변수나 메소드 선언
Section 02 사진 처리 프로그램(8)
Section 02 사진 처리 프로그램(9) ❶ 2, 3행 입력과 출력 배열을 원본 사진과 동일한 512×512 크기로 설정. 각 이미지의 픽셀은 0~255의 값을 가지므로 데이터 형식을 int로 지정(short로 해도 됨). ❷ 5행 윈도 창을 출력할 컨테이너 변수 준비. ❸ 7~11행 메인 함수로 이미지 파일을 메모리로 불러오고 Photo( ) 생성자 실행. ❹ 13~31행 이미지 파일을 메모리로 불러옴. 18행에서 파일을 ‘c:\temp\prince.raw’로 고정. 24, 25행에서 이미지의 크기인 512×512번 반복하여 inImage 메모리로 파일 내용 불러옴. ❺ 33, 34행 생성자 메소드. 자세한 내용은 잠시 후에 살펴본다
Section 02 사진 처리 프로그램(10) 윈도 창 생성 및 이미지의 화면 출력
Section 02 사진 처리 프로그램(11)
Section 02 사진 처리 프로그램(12) ❶ 2~20행 생성자에서 메뉴 추가하고 윈도 창에 패널 부착. 3행에서는 윈도 창의 타이틀 표시, 4행에서 종료 버튼 누르면 프로그램 종료 위해 추가. 12행에서 DrawImage 타입의 panel 인스턴스 생성, 13행에서 윈도 창에 패널 부착. DrawImage 클래스는 23~36행에서 정의했는데 outImage의 내용을 화면에 출력하는 기능함. 16행에서 윈도 창의 위아래 틀, 메뉴나 제목의 크기까지 고려 크기 설정하고, 17행에서 화면에 나타나게 함. 19행에서는 윈도 창을 새로 고침하여 다시 화면에 출력 효과.
Section 02 사진 처리 프로그램(13) ❷ 23~36행 outImage 배열의 내용 화면 출력. 26행에서 R, G, B 변수 준비, 28~34행 에서 outImage의 픽셀 하나하나를 화면에 반복 출력. setColor( )는 화면에 출력 할 색상 설정, drawRect( )는 화면에 픽셀 출력 기능. 30행에서 R, G, B를 모두 같은 값으로 하면 그레이 색상 됨. ❸ 38~41행 outImage의 내용이 변경될 때마다 이 메소드 호출하여 화면에 변경된 내용 출력. ❹ 43~45행 사진을 처리할 메뉴 및 메뉴 선택할 때 발생하는 이벤트를 처리할 리스너 만듬
Section 02 사진 처리 프로그램(14)
Section 02 사진 처리 프로그램(15) 메뉴 생성 및 이벤트 리스너 추가 : 메뉴 추가, 메뉴 선택시 실행할 이벤트 리스너 생성
Section 02 사진 처리 프로그램(16)
Section 02 사진 처리 프로그램(17)
Section 02 사진 처리 프로그램(18) ❶ 1~62행 메뉴 추가하고, 각 메뉴를 선택했을 때 실행할 리스너 생성. ❷ 2~20행 2~5행에서는 ‘사진 처리’라는 상위 메뉴 만들고, 7~20행에서는 6개의 메뉴 준비. 14~20행에서는 6개의 메뉴를 상위 메뉴인 ‘사진 처리’ 메뉴에 부착. ❸ 23~61행 각 메뉴를 선택했을 때 처리할 리스너 각각 준비. 23~27행은 ‘동일한 사진’ 메뉴를 선택하면 처리되는 이벤트 리스너. 나머지도 같은 개념으로 반복. ❹ 64~77행 실제 사진을 처리할 메소드를 미리 준비.
Section 02 사진 처리 프로그램(19)
Section 02 사진 처리 프로그램(20) 프로그램 코딩 : 영상 처리 핵심 알고리즘 구현 영상 처리(이미지를 동일하게 처리) : equal() 입력 사진 배열(inImage)과 출력 사진 배열(outImage)를 동일하게 처리 [그림 15-9]는 5×5 픽셀이므로 5×5=25번을 반복. 여기서 처리할 prince.raw 이미지는 512×512 픽셀이므로 코드에서는 512×512=262144번을 반복
Section 02 사진 처리 프로그램(21) ❶ 3~5행 512×512번 반복하여 모든 픽셀 하나씩 처리. 5행에서 outImage에 inImage의 동일한 값 대입. 결국 inImage와 outImage는 [그림 15-9]와 동일. ❷ 7행 변경된 outImage를 다시 화면에 출력
Section 02 사진 처리 프로그램(22) 영상 처리(이미지의 반전 처리) : negative() 사진을 반전시키려면 이미지 값(0~255)을 거꾸로(255~0) 만든다. 즉 다음과 같이 값 바꿈 이를 구현하는 공식은 ‘반전된 색상=255-기존 색상’이다. 예를 들어 기존 값이 10이면 255- 10=245이므로 반전된 색상은 245
Section 02 사진 처리 프로그램(23) 그레이 이미지를 반전시키기 위해 5행에서 픽셀 값을 ‘255-원본 색상 값’으로 처리
Section 02 사진 처리 프로그램(24) 영상 처리(이미지를 좌우 대칭 처리) : mirror1() [그림 15-11]을 보면 0행 0열의 위치가 0행 4열로 변환. 그러므로 행은 원래의 행과 동일하고 열만 ‘전체 크기-1-현재 열’로 계산
Section 02 사진 처리 프로그램(25) 이미지를 좌우 대칭으로 변경하기 위해 5행에서 행(i)에 대한 것은 그대로 두고 열(k)에 대한 것을 ‘전체 크기-1-현재 열’의 위치로 이동. 이 이미지의 열 크기가 512이므로 변환될 outImage의 k 값은 원본 이미지 inImage의 ‘512-1-k’ 사용
Section 02 사진 처리 프로그램(26) 영상 처리(이미지를 상하 대칭 처리) : mirror2() [그림 15-12]를 보면 0행 0열의 위치가 4행 0열로 변환되었다. 그러므로 행은 ‘전체 크기-1-현재 행’으로 계산하고 열은 그대로 두면 된다
Section 02 사진 처리 프로그램(27) 이미지를 상하 대칭으로 변경하기 위해 5행에서 열(k)에 대한 것은 그대로 두고 행(i)에 대한 것을 ‘전체 크기-1-현재 행’의 위치로 이동. 이 이미지의 행 크기가 512이므로 변환될 outImage의 i 값은 원본 이미지 inImage의 ‘512-1-I’ 사용
Section 02 사진 처리 프로그램(28) 처리 결과 이미지 저장 : saveImage() [그림 15-6]을 보면 saveImage( ) 메소드는 출력 배열인 outImage의 내용을 파일에 저장
Section 02 사진 처리 프로그램(29)
Section 02 사진 처리 프로그램(30) ❶ 4행 저장되는 파일을 ‘c:\temp\result.raw’로 고정. ❷ 5~8행 저장할 파일의 스트림을 준비. ❸ 14~19행 메모리의 내용을 512×512번 파일에 쓴다. 결국 메모리의 내용이 모두 파일로 저장. ❹ 20, 21행 파일을 닫고 파일이 저장되었다는 메시지 출력
Section 02 사진 처리 프로그램(31) 전체소스
Section 02 사진 처리 프로그램(32)
Section 02 사진 처리 프로그램(33)
Section 02 사진 처리 프로그램(34)
Section 02 사진 처리 프로그램(35)
Section 02 사진 처리 프로그램(36)
Section 02 사진 처리 프로그램(37)
Section 02 사진 처리 프로그램(38)
Section 02 사진 처리 프로그램(39)
Section 02 사진 처리 프로그램(40)
Section 02 사진 처리 프로그램(41)
Section 02 사진 처리 프로그램(42)