6. 자바라이브러리 학습목표 진짜닷컴게임을만듭니다. ArrayList 에대해알아봅니다. 자바 API 를활용하는방법에대해알아봅니다.
자바 API를알아봅시다 정말인가? 우리가직접만들지않아도되는건가?
SimpleDotComGame의버그 정상적인실행결과 버그가나는경우 %java SimpleDotComGame enter a number 1 miss enter a number 2 miss enter a number 3 miss enter a number 4 hit enter a number 5 hit enter a number 6 kill 6 guesses %java SimpleDotComGame enter a number 2 hit enter a number 2 hit enter a number 2 kill 3 guesses 일단어떤숫자를한번맞추고나면그숫자를두번더입력하기만하면게임이끝납니다.
문제의원인 public String checkyourself(string stringguess) { int guess = Integer.parseInt(stringGuess); String result = "miss"; for (int i = 0; i < locationcells.length; i++) { if (guess == locationcells[i]) { result = hit ; numofhits++; break; } } if (numofhits == locationcells.length) { result = kill ; } System.out.println(result); return result; }
어떻게고쳐야할까요? 0 1 2 3 4 5 6 4 5 6 DotCom 의셀위치를저장하기위한배열인스턴스변수. 이닷컴에는 4, 5, 6 이라는세값이들어있고사용자는이세개의숫자를맞춰야합니다. 0 1 2 locationcells (DotCom 의인스턴스변수 )
고치는방법 첫번째옵션 배열을하나더만들고사용자가위치를맞출때마다그맞춘위치를두번째배열에집어넣습니다. 사용자가위치를입력할때마다그배열을확인하여그셀을이미맞췄는지확인합니다. false false true 0 1 2 hitcells (DotCom 의인스턴스변수 ) 단점 : 작업이복잡해집니다.
고치는방법 두번째옵션 원래배열을그냥사용하면서맞춘셀의값은 -1로바꿉니다. 4 5-1 0 1 2 locationcells (DotCom 의인스턴스변수 ) 장점 : 배열을추가할필요가없습니다. 단점 : 여전히지저분합니다.
고치는방법 세번째옵션 맞출때마다각셀위치를삭제하고배열을작게줄입니다. 하지만배열의크기를바꿀수는없기때문에매번새로운배열을만들고이전배열에남아있는셀을복사하고새로만든작은배열로옮겨야합니다. 4 5 6 4 6 0 1 2 locationcells 아무셀도맞추지않은상태 0 1 locationcells 1 번인덱스에들어있는 5 를맞춘상태 장점 : 아주이상적인해결책입니다. 단점 : 배열의크기를바꿀수있어야깔끔합니다.
checkyourself 준비코드 메소드 : String checkyourself(string userguess) 사용자가추측한위치를 String 매개변수로받아옴사용자가추측한위치를 int로변환 int 배열의각셀에대해다음작업반복 // 사용자가추측한위치를셀과비교만약사용자가추측한것이맞으면맞춘개수증가 // 마지막위치인지확인만약맞춘회수가 3이면 kill을리턴그렇지않으면 hit 리턴만약부분끝그렇지않으면 miss 리턴만약부분끝반복부분끝메소드끝 메소드 : String checkyourself(string userguess) 사용자가추측한위치를 String 매개변수로받아옴사용자가추측한위치를 int로변환남아있는각위치셀에대해다음작업반복 // 사용자가추측한위치를셀과비교만약사용자가추측한것이맞으면그셀을배열에서제거 // 마지막위치인지확인만약배열이비어있으면 kill을리턴그렇지않으면 hit 리턴만약부분끝그렇지않으면 miss 리턴만약부분끝반복부분끝메소드끝
라이브러리 자바에는미리만들어진클래스가엄청나게많이있습니다. 이렇게미리만들어져있는클래스는이책에나오는인스턴트코드랑비슷하다고보면되는데모두미리컴파일이된상태로제공됩니다. 라이브러리에들어있는클래스는필요에맞게잘찾아서쓰기만하면됩니다.
ArrayList add(object o) 객체매개변수 (o) 를목록에추가 remove(int index) index 매개변수로지정한위치에있는객체를제거 remove(object elem) 주어진객체가 ArrayList 에들어있으면제거 contains(object elem) 객체매개변수 elem 에매치되는것이있으면 true 리턴 isempty() 목록에아무원소도없으면 true 리턴 indexof(object elem) 객체매개변수 (elem) 의인덱스또는 -1 을리턴 size() 현재목록에들어있는원소의개수리턴 get(int index) 주어진 index 매개변수위치에있는객체를리턴
ArrayList로할수있는것 1. 새로만듭니다. ArrayList<Egg> mylist = new ArrayList<Egg>(); 2. 뭔가를집어넣습니다. Egg s = new Egg(); mylist.add(s); 3. 다른것을또집어넣습니다. Egg b = new Egg(); mylist.add(b);
ArrayList로할수있는것 4. 몇개가들어가있는지알아냅니다. int thesize = mylist.size(); 5. 어떤것이안에들어있는지찾아냅니다. boolean isin = mylist.contains(s); 6. 어떤것의위치 ( 인덱스 ) 를찾아냅니다. int idx = mylist.indexof(b); 7. 비어있는지확인합니다. boolean empty = mylist.isempty(); 8. 목록에들어있는것을제거합니다. mylist.remove(s);
바보같은질문은없습니다 ArrayList 가참좋은건알겠는데, 그런게있다는것을어떻게알아내죠? 그런걸알아내는능력이자바프로그래머로성공하는데있어서가장중요한것가운데하나라고할수있습니다. 필요한것을찾아내서적용할수있어야만하지요. 귀찮고자질구레한부분은남들이만들어놓은것을잘활용하고자신의아이디어만구현하는 게으름의미덕 을충분히활용할수있어야합니다.
바보같은질문은없습니다 ArrayList 라는것이필요하다는것은어떻게알아내죠? API 를어떻게활용할지를알아내는방법이궁금합니다. 이강의가끝날무렵에는자바라는언어에대해서는잘알수있을것입니다. 중요한것은어떤문제를어떻게해결할지, 그리고어떻게하면최소한의코드만으로해결할수있는가하는것입니다. 잠시후에이와관련된이야기가나올것입니다. 조금만기다려주세요.
ArrayList와일반배열 ArrayList 일반배열 ArrayList<String> mylist = new ArrayList<String>(); String[] mylist = new String[2]; String a = new String( whoohoo ); String a = new String( whoohoo ); mylist.add(a); mylist[0] = a; String b = new String( Frog ); String b = new String( Frog ); mylist.add(b); mylist[1] = b; int thesize = mylist.size(); int thesize = mylist.length;
ArrayList와일반배열 ArrayList 일반배열 Object o = mylist.get(1); String o = mylist[1]; mylist.remove(1); mylist[1] = null; boolean isin = false; boolean isin = mylist.contains(b); for (int i = 0; i < mylist.length; i++) { if (b.equals(mylist[i])) { isin = true; break; } }
ArrayList와일반배열 1. 일반배열은만들어질때부터유형과크기가정해집니다. 하지만 ArrayList 에서는 ArrayList 유형의객체만만들면됩니다. 객체를추가하거나제거할때마다저절로커지거나작아지기때문에따로크기를지정할필요가없습니다.
ArrayList와일반배열 2. 객체를일반배열에집어넣을때는위치를지정해야합니다. 인덱스가배열의끝을넘어가면큰문제가생길수있습니다. 하지만 ArrayList 를쓸때는 add(someobject) 같은식으로객체를추가하기만하면새로추가된객체가들어갈자리를알아서만들어줍니다.
ArrayList와일반배열 3. 배열에서는다른어떤자바객체에서도쓰지않는문법을사용합니다. 배열에서는 mylist[1] 과같은특별한문법을쓰지만 ArrayList 는일반자바객체이므로그러한특별한문법을익히지않아도됩니다.
ArrayList와일반배열 4. 자바 5.0 에는 ArrayList 가매개변수화되어있습니다. 자바 5.0 에서는 ArrayList 에매개변수화된유형 (parametrized type) 이라는특별한기능이추가되었습니다. ArrayList<String> 에서 String 은유형매개변수입니다. 특정유형의객체들만저장할수있는컬렉션을만들수있습니다.
DotCom을고칩시다. public class DotCom { int[] locationcells; int numofhits = 0; public void setlocationcells(int[] locs) { locationcells = locs; } } public String checkyourself(string stringguess) { int guess = Integer.parseInt(stringGuess); String result = "miss"; for (int cell : locationcells) { if (guess == cell) { result = hit ; numofhits++; break; } } if (numofhits == locationcells.length) { result = kill ; } System.out.println(result); return result; }
새로고친 DotCom 클래스 import java.util.arraylist; public class DotCom { private ArrayList<String> locationcells; // private int numofhits; public void setlocationcells(arraylist<string> loc) { locationcells = loc; } } public String checkyourself(string userinput) { String result = miss ; int index = locationcells.indexof(userinput); if (index >= 0) { locationcells.remove(index); if (locationcells.isempty()) { result = kill ; } else { result = hit ; } } return result; } 직접한번실행시켜봅시다.
Go2.com RUNNING HEADER, 14 PT., ALL CAPS, Line Spacing=1 line 진짜닷컴가라앉히기게임 A B C D E F G 0 1 Pets.com AskMe.com 2 3 4 5 6 %java DotComBust Enter a guess A3 miss Enter a guess B2 miss Enter a guess C4 miss Enter a guess D2 hit Enter a guess D3 hit Enter a guess A3 Ouch! You sunk Pets.com :( kill Enter a guess B4 miss Enter a guess G3 hit Enter a guess G4 hit Enter a guess G5 Ouch! You sunk AskMe.com :(
고쳐야할부분 DotCom 클래스 ( 닷컴클래스 ) name 변수추가 닷컴의이름을저장하기위한변수. 닷컴이죽었을때그이름을출력합니다. DotComBust 클래스 ( 게임클래스 ) DotCom 객체세개만들기 세닷컴을 7x7 그리드에배치 세닷컴에대해사용자가추측한위치확인 모든닷컴이가라앉을때까지게임진행 main 메소드종료
필요한클래스와객체 DotComBust 게임클래스 DotCom 을만들고사용자의입력을받아들이고모든닷컴이죽을때까지계속진행 DotComBust 실제 DotCom 객체 닷컴명, 위치, 사용자가추측한위치가맞는지확인하는방법등을제공 DotComBust 보조클래스 사용자가명령행에입력한것을받아오는방법, DotCom 의위치를만들어내는방법등을제공 DotComBust DotCom GameHelper
DotComBust 객체에서일어나는일 1 DotComBust 게임클래스 DotComBust 객체 2 DotComBust 객체 GameHelper 객체 3 GameHelper 객체 DotComBust 객체 ArrayList 객체
DotComBust 객체에서일어나는일 4 GameHelper 객체 DotComBust 객체 ArrayList 객체 DotCom 객체 5 GameHelper 객체 DotComBust 객체 DotCom 객체 ArrayList 객체 ArrayList 객체
DotComBust 객체에서일어나는일 6 GameHelper 객체 DotComBust 객체 DotCom 객체 ArrayList 객체 ArrayList 객체
DotComBust 준비코드 DotComBust GameHelper helper ArrayList dotcomslist int numofguesses setupgame() startplaying() checkuserguess() finishgame() GameHelper 인스턴스를만들고 helper라는인스턴스변수선언 DotCom 목록세개를저장하기위한 dotcomslist라는 ArrayList 선언추측회수를저장하기위한 numofguesses라는 int 선언, 0으로설정 setupgame() 메소드선언 startplaying() 메소드선언 finishgame() 메소드선언메소드 : void setupgame() // DotCom 객체세개만들고이름을붙임 DotCom 객체세개를생성각 DotCom의이름을설정모든 DotCom을 dotcomslist라는 ArrayList에추가 dotcomslist에들어있는각 DotCom 객체에대해다음을반복 helper 객체의 placedotcom() 메소드호출 placedotcom() 을호출한결과를바탕으로각 DotCom의위치설정반복끝메소드끝
DotComBust 준비코드 메소드 : void startplaying() 음 DotCom 이남아있는동안다음을반복 helper 의 getuserinput() 메소드호출, 사용자로부터입력을받 checkuserguess() 메소드로사용자가추측한위치를평가 반복끝 메소드끝 메소드 : void checkuserguess(string userguess) // 명중된 DotCom 객체가있는지확인 numofguesses 변수에저장된추측회수증가 result 라는지역변수를 miss 로설정 dotcomslist 에들어있는각 DotCom 객체에대해다음을반복 DotCom 객체의 checkyourself() 메소드로추측한위치평가리턴값에따라 result 의값을 hit 또는 kill 로설정 만약결과가 kill 이면그 DotCom 을 dotcomslist 에서제거 반복끝 result 값출력 메소드끝
DotComBust 준비코드 메소드 : void finishgame() 게임이끝났음을알리는메시지를출력만약추측한회수가적으면축하메시지를출력그렇지않으면결과가좋지않다는메시지를출력만약부분끝메소드끝 여기에서는테스트코드를만들고있지않지만, 실제로프로그래밍을할때는준비코드를만드는것이좋습니다. 각메소드에대해테스트코드를만들면서그테스트를통과할수있는메소드 ( 실제코드 ) 를만들고, 다시테스트코드를수정하고그테스트코드를통과할수있는메소드실제코드를만드는식의작업을반복하다보면실제코드가완성이되겠죠?
부울연산자 &&, && 는양쪽에있는부울표현식이모두참인경우에, 는양쪽에있는부울표현식중하나이상이참인경우에참이됩니다. if (price >= 300 && price < 400) { } if (brand.equals( A ) brand.equals( B )) { }!=,! 논리적 NOT 을의미하는연산자. if (model!= 2000) { } if (!brand.equals( X )) { }
부울연산자 단락연산자 (&&, ) if (price >= 300 && price < 400) { } if (brand.equals( A ) brand.equals( B )) { } if (refvar!= null && refvar.isvalidtype()) { } 비단락연산자 (&, ) 반드시양쪽표현식을모두실행시키고싶은경우에는비단락연산자를쓰면됩니다.
라이브러리 ( 자바 API) 자바 API 에서클래스는패키지단위로묶여있습니다. API 에들어있는클래스를사용하려면그클래스가어떤패키지에들어있는지알아야합니다. System(System.out.println()) Math(Math.random()) String
클래스의전체이름 클래스를사용하려면클래스의전체이름을알아야합니다. 예외 : java.lang 패키지에들어있는클래스 ArrayList 의전체이름 java.util.arraylist
클래스의이름을알려주는방법 A. import 선언문을씁니다. import java.util.arraylist; B. 일일이입력합니다. java.util.arraylist list = new java.util.arraylist(); public void go(java.util.arraylist list) { } public java.util.arraylist foo() { }
바보같은질문은없습니다 왜꼭전체이름이필요하죠? 패키지의목적이그것뿐인가요? 프로젝트또는라이브러리를더용이하게편성할수있습니다. 이름영역을지정해서같은이름때문에충돌이생기는것을방지할수있습니다. 어느정도의보안기능을제공할수있습니다.
바보같은질문은없습니다 전체이름을사용하면어떤장점이있습니까? 클래스명뿐아니라패키지명까지똑같이붙이면어떻게해야하나요? 자바에는이런문제가생기는것을방지하기위한명명규칙같은것이있습니다. 이규칙만지키면별로문제가생기지않겠죠.
핵심정리 ArrayList 는자바 API 에포함되어있는클래스입니다. ArrayList 에뭔가를집어넣을때는 add() 를쓰면됩니다. ArrayList 에서뭔가를제거할때는 remove() 를쓰면됩니다. ArrayList 에들어있는어떤것의위치를알고싶다면 ( 또는들어있는지알고싶다면 ) indexof() 를쓰면됩니다. ArrayList 가비어있는지확인할때는 isempty() 를쓰면됩니다. ArrayList 의크기 ( 원소의개수 ) 를알고싶다면 size() 메소드를쓰면됩니다.
핵심정리 일반배열의길이 ( 원소의개수 ) 를알고싶을때는 length 변수를쓰면됩니다. ArrayList 는필요에따라그크기가동적으로바뀝니다. ArrayList 를선언할때는거기에저장할객체유형을매개변수로지정합니다. ArrayList 에는객체만저장할수있지만원시유형을집어넣어도컴파일러에서자동으로처리해줍니다. 클래스는패키지단위로묶입니다. 클래스에는패키지명과클래스명을합쳐서만든전체이름이있습니다. ArrayList java.util.arraylist java.lang 을제외한다른패키지에들어있는클래스를사용하려면자바에클래스의전체이름을알려줘야합니다.
바보같은질문은없습니다 import 를사용하면클래스가커지나요? 그렇게불러온클래스나패키지가내가만든코드에추가되어같이컴파일되나요? C 를쓰고있었다면그렇게생각할지도모르겠습니다만자바에서는그렇지않습니다. import 를쓴다고해서코드분량이늘어나거나느려지는일은없습니다. import 는단순히클래스의전체이름을알려주기위한도구에불과합니다.
바보같은질문은없습니다 그러면 String 이나 System 같은클래스는왜 import 선언문없이써도괜찮은가요? java.lang 패키지는 import 선언문을쓰지않아도자동으로들어갑니다. 예를들어 String, System 같은클래스는따로 import 선언문을쓰지않아도전체이름이아닌클래스이름만으로사용할수있습니다.
바보같은질문은없습니다 내가만든클래스도패키지에집어넣어야하나요? 어떻게하죠? 정말그렇게할수있나요? 아마실제프로그래밍을할때는항상클래스를패키지에넣어야할것입니다. 자세한내용은나중에패키징과관련된장에서알아보도록하겠습니다.
API 활용방법 라이브러리에는어떤클래스가들어있을까? 책을훑어봅니다. 클래스를찾았을때그것으로무엇을할수있을지어떻게알수있을까? HTML API 문서를활용합니다.
책을뒤져보는방법
HTML API 문서를활용하는방법 직접 API 문서를살펴봅시다.
숙제 본문을다시한번꼼꼼히읽어봅시다. 6 장본문및맨뒤에나와있는연습문제를직접풀어봅시다. 6 장에나와있는닷컴가라앉히기게임을직접타이핑해서컴파일및실행시켜봅시다. java.sun.com 에서 HTML API 문서를둘러봅시다.