1. 배열이란?
- 동일한 자료형을 묶어 저장하는 참조 자료형
- 생성할 때 크기 지정
- 한 번 크기를 지정하면 절대 변경할 수 없음
2. 배열 생성하기
1) 배열 선언하기
-자료형[]변수명
int[] a; //int 자료형만 저장 가능한 배열
double[] a; //double 자료형만 저장 가능한 배열
String[] a; //String 자료형만 저장 가능한 배열
- 배열을 선언하면 스택 메모리에 변수의 공간만 생성하고, 공간 안은 비운채로 둠
- 아직 배열의 실제 데이터인 객체를 생성하지 않았기 때문
- 스택 메모리에 위치하고 있는 참조 자료형 변수의 빈공간을 초기화할 때는 null값 사용
- null값 : 힙 메모리의 위치(번지)를 가리키고 있지 않다.
2) 힙 메모리에 배열의 객체 생성하기
-new 자료형 [배열의 길이]
- 실제 데이터(객체)는 힙 메모리에 생성
new int[3]; //정수 자료형 3개를 포함할 수 있는 배열 객체 생성
new double[5]; //실수 자료형 5개를 포함할 수 있는 배열 객체 생성
new String[10]; //문자열 자료형 10개를 포함할 수 있는 배열 객체 생성
new int[]; //객체의 크기를 지정하지 않아 오류 발생
3) 배열 자료형 변수에 객체 대입하기
- 자료형[] 변수명;
변수명 = new 자료형 [배열의 길이]
int[] a;
a = new int[3];
- 자료형[] 변수명 = new 자료형[배열의 길이]
int[] a= new int[3];
-int[] : int 자료형만을 저장할 수 있는 배열
- a : 참조변수, 실제 데이터값의 위칫값 지정
- new 키워드 : 힙 메모리에 객체를 넣어라
- int[3] : 정수 3개를 저장할 수 있는 공간을 만들어라
- int 자료형 3개를 저장할 수 있는 공간을 힙 메모리에 넣어두고 어디에 넣었는지 참조 변수 a에 저장하라
- 스택 메모리 공간은 값을 초기화 하지 않으면 빈공간으로 존재
- 힙 메모리는 어떤 상황에서도 빈 공간이 존재 하지 않음
- 힙 메모리에 값을 주지 않으면 컴파일러가 값을 강제로 초기화
- 숫자는 모두 0, 불리언은 false, 모든 참조 자료형은 null로 초기화
4) 객체에 값 입력하기
- 인덱스(index) : 값을 저장할수 있는 공간의 방 번호 , 0부터 시작하며 1씩 증가
- 배열 객체에 값 대입하기 : 참조 변수명[인덱스] = 값;
int[] a = new int[3];
a[0]=3;
a[1]=4;
a[2]=5;
- 배열 객체 값 읽어오기 : 참조 변수명[인덱스];
System.out.println(a[0]); //3
System.out.println(a[1]); //4
System.out.println(a[2]); //5
- 없는 인덱스를 사용하면 예외(exception)가 발생하고 프로그램 종료
System.out.println(a[2]); //5 출력
System.out.println(a[-1]); //예외 발생
System.out.println(a[2]); //예외 발생
3. 1차원 배열을 생성하는 다양한 방법
1) 배열 객체를 생성하고 값 대입하기
- 배열의 객체를 먼저 선언하고 이후 각 인덱스 위치마다 값을 대입
- 자료형[] 참조 변수명 = new 자료형[배열의 길이]'
참조 변수명[0] = 값;
참조 변수명[1] = 값;
...
참조 변수명[배열의 길이 -1] = 값;
int[a] = new int[3];
a[0]=3;
a[1]=4;
a[2]=5;
2) 배열 객체 생성과 함께 값 대입하기
- 배열 객체를 생성함과 동시에 값을 대입
- 초깃값을 직접 넣어 주므로 컴파일러에 따른 강제 초기화 과정은 생략
- 배열의 길이는 다음에 나오는 중괄호({})안의 초기화 데이터 개수로 결정
- 자료형[] 참조 변수명 = new 자료형 []{값, 값, 값,...,값} ;
int[] a = new int[]{3,4,5};
3) 대입할 값만 입력하기
- new 키워드 없이 초기화할 값만 중괄호에 넣어 대입
- 초기화 데이터의 개수가 배열의 길이 결정
- 자료형 [] 참조 변수명 = {값, 값, 값,...값};
int a[]={3,4,5};
4) 변수 선언과 값 대입의 분리 가능 여부
-방법 3은 변수 선언과 값의 대입을 분리할 수 없다는 제약조건이 따름
-방법 3은 선언과 대입을 분리할 수 없다는 특징 떄문에 메서드의 입력매개변숫값으로는 사용할 수 없음
- 방법 2 (선언과 객체 대입 분리 가능)
int[] a= new int{3,4,5}; //o
int[]a;
a = new int[]{3,4,5}; //o
- 방법 3(선언과 객체 대입 분리 불가능)
int[] a={3,4,5}; //o
int[] a;
a=[3,4,5}; //x
4. 참조 변수와 배열 객체의 값 초기화하기
- 스택 메모리 변수를 초기화 하지 않으면 메모리 공간은 텅 비어 있음
- 기본 자료형 변수이든, 참조 자료형 변수이든 모든 변수는 스택 메모리에 위치
- 모든 변수는 초기화 이후에만 출력가능
- 초기화 하지 않을 떄의 초깃값
int a; //기본 자료형
int[] b; //참조 자료형
System.out.println(a); //오류 발생
System.out.printlna(b); //오류 발생
- 기본 자료형과 참조 자료형의 초깃값
->기본 자료형의 초깃값으로는 '값', 참조 자료형의초깃값으로는 'null'사용
int a=0; //기본 자료형
int[] b = null; //참조 자료형
System.out.println(a); //0 출력
System.out.println(b); //null 출력
- 스택 메모리의 초깃값과 참조 자료형의 강제 초깃값
package arrray;
import java.util.Arrays;
public class array_1 {
public static void main(String[] args) {
//스택 메모리 값(강제 초기화 되지 않음)
int value1;
//System.out.println(value1); //오류
int [] vaule2;
//System.out.println(value2); //오류
int value3 =0; //0으로 초기화
System.out.println(value3);
int[] value4 = null; //null로 초기화
System.out.println(value4);
System.out.println();
//힙 메모리의 초깃값(강제 초기화)
//@기본 자료형 배열
boolean[] array1 = new boolean[3]; //false로 초기화
for(int i=0; i<3; i++) {
System.out.println(array1[i]+"");
}
System.out.println();
int[] array2= new int[3]; //0으로 초기화
for(int i=0; i<3; i++) {
System.out.println(array2[i]+"");
}
System.out.println();
double[] array3 = new double[3]; //0.0으로 초기화
for(int i=0; i<3; i++) {
System.out.println(array3[i]+"");
}
System.out.println();
//@참조 자료형 배열
String[] array4 = new String[3]; //null로 초기화
for(int i=0; i<3; i++) {
System.out.println(array4[i]+"");
}
System.out.println();
System.out.println();
//배열을 한번에 출력
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
System.out.println(Arrays.toString(array3));
System.out.println(Arrays.toString(array4));
}
}
5. 참조 자료형으로서 배열의 특징
- 기본 자료형과 참조 자료형에서 변수를 복사할 때를 비교
- 변수의 (스택 메모리 값) 복사
- 기본 자료형은 스택메모리에 실제 데이터값을 저장하고 있으므로
기본 자료형 변수를 복사하면 실제 데이터 값이 1개 더 복사
- 복사된 값을 아무리 변경해도 원본 값은 아무런 영향도 받지 않음
int a=3;
int b=a;
b=7;
System.out.println(a); //3
System.out.println(b); //7
- 참조 자료형은 스택 메모리에 힙 메모리에 저장된 객체의 위치를 저장
- 참조 자료형 변수를 복사하면 실제 데이터의 위칫값 복사
- 하나의 참조 변수를 이용해 데이터를 수정하면 다른 참조 변수가 가리키는 데이터도 변하게 됨
int[] a= {3,4,5};
int[] b=a;
b[0] = 7;
System.out.println(a[0]); //7
System.out.println(b[0]); //7
- 기본 자료형과 참조 자료형의 특징 비교
package arrray;
public class array_2 {
public static void main(String[] args) {
//기본 자료형의 대입 연산
int value1=3;
int value2=value1;
value2=7;
System.out.println(value1);
System.out.println(value2);
System.out.println();
//참조 자료형의 대입 연산
int[] array1 = new int[] {3,4,5};
int[] array2= array1;
array2[0]=7;
System.out.println(array1[0]);
System.out.println(array2[0]);
}
}
6. 반복문을 이용해 배열 데이터 읽기
1) 배열의 길이
- 반복의 횟수를 결정하기 위해서는 먼저 배열의 길이를 알아야 함
- 배열 참조 변수.length
->포인트 연산자(.) : 해당 참조 변수가 가리키는 곳으로 가라
-> length : 객체에 포함된 읽기 전용 속성, 배열 객체의 방 개수에 해당하는 값
-> 배열 참조 변수가 가리키는 곳에 가면 배열 객체가 있는데, 그 배열의 방의 개수를 가져오라
int a[] = new int[]{3,4,5,6,7};
System.out.println(a.length); //5
- 반복문을 이용한 1차원 배열의 값 출력
int a[] = new int[100];
a[0]=1, a[1]=2,..,a[99]=100;
for(int i=0; i<a.length; i++) {
System.out.println(a[i]);
}
2) for - each 문
- 배열이나 컬랙션(collection) 등의 집합 객체에서 원소들을 하나씩 꺼내는 과정을 반복하는 구문
- 집합 객체의 원소들을 출력할 떄 사용
- for (원소 자료형 변수명 : 집합 객체) {
}
int[] a= new int[100];
a[0]=1, a[1]=2,..,a[99]=100;
for(int k : a) {
System.out.println(k);
}
3) Arrays.toString(1차원 배열 참조 변수))
- Arrays 클래스의 toString() 정적 메서드 사용
- import java.util.Arrays 필요
- System.out.println(Arrays.toString(1차원 배열 참조 변수))
- 1차원 배열의 원소 값 출력
package arrray;
import java.util.Arrays;
public class array_3 {
public static void main(String[] args) {
int[] array = new int[] {3,4,5,6,7};
//배열의 길이 구하기
System.out.println(array.length);
//출력하기 1
//배열의 인덱스 번호를 사용해 배열의 모든 원소 값을 1개씩 출력
System.out.print(array[0]+"");
System.out.print(array[1]+"");
System.out.print(array[2]+"");
System.out.print(array[3]+"");
System.out.print(array[4]+"");
System.out.println();
//출력하기 2
//for 문 사용
for(int i=0; i<array.length; i++) {
System.out.print(array[i]+"");
}
System.out.println();
//출력하기 3
//for-each문 사용
for(int k:array) {
System.out.print(k+"");
}
System.out.println();
//출력하기 4
//Arrays 클래스의 toString()메서드 사용
System.out.println(Arrays.toString(array));
}
}
'Java' 카테고리의 다른 글
5-2장 문자열을 저장하는 String (0) | 2023.04.23 |
---|---|
5-1장 배열 (2) (0) | 2023.04.22 |
4-2장 제어 키워드 (0) | 2023.04.21 |
4-1장 제어문 (2) 반복문 (0) | 2023.04.21 |
4-1장 제어문 (1) 조건문 (0) | 2023.04.21 |