Sunday, September 24, 2006
자바/Java] 동적 배열 크기 확장 조절 / 숫자 문자열 혼합 배열 만들기 - Perlish Array
자바의 배열은 정적입니다. 미리 크기가 정해져 있기에, 나중에 요소를 추가할 수 없습니다. 만약 추가한다면 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 이런 에러가 나게 됩니다.
텍스트 파일 등을 다룰 때는, "펄(Perl)"의 배열처럼, 실시간으로 늘어나는 배열이 편리합니다.
펄의 배열은 크기 제한이 없어서, 실행시에 아무 값이나 넣어도 고무줄처럼 쭉쭉 늘어나게 됩니다. 그리고 문자열과 숫자를 한꺼번에 넣을 수도 있습니다.
그래서 자바의 ArrayList 를 사용해서, 펄 스타일의 배열을 구현해 보았습니다. 적어도 제가 보기로는 펄의 배열과 똑같이 잘 작동했습니다. (자바 1.5 버전에서 테스트했습니다.)
oPerlishArray 라는 배열에 add() 메소드로 요소들을 마음대로 추가하면, oPerlishArray 배열의 크기가 자동으로 늘어나게 됩니다. 인덱스 번호로 지정하지 않고, 그냥 뒤쪽에 요소들이 추가됩니다.
펄에서 흔히 그렇게 하듯, 텍스트 파일을 통째로 배열에 넣어서 처리할 때 편리할 것입니다.
그런데 이런 동적 배열은 속도가 떨어지고 메모리 관리도 비효율적이기에, 꼭 필요한 경우에만 사용해야 합니다. 물론 텍스트 파일 처리 등에서는 퍼포먼스가 떨어지더라도 차이를 체감할 수는 없을 것입니다.
파일명: Foo.java
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
배열에 정수만을 넣기 위해서는
List<Integer> oPerlishArray = new ArrayList<Integer>();
이렇게 <Integer> 로 변경합니다.
문자열만 넣으려면 다음과 같이 합니다.
List<String> oPerlishArray = new ArrayList<String>();
펄(Perl)처럼 모든 타입을 가리지 않고 넣으려면 다음과 같이 합니다.
List<Object> oPerlishArray = new ArrayList<Object>();
<Integer> <Object> <String> 이런 것은, 어떤 타입의 데이터가 저장될지 명시하는 것입니다.
만약 <String> 즉 문자열 데이터로 지정한 후에, 정수를 넣으면 다음과 같은 에러가 발생하게 됩니다.
Foo.java:11: cannot find symbol
symbol : method add(int)
location: interface java.util.List<java.lang.String>
oPerlishArray.add(123);
^
Foo.java:15: cannot find symbol
symbol : method add(int)
location: interface java.util.List<java.lang.String>
for (int x = 10; x <= 100; x++) oPerlishArray.add(x);
^
2 errors
만약 타입을 정의하지 않으면 이런 경고가 나옵니다.
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
위의 예제 실행 결과:
(2번 인덱스부터가, for문을 사용해, 대량으로 입력한 것임)
텍스트 파일 등을 다룰 때는, "펄(Perl)"의 배열처럼, 실시간으로 늘어나는 배열이 편리합니다.
펄의 배열은 크기 제한이 없어서, 실행시에 아무 값이나 넣어도 고무줄처럼 쭉쭉 늘어나게 됩니다. 그리고 문자열과 숫자를 한꺼번에 넣을 수도 있습니다.
그래서 자바의 ArrayList 를 사용해서, 펄 스타일의 배열을 구현해 보았습니다. 적어도 제가 보기로는 펄의 배열과 똑같이 잘 작동했습니다. (자바 1.5 버전에서 테스트했습니다.)
oPerlishArray 라는 배열에 add() 메소드로 요소들을 마음대로 추가하면, oPerlishArray 배열의 크기가 자동으로 늘어나게 됩니다. 인덱스 번호로 지정하지 않고, 그냥 뒤쪽에 요소들이 추가됩니다.
펄에서 흔히 그렇게 하듯, 텍스트 파일을 통째로 배열에 넣어서 처리할 때 편리할 것입니다.
그런데 이런 동적 배열은 속도가 떨어지고 메모리 관리도 비효율적이기에, 꼭 필요한 경우에만 사용해야 합니다. 물론 텍스트 파일 처리 등에서는 퍼포먼스가 떨어지더라도 차이를 체감할 수는 없을 것입니다.
ArrayList 예제: 배열 요소 추가, 배열 크기 조절 Array Resize
파일명: Foo.java
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
import java.util.*;
public class Foo {
public static void main(String args[]) {
List<Object> oPerlishArray = new ArrayList<Object>();
// 배열 요소 몇 개 채우기, 문자열 숫자 가리지 않고
oPerlishArray.add(123);
oPerlishArray.add("하하하");
// 이제는 배열 요소 (숫자) 한꺼번에 채우기
for (int x = 10; x <= 100; x++) oPerlishArray.add(x);
// 배열 출력
for (int i = 0; i < oPerlishArray.size(); i++)
System.out.format("[%d] = %s%n", i, oPerlishArray.get(i));
}
}
public class Foo {
public static void main(String args[]) {
List<Object> oPerlishArray = new ArrayList<Object>();
// 배열 요소 몇 개 채우기, 문자열 숫자 가리지 않고
oPerlishArray.add(123);
oPerlishArray.add("하하하");
// 이제는 배열 요소 (숫자) 한꺼번에 채우기
for (int x = 10; x <= 100; x++) oPerlishArray.add(x);
// 배열 출력
for (int i = 0; i < oPerlishArray.size(); i++)
System.out.format("[%d] = %s%n", i, oPerlishArray.get(i));
}
}
배열에 정수만을 넣기 위해서는
List<Integer> oPerlishArray = new ArrayList<Integer>();
이렇게 <Integer> 로 변경합니다.
문자열만 넣으려면 다음과 같이 합니다.
List<String> oPerlishArray = new ArrayList<String>();
펄(Perl)처럼 모든 타입을 가리지 않고 넣으려면 다음과 같이 합니다.
List<Object> oPerlishArray = new ArrayList<Object>();
<Integer> <Object> <String> 이런 것은, 어떤 타입의 데이터가 저장될지 명시하는 것입니다.
만약 <String> 즉 문자열 데이터로 지정한 후에, 정수를 넣으면 다음과 같은 에러가 발생하게 됩니다.
Foo.java:11: cannot find symbol
symbol : method add(int)
location: interface java.util.List<java.lang.String>
oPerlishArray.add(123);
^
Foo.java:15: cannot find symbol
symbol : method add(int)
location: interface java.util.List<java.lang.String>
for (int x = 10; x <= 100; x++) oPerlishArray.add(x);
^
2 errors
만약 타입을 정의하지 않으면 이런 경고가 나옵니다.
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
위의 예제 실행 결과:
(2번 인덱스부터가, for문을 사용해, 대량으로 입력한 것임)
[0] = 123
[1] = 하하하
[2] = 10
[3] = 11
[4] = 12
[5] = 13
[6] = 14
[7] = 15
[8] = 16
[9] = 17
[10] = 18
[11] = 19
[12] = 20
[13] = 21
[14] = 22
[15] = 23
[16] = 24
[17] = 25
...중략...
[87] = 95
[88] = 96
[89] = 97
[90] = 98
[91] = 99
[92] = 100
[1] = 하하하
[2] = 10
[3] = 11
[4] = 12
[5] = 13
[6] = 14
[7] = 15
[8] = 16
[9] = 17
[10] = 18
[11] = 19
[12] = 20
[13] = 21
[14] = 22
[15] = 23
[16] = 24
[17] = 25
...중략...
[87] = 95
[88] = 96
[89] = 97
[90] = 98
[91] = 99
[92] = 100
tag: java
자바 | Java
영원히 안 닫습니다^^
<< Home