Download - 6. 자바 라이브러리 (API)
6. 자바 라이브러리 (API)
Head First JAVA
버그의 발생
2
public String checkYourself(String …
…
if(guess == locationCells[i]) { result = “hit”; numOfHits++; break; }
…
}
<terminated>
SimpleDotCo..
enter a number 1
hit
enter a number 1
hit
enter a number 1
kill
3 guesses
한 번 맞추고 나서같은 숫자를 계속 입력해도게임을 끝낼 수 있음
- 한 번 맞춘 뒤에도 그 위치에만 들어오면 무조건 맞춘다고 간주- 이미 맞췄는지 확인할 방법 필요
Head First JAVA
버그 고치기 (1/5)
3
셀 일곱 개가 들어있는 가상의 행이 있고 ,
DotCom 객체는 연속적인 셀 세 개를 차지
0 1 2 3 4 5 6
DotCom 이4, 5, 6 번 셀에있는 것으로 가정
DotCom 에는 그 객체의 셀 위치를 저장하기 위한 인스턴스 변수가 있음
0 1 2
4 5 6 - locationCells (DotCom 의 인스턴스 변수 )
- 인스턴스 변수는 int 배열 - 사용자는 4, 5, 6 이 세 개의 숫자를 맞춰야 함
지금까지 파악한 내용
Head First JAVA
버그 고치기 (2/5)
4
배열을 하나 더 만들고 위치를 맞출 때마다그 맞춘 위치를 두 번째 배열에 집어넣음
위치를 맞출 때마다 이미 맞췄는지 그 배열을 확인함
0 1 2
false
false
true
첫 번째 옵션
hitCells 배열
(DotCom 에 새로
추가할
부울 배열 인스턴스 변
수 )
- 각 셀의 ‘상태’를 나타내는 값 세 개가 들어감 ex) 2 번에 들어있는 셀을 맞췄다면 true 로 바뀜
Head First JAVA
버그 고치기 (3/5)
5
원래 배열을 사용하면서 맞춘 셀의 값은모두 -1 로 바뀜 . 배열을 굳이 두 개 사용할 필요 없음
0 1 2
4 5 -1
두 번째 옵션
locationCells
(DotCom 의 인스턴스 변
수 )
- 음수가 있으면 그 셀을 이미 맞췄음을 의미- 배열에서 음이 아닌 숫자만 찾으면 됨
Head First JAVA
버그 고치기 (4/5)
6
맞출 때마다 각 셀 위치를 삭제 , 배열을 더 작게 고침배열의 크기를 바꿀 수 없기 때문에 새로운 배열을
만들고 , 이전 배열에 남아 있는 셀을 복사하고 새로운 배열로 옮김
세 번째 옵션
0 1 2
4 5 6
locationCells
아직 아무 셀도 맞추지
않은 상태
0 1
4 6
locationCells
1 번 인덱스에 들어 있던
‘5’ 를 맞춘 후의 상태
Head First JAVA
버그 고치기 (5/5)
7
int 배열에 있는 각 셀에 대해 다음 작업 반복// 사용자가 추측한 위치를 비교하는 부분
만약 사용자가 추측한 것이 맞으면
맞춘 개수를 증가 // 마지막 위치 셀인지 확인
만약 맞춘 회수가 3 이면 “ kill” 을 리턴
그렇지 않으면 “ hit” 을 리턴 만약 부분 끝
그렇지 않으면 “ miss” 를 리턴 만약 부분 끝
반복 부분 끝
기존의 준비코드
남아있는 각 위치셀에 대해 다음 작업 반복// 사용자가 추측한 위치를 비교하는 부분
만약 사용자가 추측한 것이 맞으면
그 셀을 배열에서 제거 // 마지막 위치 셀인지 확인
만약 맞춘 회수가 3 이면 “ kill” 을 리턴
그렇지 않으면 “ hit” 을 리턴 만약 부분 끝
그렇지 않으면 “ miss” 를 리턴 만약 부분 끝
반복 부분 끝
세 번째 옵션
Head First JAVA
Array List (1/2)
8
add(Object elem)
: 객체 매개변수 (elem) 를 목록에 추가
remove(int index)
: index 매개변수로 지정한 위치에 있는 객체를 제거
remove(Object elem)
: 주어진 객체가 ArrayList 에 있으면 그 객체를 제거
contains(Object elem)
: 객체 매개변수 elem 에 매치되는 것이 있으면 ‘참을 리턴
Head First JAVA
Array List (2/2)
9
isEmpty()
: 목록에 아무 원소도 없으면 ‘참’을 리턴
indexOf(Object elem)
: 객체 매개변수 (elem) 의 인덱스 또는 -1 을 리턴
size()
: 현재 목록에 들어있는 원소의 개수를 리턴
get(int index)
: 주어진 index 매개변수 위치에 있는 개체를 리턴
Head First JAVA
Array List 로 할 수 있는 것 (1/2)
10
새로 만든다
ArrayList<Egg> myList = new ArrayList<Egg>();
뭔가를 집어넣는다
Egg s = new Egg();
myList.add(s);
다른 것을 또 집어넣는다
Egg b = new Egg();
myList.add(s);
ArrayList 라는 객체가힙에 만들어짐
ArrayList 객체는Egg 객체를 담기위한 ‘상자’가 됨
Egg 객체를 담기 위해ArrayList 객체가더 커짐
Head First JAVA
Array List 로 할 수 있는 것 (2/2)
11
몇 개가 들어가 있는지 알아낸다int theSize = myList.size();
2 개가 들어 있기 때문에 2 를 리턴
어떤 것이 안에 들어있는지 찾아냄boolean isIn = myList.contains(s);
어떤 것의 위치 ( 인덱스 ) 를 찾아냄int idx = myList.indexOf(b);
비어 있는지 확인boolean empty = myList.isEmpty();
목록에 있는 것을 제거myList.remove(s);
‘s’ 라는 Egg 객체가 들어있기 때문에 true 리턴
‘b’ 는 두 번째로 추가되었기때문에 ‘ 1’ 을 리턴
두 개가 들어있기때문에 false 리턴
크기가 줄어들어‘b’ Egg 객체만 남음
Head First JAVA
일반 배열과의 차이점
12
ArrayList
ArrayList<String> myList = newArrayList<String>();
String a = new String(“whoohoo”);
myList.add(a);
myList.add(b);
int theSize = myList.size();
myList.remove(1);
Boolean isIn = myList.contains(b);
일반 배열
String [] myList = new String[2];
String a = new String(“whoohoo”);
myList[0] = a;
myList[1] = b;
int theSize = myList.length;
myList[1] = null;
boolean isIn = false;for (String item : myList) {
if (b.equals(item0) {isIn = true;break; }
}
Head First JAVA
DotCom 코드 수정 (1/2)
13
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 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;
} }
버그가 있는 기존 버전
Head First JAVA
DotCom 코드 수정 (2/2)
14
import java.util.ArrayList; public class DotCom {
private ArrayList<String> locationCells; 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;
} }
ArrayList 채용Import 선언문 배열 대신
ArrayList
사용자가 추측한 위치가 ArrayList
에들어있는지 확인
index >= 0 이면추측한 위치가 목록에 들어있는 것이므로 제거목록이 비어있다면
Head First JAVA
부울 표현식
15
if (price >= 300 && price < 400) { camera = “X”;
}
if (brand.equals(“A”) || brand.equals(“B”)) {
// A 브랜드 또는 B 브랜드에만 }
if ((zoomType.equals(“optical”) && (zoomDegree >= 3 && zoomDegree <= 8)) || (zoomType.equals(“digital”) && (zoomDegree >= 5 && zoomDegree <= 12))) {
// optical 이고 줌이 3 이상 8 이하 또는 // digital 이고 줌이 5 이상 12 이하에만
}
AND 와 OR 연산자
if (model != 2000) {
// 2000 이라는
모델을
// 제외한 나머지
}
if ( ! brand.equals(“X”) )
{
// 브랜드가 X 가 아닌
}
같지 않음
Head First JAVA
API 패키지
16
자바 API 에서 클래스는 패키지 단위로 묶여 있음
그 클래스를 사용하려면 어떤 패키지에 들어 있는지 알아야 함
System,
String,
Math …
java.lang
ArrayList
등 각종유틸리티
java.util
스윙 GUI클래스 중
일부
Javax.swing
Head First JAVA
클래스의 전체 이름
17
java . util . ArrayList
패키지명 클래스명
자바에 어떤 ArrayList 를 사용할지 알려줘야 하는데 두 가지 방법 있음
소스 코드 파일 맨 위에서import 선언문 사용
import java.util.ArryList;
public class MyClass { …
}
import 선언문 사용 코드에서 언제 어디서나 직접
전체 이름을 입력Java.util.ArrayList<Dog>
list =
new
java.util.ArrayList<Dog>();
일일이 입력
Head First JAVA
핵심정리 (1/2)
18
ArrayList 는 자바 API 에 포함되어있는 클래스이다 .
ArrayList 에서 뭔가를 제거할 때는 remove() 를 사용한다 .
ArrayList 에 들어있는 어떤 것의 위치를 알고 싶다면 ( 또는
들어 있는지 ) indexOf() 를 사용한다 .
ArrayList 가 비어있는지 확인할 때는 isEmpty() 를 사용한다 .
ArrayList 의 크기를 알고 싶다면 size() 를 사용한다 .
ArrayList 에 뭔가를 집어넣을 때는 add() 를 사용한다 .
일반 배열의 길이를 알고 싶다면 length 변수를 사용한다 .
Head First JAVA
핵심정리 (2/2)
19
ArrayList 는 필요에 따라 그 크기가 동적으로 바뀐다 .
ArrayList 에는 원시 유형의 값은 저장할 수 없고 일반 객체만 저장할 수 있지만 , 컴파일러에서 원시 값을 Object 객체로 감싸고 그 객체를 원시유형이 아닌 ArrayList 에 저장하는 일을 자동으로 처리해 준다 .
클래스는 패키지 단위로 묶이고 , java.lang 을 제외한 다른 패키지의 클래스를 사용하려면 전체 이름을 알려줘야 한다 .
ArrayList 에 저장할 객체 유형은 유형 이름을 <> 안에 집어넣은 형태의 유형 매개변수로 선언한다 .
소스 코드 맨 위에서 import 선언문을 사용하거나 항상 전체 이름을 입력해도 된다 .