2008. 7. 21. 00:28

1장 객체지향 - 이것이 무엇에 쓰는 물건인고

객체지향 언어가 사용된 스몰토크(Smalltalk)에서는 MVC(model-view-controller) 패턴이 사용되었는데
MVC 패턴이란 데이터를 관리하는 놈(model), 데이터를 보여주는 놈(view), 프로그램의 흐름을 좌지우지하는 놈(controller)으로 구성되어 있다.
요즘 나오는 대부분의 소프트웨어 아키텍처(software architecture)들은 이러한 유형을 따르고 있다.
ex : C++, 윈도우 DNA 아키텍처, 자바 등
3계층의 구성 요소들 사이의 프로토콜 즉 통신 방법에는 여러가지가 있다.
ex : COM/DCOM/COM+, COBRA, EJB, XML 등

소프트웨어 개발방법
1. 구조적 방법 : 대표언어 C이며 하나의 프로그램이나 시스템은 잘게 쪼개진 여려 개의 세부적인 것으로 구성되어 있는 것으로 간주되는 개념이다. 피라미드 형식이나 그물과 같은 구조의 형식을 지칭한다.
구조적 언어의 단점 중 하나는 프로그래밍 언어가 프로그램의 실행 흐름 즉, 절차에 치중한다는 것이다.
하지만 프로그램에서 중요한 것은 절차만이 아니며 중요정도에서는 데이터가 더 큰 비중이 있다고 할 것이다.
그러나 절차적 프로그래밍 언어에서는 데이터와 그것을 처리하는 절차를 구분시켜 놓으므로써, 데이터를 소홀히 하는 단점이 있다.
이것의 결과로 데이터와 그 데이터를 처리하는 절차가 분리되어 있어서 코드가 복잡해 지거나 조금 더 편리해지기 위해 보다 중요한 데이터를 전역 변수로 정의하여 권한이 없는 다른 함수에서도 접근할 수 있게 하는 문제점을 노출하기도 한다.
2. 객체지향 방법의 핵심은 데이터와그 데이터를 처리하는 절차를 하나의 단위로 묶어 놓는데에 있다. 또 같은 단위에 속해있는 절차 즉, 코드를 통해서 데이터에 접근하게 함으로써 보다 중요한 데이터를 보호할 수 있게 한다.

C++이 객체지향 개념을 포함하며 본격적인 객체지향 언어로 입지를 굳혔으나, 인터넷의 특징을 손쉽게 활용할 수 있는 자바언어가 대두되게 되었다.
자바 언어에서 모든 객체는 포인터 대신에 레퍼런스(reference)를 통해 접근하게 되며, 객체의 소멸은 자바 가상 머신(Java virtual machine) 안에 있는 가비지 컬렉터(garbage collector)가 대신 처리해주므로 프로그래머는 delete 연산자를 사용하지 않아도 되게 되었다.

객체지향 방법은 하나의 소프트웨어 시스템을 여러 개의 객체로 구성된 것으로 간주한다. 각 객체는 독립적으로 고유한 기능과 서비스를 제공하며, 전체 소프트웨어 시스템을 구성하는 하나의 논리적인 구성 요소가 된다.
각 객체가 전체에 포함된 일부로서가 아니라 독립적인 것으로 간주되기 때문에 해당 객체의 기능르 독립적으로 향상시킬 수도 있고 다른 소프트웨어 시스템에도 재사용할 수 있으며, 또한 사용자의 요구 사항이 변경되는 경우에도 손쉽게 대응할 수 있다는 이점을 갖게 된다.

용어 설명
1. 애플릿(applet) : 웹 서버에서 다운로드된 후에는 웹 서버의 자원을 사용하지 않고 사용자와 상호작용하며 작업을 수행하는 자바 언어로 만든 작은 애플리케이션
2. 모델링 언어 UML(Unified Modeling Language) : 설계자와 사용자가 서로 의사 소통을 하는데 사용하는 말을 모델링 언어라 하며, 객체지향 방법론에서는 주로 UML이라는 모델링 언어를 사용한다.
UML이란 소프트웨어 시스템을 시각화하고 명세화하고 구축하고 문서를 작성하는데 사용하는 그래픽으로 표현되는 언어(a graphical language for visualizing, specifying, constructing, and documenting the artifacts of a software-intensive system) 라고 정의된다.

P.S 객체지향 이야기는 한장씩 읽어나가야 하는데 첫장을 포스팅 하기 너무 힘들었다. 왜냐고??? 좀 읽다가 졸았기 때문에... ㅋㅋ 아무튼 이 시간에 포스팅을 시작해서 좋다. ^0^
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 클래스 안에 들어있는 메소드