코딩 기록들
[Java Programming] 7.4 배열 본문
- 같은 타입의 많은 양의 데이터를 다뤄야 할 경우 사용
- 동일한 타입의 값들을 메모리에 차례대로 나열시킨 구조
- 같은 타입의 데이터만 저장할 수 있음
- 선언과 동시에 저장할 수 있는 데이터 타입이 결정됨
- 한번 생성된 배열은 길이를 늘이거나 줄일 수 없음
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
}
객체를 참조하는 배열
- 기본타입(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[ ][ ]
'Java' 카테고리의 다른 글
[Java Programming] 8.1 상속 (2) | 2024.01.26 |
---|---|
[Java Programming] 7.1 메소드 오버로딩 (1) | 2024.01.26 |
[Java Programming] 7.3 String Concatenation, String Buffer (0) | 2024.01.25 |
[Java Programming] 7.2 String (1) | 2024.01.25 |
[Java Programming] 6.2 클래스 다이어그램 & Vending Machine 예제 (0) | 2024.01.24 |