Part 07 배열 Kwagma Ma (http://compiler.sagji.ac.kr, kkma@sagji.ac.kr) SagJi Uiversity Sprig 2011 1
이장의내용 p 배열선언과사용법 p 객체들의배열이해및사용 p 가변길이매개변수리스트 p 다차원배열 p 동적인배열 ArrayList p 이벤트구동 GUI 프로그램 2
7.1 배열 3
배열의사용 p 배열이필요한경우 대용량의데이터를처리하는프로그램을작성같은타입의값들을여러개저장해야하는경우예를들어학과학생들의점수, 회사근로자들의급여액 p 배열은같은타입의값들의리스트 각값들은배열원소 (array elemet) 각원소는인덱스 (idex) 가부여된다. 4
배열의원소 Key Poit 크기가 N인배열의인덱스는 0부터 N-1까지이다. p 배열의원소 scores[2] // 세번째원소, 하나의정수변수처럼사용될수있다 scores[2] = 89; scores[1] = scores[1] + 2; mea = (scores[0] + scores[1])/2; System.out.pritl (" 최저점 = " + scores[5]); 5
7.2 배열선언과사용 6
배열선언 p 배열선언 배열원소타입 [] 배열이름 ; it[] scores; scores = ew it[10]; Key Poit 배열도다른객체처럼 ew 연산자를이용해서반드시실체화되어야함 p 배열선언및초기화 배열원소타입 [] 배열이름 = ew 배열원소타입 [ 크기 ]; it[] scores = ew it[10]; 7
배열선언예 p it[] prices = ew it[100]; // it 배열선언및생성 p char[] grades; // char 배열선언 p grades = ew char[40]; // char 배열생성 p Strig[] members = ew Strig[10]; // Strig 배열선언및생성 p Studet[] studets; // Studet 배열선언 p studets = ew Studet[100]; // Studet 배열생성 8
배열의사용 p 경계검사 (boud checkig) 배열원소를참조할때마다 Java 인터프리터는그인덱스가유효범위 ( 경계 ) 내에있는지검사한다. Key Poit 배열인덱스가유효범위를벗어나면, 자동적으로 ArrayIdexOutOfBoudsExceptio이발생된다. p 예 : 인덱스 1 차이오류 (off-by-oe error) cout = 10; System.out.pritl(scores[cout]); 9
배열선언및초기화리스트 p 최기화리스트 배열을선언시배열초기화리스트를이용하면배열을초기화할수있다. 배열크기는초기화리스트안의값의개수에의해정해진다. 주의 : ew 연산자를사용하지않는다 it[] scores = {71, 80, 64, 92, 97, 88, 83, 71, 84, 81} 10
11
향상된 for 루프 p 배열 / 컬렉션내의각원소에대해서간단하게반복 (Java 1.5 이상 ) for ( 타입변수 : 배열 ) { 루프의본체 } p p 기존의 for 루프를이용하여재작성 for (it i = 0; i < 배열.legth; i++) { 타입변수 = 배열 [i]; 루프의본체 } 예 for (it score : scores) System.out.pritl (score); 12
매개변수로배열전달 p 배열전체를메소드에매개변수로전달할수있다. p 다른객체의경우와마찬가지로배열참조가전달되며, p 형식매개변수와실매개변수가서로별명 (alias) 이되어 p 호출된메소드안에서배열원소를변경하면실매개변수배열도변경된다. 13
14
15
명령줄인수 p 명령줄인수 (commad-lie argumets) 프로그램을실행시킬때명령줄에서실행프로그램이름뒤에쓰는정보들 프로그램에서처리할정보 ( 예를들어파일이름들 ) 를전달 이이름들은 mai 메소드에 Strig 배열형태로전달된다. public static void mai(strig[] args) 16
p > java Natios 대한민국미국일본 17
가변길이매개변수리스트 p p 호출할때마다처리할데이터개수가달라지는메소드를생각해보자예 : 정수매개변수들의평균을반환하는 average // 3개의값의평균계산을위한호출 mea1 = average(82, 79, 67); // 7개의값의평균계산을위한호출 mea2 = average(65, 49, 93, 88, 77, 56, 95); 18
가변길이매개변수리스트 (1) 중복정의 (overloadig) 를사용하여여러개의메소드를정의 단점 : 매개변수개수에대해별도의메소드정의가필요하다. (2) 정수배열을받아들이는메소드를정의한다. 단점 : 메소드호출전에매번배열을생성하고정수값들을배열에저장한후에매개변수로전달해야한다. (3) 가변길이매개변수리스트 (variable legth parameter list) 동일타입의임의의개수의매개변수를받는메소드정의 19
7.3 객체들의배열 20
객체들의배열 Key Poit Java는기본값들의배열뿐만아니라객체들의배열을제공한다. p 예 학생들의배열, 은행계좌들의배열, 이름들의배열등 p Strig[] cities = ew Strig[5]; 21
객체들의배열 : 예 Strig[] cities = {" 서울, 대전, 대구, 부산, 광주 }; 22
우균, 창병모 23
24
25
7.4 다차원배열 26
다차원배열 p 지금까지일차원배열 (oe-dimesioal array) p 다차원배열 (multi-dimesioal array) 제공 p 이차원배열 (two-dimesioal array) 행 (rows) 과열 (colums) 로이루어진배열 27
이차원배열 Key Poit 이차원배열은행과열로이루어진테이블로생각할수있다. p 이차원배열은행과열의크기로선언된다. it[][] table = ew it[10][5]; p 이배열의원소는두개의인덱스를사용하여참조할수있다. value = table[6][3]; p 이차원배열초기화리스트 it[][] table = {{1,0,0},{0,1,0}}; 28
이차원배열 표현타입설명 table it[][] 이차원정수배열참조 table[6] it[] 일차원정수배열참조 table[6][3] it 정수 29
이차원배열예 p 졸업작품평가 발표한팀은총 10 개팀 p 각팀의부문별점수를입력받아최고점수팀을선정 부문별점수 p (1) 이해도 (2) 기술성 (3) 편의성 (4) 보안성 (5) 발표력 it[][] table = ew it[10][5]; 각팀별총점저장 it[] sum = ew it[10]; 30
31
32
7.5 ArrayList 클래스 33
ArrayList p 배열의단점 크기가한번결정되면고정되어조정할수없다 p ArrayList 이러한단점을보완하기위한동적인자료구조 ArrayList에는객체 ( 정확히말하면객체에대한참조 ) 를저장할수있다. 원소를추가함에따라자동적으로크기가증가한다. Key Poit ArrayList는동적으로크기가변하는일종의배열이다. 34
ArrayList 메소드 메소드 설명 public ArrayList() 빈리스트를생성한다. public ArrayList(it iitial) 명시된최초용량을갖는리스트를생성한다. void add(object o) 끝에객체 o를원소로추가한다. void add(it idex, Object o) idex 위치에객체 o를원소로삽입한다. void remove(it idex) idex 위치의원소를제거한다. void remove(object o) 객체 o와일치하는첫번째원소를삭제한다. Object get(it idex) idex 위치의원소를리턴한다. it size( ) 원소개수를리턴한다. it idexof(object o) 객체 o와일치하는첫번째원소의인덱스리턴 35
PhoeBook 클래스재작성 p ArrayList 를이용하여 PhoeBook 클래스재작성 ArrayList 는크기가고정되어있지않음 phoebook = ew ArrayList( ); 크기는 ArrayList 가제공하는 size 메소드를이용가능 p PhoeBook 클래스의 add 메소드 Perso 객체를생성하고 ArrayList의 add 메소드를이용하여추가 phoebook.add(p); p PhoeBook 클래스의 lookup 메소드 ArrayList 의 get 메소드를이용하여 PhoeBook 내의 i- 번째 Perso 객체를가져온다. p = (Perso) PhoeBook.get(i); 36
37
38
Iterator p Iterator ArrayList 와관련하여리스트내의각원소에대해서반복할때사용 Java 컬렉션프레임워크 (Collectio Framework) 에정의된인터페이스 객체들의컬렉션이있을때여기에저장된원소들을편리하게하나씩꺼내쓰기위한인터페이스 p Iterator 인터페이스. public iterface Iterator { boolea hasnext(); // 다음원소가존재하면 true를리턴 Object ext(); // 메소드는다음원소를리턴 void remove(); // 마지막으로리턴된원소를제거 } 39
Iterator 예제 public static void mai(strig[] args) { ArrayList its = ew ArrayList(); for (it i = 0; i < 10; i++) its.add (ew Iteger(i)); Iterator it = its.iterator(); while(it.hasnext()) System.out.pritl((Iteger)it.ext()); } 40
lookup 메소드재작성 public Strig lookup(strig ame) { Perso p; Iterator it = phoebook.iterator(); while(it.hasnext()) { p = (Perso) it.ext(); if (p.getname().equals(ame)) retur p.getphoe(); } retur ull; } 41
정적변수 (static variable) p 클래스내에모든실체 ( 객체 ) 가공유해서사용하는멤버변수 p 객체가아니라클래스내에 static 변수를위한기억공간이생성됨. p 예 /** * 객체의개수를위해실체변수 o 사용 */ class Poit { private double x, y; it o = 0; /** * 객체의개수를위해정적변수 o 사용 */ class Poit { private double x, y; static it o = 0; } public Poit() { x = 0.0; y = 0.0; o++; } } public Poit() { x = 0.0; y = 0.0; o++; } 42
정적메소드 (static method) p 정적메소드는객체를생성하지않고클래스이름을이용하여호출 p 정적메소드는실체변수를사용할수없다. p 클래스내의일부혹은모든메소드를 static으로선언할수있다. p 대표적인정적메소드 public static void mai (Strig[] args) p Math 클래스내의모든메소드들은 static 으로선언되어있음. value = Math.cos(90) + Math.sqrt(2); 43
7.6 열거타입 44
열거타입 (eumerated type) p 모든가능한값 ( 식별자 ) 들을열거하여하나의타입정의 eum TrafficLight {GREEN, YELLOW, RED}; p 열거타입은다른타입과마찬가지로사용될수있다. TrafficLight c; c = TrafficLight.RED; System.out.pritl(c); // 색출력 p 열거타입은타입안전 (type-safe) 하다. 즉열거타입의값외에다른값을대입하거나사용할수없다. 45
열거타입의 values 메소드 p 정적메소드로열거타입의값들로이루어진배열을리턴한다. p 향상된 for 루프를이용하여모든값들처리 // 모든값들에대해서루프 for (TrafficLight c : TrafficLight.values()) { System.out.pritl(c); // GREEN, YELLOW, RED 출력 } 46
열거타입과 switch /** 빨강, 노랑, 녹색의원을 3개그린다. */ public void pait(graphics g) { it x = 50, y = 50; for (TrafficLight c : TrafficLight.values()) { switch (c) { case GREEN : g.setcolor(color.gree); g.filloval(x,y,40,40); case YELLOW : g.setcolor(color.yellow); g.filloval(x+50,y,40,40); case RED : g.setcolor(color.red); g.filloval(x+100,y,40,40); } } break; break; break; } 47
7.7 이벤트구동프로그램 48
이벤트구동 GUI 프로그램 p 이벤트구동 GUI 프로그램 (evet-drive GUI program) 의 3 요소 (1) 컴포넌트 (compoet) (2) 이벤트 (evet) (3) 리스너 (listeer) 49
컴포넌트 p 컴포넌트 (compoet) 화면요소 (scree elemet) 를나타내는객체레이블 (label), 버튼 (butto), 텍스트필드 (text field), 메뉴 (meu), 컨테이너 (cotaier) 등 p 컨테이너 (cotaiers) 특별한컴포넌트로서다른컴포넌트들을포함하고조직하는데사용프레임 (frame), 패널 (pael), 애플릿 (applet), 대화상자 (dialog box) 등 50
이벤트, 리스너 p 이벤트 (evet) 어떤사건혹은이벤트의발생을나타내며프로그램은대응하는액션을취할수있다. 마우스드래그 (drag), 마우스버튼클릭, GUI 버튼클릭, 키보드의키누름등 p 리스너 (listeer) 이벤트가일어나기를 기다리고있다 발생했을때대응한다. 이벤트에대응하기위한리스너를작성해야한다. 예 : GUI 버튼이눌려졌을때액션이벤트 (ActioEvet) 발생되며 해당리스너에서적절히대응한다. 51
GUI 예제 : Aswer.java p 5 장에서살펴본 GUI 프로그램 예 : Choose.java 에서는사용자가버튼을누르더라도아무반응없음 p 이벤트와이벤트리스너를이용 사용자가 YES 혹은 NO 버튼을누를때마다선택결과를보여준다 패널을위한클래스를별도로구성하여두개의클래스로작성한다. Aswer 클래스 p mai 메소드를포함하는클래스로프레임 (frame) 을생성하고 p 새로운패널 AswerPael 을생성하여이프레임에추가한후보여준다. AswerPael 클래스 p JPael 를상속하고생성자는 GUI 요소들을설정하고초기화한다. p p YES와 NO를나타내기위한두개의버튼과선택결과를표시하는레이블버튼과레이블과같은컴포넌트를포함하여조직하기위한패널사용 52
53
54
리스너작성 p 리스너인터페이스 각이벤트마다리스너인터페이스 (listeer iterface) 가정의되어있음 리스너가작성해야하는메소드목록이선언되어있음 예 : ActioListeer 인터페이스에는 actioperformed 메소드만선언되어있음 p 리스너작성 각이벤트를위한리스너인터페이스를구현하여작성할수있다. p ButtoListeer 클래스 ActioListeer 인터페이스를구현하여작성함 actioperformed 메소드구현함. 55
리스너 ButtoListeer 56
텍스트필드 p 텍스트필드 (TextField) 한줄의텍스트를입력혹은출력할수있는컴포넌트 한줄의텍스트가입력되었을때 ActioEvet 를발생시킨다. p 예제 Mile.java 텍스트필드를사용하여마일을킬로미터로변환하는프로그램 57
58
59
60
텍스트영역 (Text Area) 생성자및메소드 JTextArea(it rows, it cols) JTextArea(Strig s, it rows, it cols) 설명 rows행 cols열의크기를갖는텍스트영역을생성 rows행 cols 열의크기를갖는텍스트영역을생성하고스트링 s로초기화한다. settext(strig s) 이텍스트영역의텍스트를스트링 s 로설정한다. apped(strig s) 이텍스트영역의텍스트를스트링 s 를첨부한다. setfot (Fot f) 현재의폰트를설정한다. isert(strig s, it pos) 이텍스트영역의 pos 위치에스트링 s 를삽입 gettext() 이텍스트영역의텍스트를리턴한다. getliecout() 이텍스트영역의줄수를리턴한다. 61
62
63
Key Poit 64
Key Poit p 크기가 N 인배열의인덱스는 0 부터 N-1 까지이다. p p p 배열도다른객체처럼 ew 연산자를이용해서반드시실체화되어야한다. 배열인덱스가유효범위를벗어나면, 자동적으로 ArrayIdexOutOfBoudsExceptio 이발생된다. 가변길이매개변수리스트는동일타입의임의의개수의매개변수를받는다. p Java 는기본값들의배열뿐만아니라객체들의배열을제공한다. p 이차원배열은행과열로이루어진테이블로생각할수있다. p ArrayList 는동적으로크기가변하는일종의배열이다. 65
프로그래밍실습 66
프로그래밍실습 1 1. 점수분포 학생들의점수를입력받아다음과같이그점수대별로분포를출력하는프로그램을작성하시오. 점수는 0 부터 100 까지이며점수대는 10 점단위로구분한다. 별표의수는입력된점수중에각점수대에해당하는점수의개수를나타낸다. [ 0 ~ 10]:*** [11 ~ 20]:******** [21 ~ 30]:*********** [31 ~ 40]:************** [41 ~ 50]:****************** [51 ~ 60]:**************** [61 ~ 70]:*********** [71 ~ 80]:******** [81 ~ 90]:***** [91 ~ 100]:* 67
프로그래밍실습 2 2. 환전 원화를달러화로혹은달러화를원화로환전하는 GUI 프로그램을작성하시오. 환율, 달러화, 원화입력을위한 3 개의텍스트필드를사용하시오. 달러화를입력하고리턴하면환율에따라계산된원화를표시하고원화를입력하고리턴하면환율에따라계산된달러화를표시하시오. 68
프로그래밍실습 3 3. 서울지하철 스크롤페인을이용하여서울지하철노선도를보여주는 GUI 프로그램을작성하시오. 서울지하철노선도의파일이름이 seoul.jpg 이라면다음과같이이미지아이콘을만들고이를이용하여레이블을만들어스크롤페인에보여줄수있다. ImageIco image = ew ImageIco("seoul.jpg"); 69