배열의 생성
//둘다 가능
int[] arr1 = new int[5];
int arr2[] = new int[5];
배열을 생성하는 방법은 위와 같다. 중괄호 위치는 둘다 가능하다.
배열은 여러개의 인스턴스를 생성하지 않는다
int iArr[] = new int[10]; //10개의 int형 데이터를 담을 수 있는 참조변수 10개 생성
String[] sArr = new String[5]; //5개의 String형 인스턴스를 담을 수 있는 참조변수 5개 생성
IMadeClass cArr[] = new IMadeClass[20]; //20개의 IMadeClass 인스턴스를 담을 수 있는 참조변수 20개 생성
배열 그 자체로는 배열 인스턴스가 맞지만, arr[1], arr[2] .. 처럼 각각의 공간이 인스턴스는 아니다.
배열의 생성에서 중요한 것은 배열은 해당 데이터나 인스턴스를 담을 수 있는 공간, 즉 참조변수들을 생성하는 것이지
이것 자체가 인스턴스를 생성하지는 않는다는 것이다. 배열은 처음에 0 또는 null로 초기화 된다.
class Box{
private String data;
Box(String data){
this.data = data;
}
Box(){
this("ABCD");
}
void setData(String data){
this.data = data;
}
public String toString(){ //Box.data를 출력하기 위한 구현
return data;
}
}
public class 배열 {
public static void main(String[] args) {
Box box[] = new Box[100];
//box[]는 Box 인스턴스를 100개 담을수 있는 참조변수의 배열이지 인스턴스가 아니다!
box[0] = new Box("123"); //box[0]에 인스턴스를 넣어줌
System.out.println(box.length);
System.out.println(box[0]); //box[0]에는 인스턴스가 들어갔음.
System.out.println(box[1]); //box[1]은 인스턴스가 아닌 비어있는 공간임.
}
}
100
123
null
위 코드에서 마지막 출력문을 보면 null이 나옴을 확인할 수 있다. 만일 배열을 생성한 당시 각 배열마다 인스턴스가 생성이 되었다면 기본 생성자가 실행 되어서 모든 인스턴스들의 멤버변수 data는 "ABCD"로 초기화가 되었을 것이다.
그러나 null이 출력됨으로 보아 이는 배열의 생성이 인스턴스의 생성과 관계가 없다라는 것을 알 수 있다.
단지 인스턴스들을 담을 수 있는 공간, 더 정확히는 참조변수들을 생성한 것이다.
배열을 대상으로 한 값의 저장과 참조
class Box2{
private String data;
Box2(String data){
this.data = data;
}
Box2(){
this("ABCD");
}
void setData(String data){
this.data = data;
}
public String toString(){
return data;
}
}
public class 배열 {
public static void main(String[] args) {
Box2 box[] = new Box2[3];
for(int i=0; i<box.length; i++){
box[i] = new Box2(); // 배열에 인스턴스를 집어넣음
System.out.println(box[i]);
}
}
}
ABCD
ABCD
ABCD
내부의 for문을 통해서 3개의 인스턴스를 생성하고 있음을 확인할 수 있다.
type 배열[idx] = new type(..); 과 같은 방법으로 새로운 인스턴스를 각 배열 인덱스에 생성할 수있다.
생성과 동시에 초기화
int[] arr = {1,2,3};
String[] sArr = {"홍익대학교","정보","컴퓨터","공학과"};
배열 메소드
채워 넣기 ( fill 메소드 )
-Arrays.fill(type[ ] a, type val)
-Arrays.fill(type[ ] a, int fromIndex, int toIndex, type val)
import java.util.Arrays; //Import 필요
public class FillMethod {
public static void main(String[] args) {
int[] a = new int[3];
Arrays.fill(a,7); //처음부터 끝까지 배열 a를 7로 채움
for(int num: a){
System.out.print(num+", ");
}
System.out.println();
String[] b = new String[4];
Arrays.fill(b,1,3,"Hello"); //1번부터 2번까지 배열 b를 "Hello"로 채움
for(String str: b) {
System.out.print(str + ", ");
}
}
}
7, 7, 7,
null, Hello, Hello, null,
배열끼리 복사하기
-System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
- 복사 원본의 위치: 배열 src의 인덱스 srcPos
- 복사 대상의 위치: 배열 dest의 인덱스 destPos
- 복사할 요소의 수: length
public class ArraysCopyMethod {
public static void main(String[] args) {
int a[] = {0,1,2,3,4,5,6,7,8,9};
int b[] = new int[10];
System.arraycopy(a,3,b,4,5); //a의 3번 내용부터를 b의 4번위치 부터 5개 복사
for(int num:b){
System.out.print(num+" ");
}
}
}
0 0 0 0 3 4 5 6 7 0
2차원 배열에서 length
- int arr[3][4]에서 arr.length는 3이다
- int arr[5][14]에서 arr.length는 5이다.
- int arr[5][12]에서 arr[3].length는 12이다.
int arr[3][4];
arr[2] = new arr[10]; 에서 arr[2].length는 10이다.
'Java' 카테고리의 다른 글
Java- Object 클래스 (0) | 2022.12.29 |
---|---|
Java- 상속 (0) | 2022.12.29 |
Java- 콘솔 입출력 (0) | 2022.12.27 |
Java- 문자열 결합의 최적화(StringBuilder 클래스) (0) | 2022.12.27 |
Java- 메소드 오버로딩과 this (0) | 2022.12.26 |