2008. 7. 20. 23:01

chapter 6. 자바 API를 알아봅시다.

자바에는 클래스 수백 개가 내장되어 있습니다. 우리는 필요한 것을 찾는 방법을 알아내어 자신의 애플리케이션에서 사용할 부분만 새로 만들면 됩니다.

자바 API에서 클래스는 패키지 단위로 묶여 있습니다.
API에 들어있는 클래스를 사용하려면 그 클래스가 어떤 패키지에 들어있는지 알아야합니다.
자바 패키지의 종류는
java.lang : 필수 요소
java.util : 자바 유틸리티
java.swing : 스윙 클래스

어떤 클래스를 사용하려면 클래스의 전체 이름을 알아야합니다.
ArrayList 는 java.util 패키지에 들어있으며 java.util.ArrayList 로 쓰면 됩니다.

패키지의 클래스를 사용할지 알려주는 방법은 아래와 같습니다.
1. import 선언문을 쓰는 경우
소스 코드 파일 맨 위에서 import 선언문을 사용합니다.
import java.util.ArrayList;
public class MyClass {...}
2. 일일이 입력합니다.
코드에서 일일이 전체 이름을 입력합니다. 언제,어디서나 직접 타이핑을 해야한다는 단점이 있네요.
객체를 선언하고 인스턴스를 만들 때:
java.util.ArrayList<Dog> list = new java.util.ArrayList<Dog>;
인자 유형으로 사용할 때 :
public void go(java.util.ArrayList<Dog> list) {}
리턴 유형으로 사용할 때 :
public java.util.ArrayList<Dog> foo() {}

ArrayList에 들어있는 메소드는 아래와 같습니다.
add(Object elem) : 객체 매개변수(elem)를 목록에 추가합니다. -> 뭔가를 집어넣을 때
romove(int index) : index 매개변수로 지정한 위치에 있는 객체를 제거합니다 -> 뭔가를 제거할 때
indexOf(Object elem) : 객체 매개변수(elem)의 인덱스 또는 -1을 리턴합니다 -> ArrayList에 들어있는 어떤 것의 위치를 확인하거나 알고 싶을 때
isEmpty() : 목록에 아무 원소도 없으면 '참'을 리턴합니다 -> ArrayList가 비어있는지 확인할 때
size() : 현재 목록에 들어있는 원소의 개수를 리턴합니다 -> ArrayList의 크기(원소의 개수)를 알고 싶을 때
length : 일반 배열의 길이(원소의 개수)를 알고 싶을 때
cotains(Object elem) : 객체 매개변수(elem)에 매치되는 것이 있으면 '참'을 리턴합니다.
get(int index) : 주어진 index 매개변수 위치에 있는 객체를 리턴합니다.

1. ArrayList는 필요에 따라 그 크기가 동적으로 바뀝니다. 객체가 추가되면 커지고, 제거되면 작아집니다.
2. ArrayList에 저장할 객체 유형은 유형 이름을 <>안에 집어넣은 형태의 유형 매개변수(type parameter)로 선언합니다. ex : ArrayList <Button> 은 Button(또는 Button의 서브클래스) 유형의 객체만 넣을 수 있는 ArrayList
3. ArrayList에는 원시 유형의 값은 저장할 수 없고 일반 객체만 저장할 수 있지만, 컴파일러에서 원시값을 Object 객체로 감싸고 그 객체를 원시 유형이 아닌 ArrayList에 저장하는(또는 그와 반대로 가는) 일을 자동으로 처리해줍니다.
4. java.lang을 제외한 다른 패키지에 들어있는 클래스를 사용하려면 전체 이름을 알려줘야 합니다.

ArrayList와 일반 배열의 차이점
1. 기존의 일반 배열은 만들어질 때부터 유형과 이름이 정해지지만, ArrayList에서는 ArrayList 유형의 객체만 만들면 됩니다. 객체를 추가하거나 제거하면 자동으로 커지거나 작아지므로 크기를 따로 지정할 필요가 없어요.
ex : new String[2]
      new ArrayList <String>{}
2. 객체를 일반 배열에 집어넣을 때는 위치를 지정해야 합니다.(즉 0이상, 배열의 길이에서 1을 뺀 숫자 이하의 인덱스를 지정해야 합니다) ex : myList[1] = b;
ArrayList는 add(정수,객체) 메소드를 써서 인덱스를 지정하거나 그냥 add(객체)라고만 하면 자동으로 새로 추가된 객체가 들어갈 자리가 만들어집니다. ex : myList.add(b);
3. 배열을 쓸 때는 자바의 다른 부분에서는 쓰지 않는 배열 전용 문법을 써야 합니다.
하지만 ArrayList는 일반 자바 객체기 때문에 특별한 전용 문법을 쓸 필요가 없습니다.
ex : myList[1] -> 배열전용 대괄호([])는 배열에서만 쓰이는 특별한 기호입니다.
4. 자바 5.0에서는 배열이 매개변수화되어 있습니다.
ArrayList<String> : <>안의 String은 "유형 매개변수(type parameter)"입니다.

초강력 부울 표현식
'AND'와 'OR' 연산자 '&&' , '||'
1. 가격이 300달러 이상, 400달러 미만이면 X를 선택한다
if (price >= 300 && price <=400 ) {
camera = X;
}
2. 카메라 브랜드가 총 열개 있는데 그 중 브랜드 몇개에 대해 어떤 작업을 하고 싶을 경우
if (brand.equals("A") || brand.equals("B")) {
A 브랜드 또는 B 브랜드에만 적용할 내용
}
같지 않음 ( != , ! )

P.S 소스 코드를 이해하는 부분은 2차 개정판에서 다룰 예정입니다.
Heas First 자바를 두번이상 읽을수 있는 시간을 꼭 내겠습니다. ^^;

2008. 7. 16. 19:11

chapter 5. 프로그램 만들기

클래스 개발 일반론

1. 클래스에서 어떤 것을 해야 하는지 파악한다.
2. 인스턴스 변수와 메소드 목록을 작성합니다.
3. 메소드를 만들기 위한 준비 코드를 만듭니다.
4. 메소드에 대한 테스트 코드를 만듭니다.
5. 클래스를 구현합니다.
6. 메소드를 테스트합니다.

각 클래스별로 준비 코드, 테스트 코드, 실제 코드
준비 코드 : 논리 위주의 유사코드를 표현한다. (어떻게 해야할지가 아니라 무엇을 해야할지를 기술한다.)
테스트 코드 : 실제 코드를 테스트하고 작업이 제대로 처리되는지 확인하기 위한 클래스 또는 메소드(준비 코드를 기준으로 작성한다.)
실제 코드 : 클래스를 실제로 구현한 코드

익스트림 프로그래밍 방법(XP)
조금씩, 하지만 자주 발표한다.
사이클을 반복해서 돌리면서 개발한다.
스팩에 없는 것은 절대 집어넣지 않는다.
테스트 코드를 먼저 만든다.
모든 테스트를 통과하기 전에는 어떤 것도 발표하지 않는다.
조금씩 발표하는 것을 기반으로 하여 현실적인 작업 계획을 만든다.
모든 일을 단순하게 처리한다.
두 명씩 팀을 편성하고 모든 사람이 대부분의 코드를 알 수 있도록 돌아가면서 작업한다.
효과
야근을 안한다. 항상 정규 일과 시간에만 작업을 할 수 있다.
기회가 생기는 족족 언제 어디서든 코드를 개선 할 수 있다.

for 순환문

for ( int i=0 ; i < 100 ; i++ ) { }
이 코드는 정수형 변수 i를 0으로 초기화하고 i가 100보다 작을 경우 i를 후증가연산자로 계속해서 순환하라는 뜻

int i = 0
초기화 : 변수를 선언하는 부분
i < 100
부울 테스트 : 조건 테스트가 들어가는 자리(부울값을 리턴하는 메소드가 들어가는 경우도 있다.)
i++
반복 표현식 : 순환문이 한 번 반복될때마다 실행할 내용이 들어감

for와 while의 차이점
while 순환문은 부울 테스트만 들어갈 수 있다. 초기화 및 반복 표현식을 내장 시킬 수 없다.
반복 횟수를 알 수 없을 때 어떤 조건이 만족되는 동안 계속 반복하는 경우에 유용하다.

for 순환문은 반복 횟수를 알고 있을 경우 유용하다.

++ , -- : 선/후 증가/감소 연산자
변수의 앞 뒤에서 쓰일 경우 변수 +1, -1 의 효과를 가져온다.
int x = 0 ; int z = ++x ;
int x = 0 ; int z = x++ ;

향상된 for 순환문
" String[] nameArray = { " ", " ", " " }; "
for (String name : nameArray) { }
위 코드는 nameArray에 들어 있는 각 원소에 대해서 각각의 원소를 name 변수에 저장한 다음 순환문을 실행시킨다.

String name : 선언된 변수(nameArray) 유형인 String와 반드시 동일해야 한다.
: -> in의 의미
nameArray : 반복 작업의 대상이 되는 원소들의 컬렉션

String을 int로 변환하는 방법
Integer.parseInt("3")
Integer : 자바 클래스 라이브러리에 있는 클래스로 숫자를 나타내는 String을 받아서 그 문자열을 진짜 숫자로 변환 해 주는 기능이 있는 클래스
parseInt : String을 그 문자열이 나타내는 int로 '파싱하는' 방법을 알고 있는 Integer 클래스 안에 들어있는 메소드

2008. 7. 16. 10:41

chapter 4. 메소드에서는 인스턴스 변수를 사용합니다.

클래스에서는 객체가 아는것과 하는것을 정의한다.
인스턴스 변수는 객체가 아는것이고 메소드는 객체가 하는것이다.

메소드에 뭔가를 보내거나 돌려받을 수 있습니다.
메소드에서 사용하는 것은 매개변수(parameter), 전달하는 것은 인자(argument)라고 한다.

Dog d = new Dog();                     d라는 레퍼런스 변수에 bark라는 메소드를 호출하고 3 인자값을 전달한다.
d.bark(3);
void bark(int numOfBarks) {          3이라는 인자는 numOfBarks에 전달이 된다.
while (numOfBarks > 0) {
System.out.println("ruff");
numOfBarks = numOfBarks -1 ;      numOfBarks 이라는 매개변수는 메소드 내에서 변수로 쓰인다.
}
}

메소드에서 매개변수를 받도록 선언했다면 그 메소드를 사용할 때 반드시 뭔가를 전달해야 하는데 이 뭔가는 반드시 정해진 유형의 값이어야 한다.

메소드에 인자 두 개 이상을 전달 할 수 있으며,
변수의 유형이 매개변수 유형과 일치한다면 변수를 매개변수로 전달할 수도 있다.

자바는 값을 전달한다 ( 복사본을 전달하는 것이다.)   

메소드를 선언할때는 반드시 리턴유형을 지정해야 한다.(void로 지정하면 아무것도 리턴하지 않는다.)
void가 아닌 리턴 유형을 지정했을 경우 반드시 선언된 리턴 유형과 호환 가능한 값을 리턴해야 한다.

매개변수와 리턴 유형의 활용 방법
개터(getter) : 어떤 값을 리턴값 형태로 받아오기 위한 용도
세터(setter) : 어떤 값을 인자로 받아서 인스턴스 변수를 그 값으로 설정하기 위한 용도

캡슐화 : 모든 인스턴스 변수는 세터 메소드를 만들어서 직접 접근할 수 없도록 한다.
인스턴스 변수는 private로 지정하고 게터와 세터는 public로 지정해서 데이터를 숨긴다.

인스턴스 변수와 지역변수의 차이점
인스턴스 변수 : 유형과 이름이 들어가므로 어떤 값을 대입하지 않거나 세터 메소드를 호출하지 않은 경우에는 기본값이 호출 된다.
지역 변수 : 기본값이 없으므로 사용하기 전에 반드시 초기화를 해야 한다.

원시변수와 객체 레퍼런스 변수를 비교할때는 == 연산자를 이용하면 된다.

'Java > Head First 자바' 카테고리의 다른 글

chapter 7. 상속과 다형성  (1) 2008.07.22
chapter 6. 자바 API를 알아봅시다.  (0) 2008.07.20
chapter 5. 프로그램 만들기  (2) 2008.07.16
chapter 3 원시변수와 객체 레퍼런스 변수  (0) 2008.07.15
chapter 1,2  (1) 2008.07.12
2008. 7. 15. 23:14

chapter 3 원시변수와 객체 레퍼런스 변수

3. 원시변수와 레퍼런스
변수는 원시변수와 객체 레퍼런스로 나누어지며, 이전까지는 변수를 객체상태(인스턴스 변수)지역 변수(메소드 안에서 정의된 변수)로만 사용했으나,
이번장에서는 추가적으로 인자(호출하는 코드에 의해 메소드로 전달되는 값)
리턴 유형(메소드를 호출한 부분으로 돌아가는 값)으로도 사용한다.

자바는 유형을 철저히 따진다(byte에 short나 int 변수를 집어넣지 못한다)
변수는 유형과 이름을 반드시 갖고 있어야 한다.

숫자원시변수는 아래와 같다
이름                크기
byte                8비트(-128~127)
short               16비트(-32768~32767)
int                   32비트
long                64비트

(부동소수점 소수)
float                32비트
double            64비트

변수에 값을 대입하는 방법
등호 옆에 리터럴 값을 입력하는 방법(x=12, isGood=true 등)
한 변수의 값을 다른 변수에 대입하는 방법(x=y)
두가지를 병행하는 방법 (x=y+2)

변수 생성 규칙
알파벳, 언더바(_), 달러($)로 시작해야 한다.(숫자로 시작 안됨)

예약어를 이름으로 사용해서는 안된다
BCBILFD (boolean, char, byte, int, long, float, double)

myDog.bark(); -> myDog라는 변수로 참조할 수 있는 객체를 이용하여 bark()메소드를 호출하라는 의미

Dog myDog = new Dog();
myDog라는 레퍼런스 변수를 생성합니다(Dog 유형의 변수네요.)
힙에 새로운 Dog 객체를 위한 공간을 마련하도록 합니다.
새로운 Dog 객체를 myDog 레퍼런스 변수에 대입합니다.

int [] nums ; -> int 유형의 nums 레퍼런스 변수를 정의한다.
nums = new int[7]; -> 길이가 7인 새로운 int 배열을 생성하고 nums 라는 int[] 변수에 대입한다.
2008. 7. 12. 01:09

chapter 1,2

자바로 할 수 있는 일은
소스를 만들어 컴파일을 하면 클래스 파일이 나오고 클래스 파일을 자바가상머신에서 실행을 시켜서 소스에 대한 결과값을 얻는것.

자바 코드의 구조는
자바 소스파일 - 클래스 - 메소드 - 선언문의 구조로 이루어져 있다.

main 메소드엔 뭐가 들어갈까?
뭔가를 하는 선언문, 뭔가를 여러번 반복하는 순환문, 조건에 따라 뭔가를 하는 분기문이 들어간다.

객체와 클래스
객체는 클래서 내부에서 돌아가는 부분이며
객체에서 아는것을 인스턴스 변수라 하고 객체에서 하는것을 메소드라 한다.

객체는 클래스 안에서 실행이 되며, 객체지향적인 프로그래밍을 한다는 것은
공통된 클래스(1개 또는 여러개)를 만들어 클래스 상호간에 상속을 통해 움직이거나
예외의 경우에는 오버라이드를 통해 별도로 움직일 수 있다는 것.

객체는 두개의 클래스(진짜 클래스, 테스트클래스-main 메소드가 위치)를
가지고 만들 수 있다.

main 메소드의 용도는 클래스를 테스트 하는것과 자바 애플리케이션을 시작하기 위한 용도이다.

P.S JDK를 설치해서 컴파일이 실행이 안되는 오류를 해결하지 못함.
editplus에 컴파일과 실행을 세팅했는데. 제대로 값이 나오는지를 확인하지 못함.