코딩 기록들

[Java Programming] 7.4 배열 본문

Java

[Java Programming] 7.4 배열

코딩펭귄 2024. 1. 26. 00:16

- 같은 타입의 많은 양의 데이터를 다뤄야 할 경우 사용

- 동일한 타입의 값들을 메모리에 차례대로 나열시킨 구조

- 같은 타입의 데이터만 저장할 수 있음

- 선언과 동시에 저장할 수 있는 데이터 타입이 결정됨 

- 한번 생성된 배열은 길이를 늘이거나 줄일 수 없음

 

1. 배열 선언

방법1) type[] 변수;
ex) int[] intArray; 

방법2) type 변수 [];
ex) int intArray[];

- 배열변수는 참조변수에 속함 -> 참조할 배열객체가 없다면 배열변수는 null로 초기화됨

--> 하지만, 만약 null 인 상태에서 변수[인덱스]로 값을 읽거나 저장하면 NullPointerException발생함 (-> 배열변수는 배열을 생성하고 참조하는 상태에서 값을 저장하거나 읽어야함)

 

2.1 값 목록으로 배열 생성

- 중괄호 : 주어진 값들을 항목으로 가지는 배열객체를 힙에 생성 & 배열객체의 번지를 리턴함 (배열변수는 리턴된 번지를 저장함으로써 참조가 이루어짐)

type[] 변수 = {값0, 값1, 값2 ...};

ex)  String[] names = {"a","b", "c"};

- 주의할점 : 배열변수를 이미 선언한 후 다른 실행문에서 중괄호를 사용한 배열생성 불가능

-> 배열변수를 미리 선언한 후 값 목록이 나중에 결정돼야 한다면, new연산자 사용해서 값목록을 지정

String[] names = null;
//컴파일에러 : names = {"가", "나", "다"};
names = new String[] {"가", "나", "다"}; //이렇게 써야됨

 

- 메소드의 매개값이 배열일경우 : 값 목록으로 배열을 생성함과 동시에 add()메소드의 매개값으로 사용하고자 할때에는 반드시 new 연산자 사용

 

 

2. new 연산자를 이용

- 값의 목록을 가지고있지 않지만, 향후 값들을 저장할 배열을 미리 만들고싶을때 new연산자로 배열객체 생성

- String객체를 new 연산자로 생성하면, 새로운 String객체가 생성됨 = 메모리값이 달라짐 

배열 만드는 방법2-1
type [] 배열이름 = new type[길이]; // 길이= 인덱스 개수(줄 세울 길이)
  이후 인덱스별로 값 할당

--> 여기서 type = 배열에 저장될 데이터의 타입

- 만약, 배열변수가 null값을 가진 상태에서 값을 읽거나 저장하면 NullPointerException 발생함

 

- new 연산자로 배열을 처음 생성할 경우, 배열은 자동적으로 기본값으로 초기화됨

int [ ] scoreArray = new int[7]; // 0~6 의 인덱스 생성
-> 메모리가 할당되고,인덱스0~6(7개)의 4byte 메모리에 0이 할당
Student [ ] s = new Student[7];   ( 'Student'이라는 클래스 타입의(Reference type) 배열 생성) 
-> 메모리가 할당되고,인덱스0~6(7개) 메모리에 null값이 할당
boolean[ ] b = new boolean[7];
-> 메모리가 할당되고,인덱스0~6(7개) 메모리에 false 할당

--> int는 primitive type이지만, 메모리를 연결해서 쓰는(메모리뭉치를 가지고있는) 메모리 뭉치를 들고다니기 때문에 reference타입이 됨. 배열의 타입은 primitive type, reference type에 상관 없이 reference타입임

- reference type에서만 (".")연산자 쓸 수 있음

- > 배열 길이 구할때 : 배열변수.length; 로 작성

- 배열 인스턴스에 값을 할당하려면 배열인스턴스명[인덱스번호] = ; 형태로 작성

- 배열 인스턴스 인덱스의 값을 참조하려면 변수 = 배열인스턴스명[인덱스번호]; 형태로 작성

배열 만드는 방법 2-2
int[ ] scoreArray = new int[ ] {
    0, 0, 0, 0, 0, 0, 0
}

0으로 초기화된 배열

 

 

객체를 참조하는 배열

- 기본타입(int, byte, char, float, boolean..) 배열은 각 항목에 직접 값을 갖고 있고, 

  참조타입(클래스, 인터페이스)배열은 각 항목에 객체의 '번지'(=주소)를 가지고 있음 -> 클래스타입인 String[]배열은 각 항목에 문자열이 아닌, String 객체의 '주소'를 가지고있다(=참조한다)

- String[]배열 항목 간 문자열의 비교는 == 가 아닌, .equals()메소드를 사용해야한다 (== 는 객체의 번지 비교 용도임)

- String객체를 new 연산자로 생성하면, 새로운 String객체가 생성됨 = 메모리 주소값이 달라짐 

 

배열 복사

public static void main(String[] args) {
    int[] oldIntArray = {1,2,3};
    int[] newIntArray = new int [5];
}
1. for문 사용하기
    for(int i = 0; i<oldIntArray.length; i++) {
        newIntArray[i] = oldIntArray[i];
    }
2. System.arraycopy()메소드 사용하기

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

(Object 원본배열, int 복사할 항목의 시작인덱스, Object 새배열, int 새배열에서 붙여넣을 시작인덱스, int 복사할개수);

System.arraycopy(oldIntArray, 0, newIntArray, 0, oldIntArray.length);

 

하나씩 출력

for(int i = 0; i<newIntArray.length; i++) {
    System.out.println(newIntArray[i] + ",");
}

 

 

 

 

배열순회

1. for
//for문만들기 방법 1. (초기값; 반복조건체크; 증감식) {...}
// 반복을 할때 반복문안에서 index 번호가 필요한 경우 사용
    int sum = 0;
    for(int i = 0; i < scoreArray.length; i++) {
        System.out.println(scoreArray[i]);
        sum += scoreArray[i];
        System.out.println(sum);
    }
    System.out.println(sum);

 

2. for-each (향상된 for)
for (타입변수2 : 배열1) {
    실행문3
}

1. for문 처음 실행시 배열1 에서 가져올 첫번째 값이 존재하는지 평가 -> 존재한다면, 해당값을 변수2에 저장

2. 실행문3 실행 ->  1번으로 돌아가서 반복실행. 가져올 다음항목이 없으면 for문 종료 

-> for문의 반복횟수 = 배열의 항목 수

//문법 : for(아이템타입(=배열에있는 타입) 아이템변수명 : 배열)
// 반복을 할때 반복문안에서 index 번호가 필요없는 경우 사용
    for(int score2 : scoreArray) { // 배열에 있는 값을 score2에 넣어줌
        System.out.println("for-each: " + score2);
//			for-each: 1
//			for-each: 2
//			for-each: 3
//			for-each: 4
//			for-each: 5
//			for-each: 6
//			for-each: 7
		}

 

 

 

다차원배열

- 일반적인 배열은 1차원으로 사용 - int[ ]

- 2차원 이상의 배열 정의 가능 (단, 활용성은 낮음) - int[ ][ ]