목요일, 4월 25
Shadow

#025 백터

java.lang.Object
l Class getClass()
객체에 대한 정보를 포함하고 있는 Class 객체를 반환한다. 다음 절에서 보겠지만, 자바는
Class 클래스 안에 캡슐화 되어 있는 클래스의 실행시간 표현을 가지고 있다.
l boolean equals(Object obj)
두개의 객체가 동등한지 비교한다. 객체가 같은 메모리 영역을 가리키고 있으면 참값을, 아니면
거짓값을 반환한다.
l Object clone()
객체의 복제본을 만든다. 자바는 새로운 인스턴스에 대한 메모리를 할당하고, 현재 객체에 할당
되어 있는 메모리를 복사한다.
l String toString()
이 객체의 값을 표현하는 문자열을 반환한다. 대부분의 클래스는 객체의 현재 상태를 출력하기
위해 이 메소드를 중복시킨다. 예를 들면, Date 클래스에서의 toString 은 날짜를 표현하는
문자열을 반환한다.
벡터들(vectors)
특히 C 를 비롯한 많은 프로그램 언어들에서 컴파일 시에 모든 배열들의 크기를 확정해야 한
다. 프로그래머들은 이러한 점이 끼치는 불편함으로 인해 굉장히 싫어한다.
자바에는 좀 더 낳아졌다. 배열의 크기를 런타임에서 설정할 수 있다.
int n;
. . .
Item[] itemOrdered = new Item[n+1];
물론, 이 코드가 런타임에서 배열을 동적으로 바꿀 수 있도록 완전하게 해결하지는 못했다.
배열의 크기를 한 번 정하고 나면 쉽게 바꿀 수 없다. 대신에 자바에서는 vector 라는 객체를
사용하여 배열을 늘렸다 줄였다 하며 사용할 수 있도록 해 준다. 따라서 자바에서는 벡터들이
배열과 같은 객체들로써 다른 코드를 쓰지 않고도 자동적으로 늘렸다 줄였다가 해 준다.
노트: “벡터”라는 이름은 약간 잘못 되었다. 자바에서 사용되는 벡터는 수학이나 물리학에서
의 벡터와는 아무런 상관이 없다.
VB 노트: 자바 벡터들은 VB 의 unkeyed collection 클래스의 사용과 유사하다.
collection 들은 variant 들을 vector 들은 Object 들을 가지고 있다.
벡터와 배열간에는 중요한 차이점이 있다. 배열은 자바 언어의 특성이고, 각각의 T 형 요소는
T[]형의 배열이 존재한다. 그러나, Vector 클래스는 라이브러리 클래스로 java.util 패키
지에 정의되어 있고 Object 형의 요소들로 “하나의 크기가 모든 것을 만족시키다.”라는 단일
타입의 Vector 가 있다.
새로운 벡터는 Vector 생성자의 첫번째 용량을 결정하여 만들 수 있다.
Vector itemOrdered = new Vector (3);
// start out with space for one order item,
// plus two items for tax and shipping charges
벡터의 용량과 배열의 크기에는 중요한 차이점이 있다. 만약 3 개의 요소를 배열에 할당한다면
배열은 3 개의 슬롯을 사용 준비한다. 벡터는 아무런 요소도 가지고 있지 않고 잠재적으로만 3
개의 요소를 가지고 있게 된다.
addElement 메소드를 사용하여 벡터에 새로운 요소들을 추가하자. 예를 들어 Item 이라고
불리는 클래스가 있고 다음 코드를 사용하여 3 개의 item 객체를 만든다.
Item nextItem = new Item(. . .);
Item stateTax = new Item(. . .);
Item shipping = new Item(. . .);
다음에는 다음과 같은 코드를 이용하여 itemsOrdered 라는 벡터를 이용하여 다음과 같은 요
소들을 추가한다.
itemsOrdered.add(nextItem);
itemsOrdered.add(stateTax);
itemsOrdered.add(shipping);
우선 3 개의 항목을 위한 용량의 벡터를 만들었다고 가정하자.다른 항목을 집어 넣을 경우 우
리의 예제에 있는 벡터의 용량을 넘게 된다. 여기서 벡터들은 그들의 임무를 수행한다. 벡터
는 재배치와 크기조절을 자동적으로 한다.
얼마나 더 많은 공간이 할당될까? 기본적으로 할당되는 공간은 기존의 두 배이다. 이러한 지
수 증가의 문제로 인해 벡터가 너무 큰 메모리를 차지하고 있기를 원하지는 않을 것이다. 대신,
생성자의 두 번째 인자를 통해 용량 증가를 조절할 수 있다.
Vector itemsOrdered = new Vector(3, 10);
이젠 재배치마다 10 만큼 증가하게 된다.
반면에 자바에서 공간의 재배치가 너무 자주 일어나면 프로그램 수행 속도에 영향을 미치므로
적합한 크기를 처음에 설정하고 증가할 용량도 잘 측정하여야 한다.
노트: 간단한 프로그램에서는 용량이나 용량 증가에 대해 별로 걱정할 필요가 없다. 만약 기
본 생성자를 사용하여
Vector itemsOrdered = new Vector();
로 생성하면 벡터는 처음에 10 만큼의 용량을 가지고 두 배씩 용량 증가를 하다.
C++ 노트: 자바의 Vector 클래스는 C++의 Vector 탬플릿과 많은 중요한 부분에서 차이가
있다. 우선 Vector 는 탬플릿이므로 단지 정확한 타입만이 삽입가능하고 Vector 의 요소로부
터 파생을 요구하는 케스팅이 없다. 예를 들어 컴파일러가 단순히 Rectangle 객체를
vector<Employee>에 삽입하기를 거부한다. C++ Vector 탬플릿은 편리한 요소에 대한 접
근을 위해 []연산자를 중첩하여(overload) 사용한다.그러나 자바에서는 연산자 중첩
(overloading)은 없으므로 명시적인 메소드를 호출하여 사용해야 한다. C++ 벡터들은 값
에 의해 복사된다. 만약 a 와 b 가 두 벡터라면 a=b;라는 할당은 a 를 b 의 크기와 같은 벡터
로 만들고 b 의 모든 요소가 a 에 복사되는 것이다. 자바에서도 마찬가지다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.