5장 참조자료형 : 배열
배열 : 같은 자료형의 데이터를 묶어서 저장하는 참조 자료형으로, 집합체다.
(참조형 자료형은 항상 new키워드를 통해 메모리를 할당받아서 생성을 먼저 시켜야 사용이 가능하다)
(즉, 배열은 항상 크기가 미리 정해져 있어야한다. 한번 크기가 정해지면 절대 변경할 수 없다)
*배열 자체는 객체다.
차이점 * int [ ] -> 일반 자료형 배열( 원소의 값을 저장) *String[ ]-> 참조자료형 배열( 주소값을 저장) |
*String 클래스의 2가지 객체 생성법*
-1. 암묵적 생성:(implicit)
String a = "Rabbit";
String b = "Jack";
와 같이 직접 문자열을 생성했을 때, 힙영역에 객체가 생성된다.
-2. 명시적 생성:(explicit)
String a = new String();
a = "Rabbit";
new 키워드를 사용하여 직접 String 클래스의 객체를 생성하는 순간, 힙영역에
객체가 생성되고, 객체 a에는 값이 아닌 '주소'가 저장된다. (new = 힙 메모리에 객체를 넣어라)
이 말은 즉
String a ="Rabbit"; String b = new String(); b = "Rabbit"; |
얼핏보면 String a,b는 같아보이지만
sysout으로 불리언식으로 비교하여 출력해보면, false가 뜬다.
즉 2개는 각 다른 객체로 봐야한다. 아래처럼 테스트해볼 수 있다.
package ex1;
//참조자료형 배열은 결국은 생성된 객체의 주소를 배열의 인덱스에
// 하나씩 값을 저장하는 것이 아니라. 즉 주소값을 인덱스에 저장한다.
public class Ex4_Array {
public static void main(String[] args) {
String[] str = new String[3];
str[0] = "Test";
str[1] = new String("Test");
str[2] = "Test";
// 위의 코드에서 힙영역에 생성되는 객체는 몇개 ???**** 3개
// 1. 6번째 줄에서 배열 객체 1개 생성, 2. 7번째 줄에서 "Test"라는 객체 형성
// 3. new 키워드로 1개 다른 객체 형성 4.
// 9번째 줄은 7번줄하고 같은 주소의 객체이므로 같다.
// 주소값 비교로 확인 가능
System.out.println(str[0] == str[1]); //false
System.out.println(str[0] == str[2]); //true
}
}
다시 배열로 돌아와서
배열의 선언과 초기화, 배열을 출력하는 메소드를 for문을 이용하여 만들어 출력해보기
메소드는 for문, for-each문 각 사용한 메소드 2개를 따로 만들었고, 하나는 주석처리 되어있다.
배열 4개에 선언과, 원소값 직접 대입 등 다양하게 적용해보았다.
*배열을 출력할 때 for문 사용하기:
-1. for(int i = 0; i < array.length; i++){
System.out.println([ i ] +[ j ]); }( 출력부분 자세한 코드는 생략)
-2. for-each문
for(int e : array){
System.out.println(e);}
=> 원리는 array 속의 int e를 찾는다' 이다. 즉 e는 원소값 그 자체로 for each문을
이렇게 사용하면, 원소값을 차례대로 간단한 식으로 출력이 가능하다.
package my;
public class Ex3_printArray_Repeat {
public static void main(String[] args) {
intType();
}
private static void intType() {
// 선언과 초기화를 한번에
int[] array1 = { 1, 2, 3 };
array1[0]=22;
// printArray(array1);
printArray2(array1);
// 배열출력 메소드 소환 : 배열1
System.out.println("--------------");
int[] array2 = new int[4]; // 0
array2[0]= 10;
array2[1]=11;
array2[2]=12;
array2[3]=13;
printArray2(array2);
// printArray(array2);
// 배열출력 메소드 소환 : 배열2
System.out.println("--------------");
int[] array3;
array3 = new int[5];
array3[0]=1;
// printArray(array3);
printArray2(array3);
// 배열출력 메소드 소환 : 배열3
System.out.println("--------------");
int[] array4 = { 1, 2, 3, 4, 5, 6, 7 };
printArray2(array4);
// printArray(array4);
// 배열출력 메소드 소환 : 배열4
}
private static void printArray2(int[] array) {
//배열을 간단한 방식으로 출력하기
System.out.println(array.length);
for(int e : array) {
System.out.println(e);
//e는 값 그 자체이므로 a[0] 이런방식이 아님
// a[0] = 배열 a의 0번째 값 , e = 배열 array이의 값 (차례로 출력)
}
}
/*
* // 배열을 출력해주는 메소드 array는 매개변수 private static void printArray(int[] array) {
* System.out.println(array.length); //길이
*
* for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } //
* print
*/
}
다른 소스 추가+
package book;
// 1차원 배열의 원소 값 대입의 3가지 방법
public class Page158 {
public static void main(String[] args) {
//배열의 값 대입 방법1
int[] array1 = new int[3];
array1[0] = 3;
array1[1] = 4;
array1[2] = 5;
for(int i=0; i < array1.length; i++) {
System.out.print(array1[i]+"\t");
}
int[] array2;
array2 = new int[3];
array2[0] = 3;
array2[1] = 4;
array2[2] = 5;
for(int e: array2) {
System.out.print(e+"\t");
}
//배열의 값 대입 방법 2
int[] array3 = new int[] {3,4,5};
for(int e: array3) {
System.out.print(e+"\t");
}
int[] array4;
array4 =new int[] {3,4,5};
for(int i = 0; i < array4.length; i++) {
System.out.print(array4[i]+"\t");
}
//배열의 값 대입 방법3
int[] array5 = {3,4,5};
for(int e: array5) {
System.out.print(e+"\t");
}
// int[] array6;
// array6 = {3,4,5};
// 이런 방식은 불가가능 생성이 안된
//배열은 선언문에서만 초기화가 가능
}
}
교재 다른 예제 연습.
Arrays.toString (자료형에 각 맞춰서 사용. String형은 object형 쓰면됌)
: 배열의 모든 원소를 한번에 출력해주는 함수. 아래 소스의 맨 마지막에 써봤음
package book;
import java.util.Arrays;
// 스택 메모리의 초깃값과 참조 자료형의 강제 초깃값
public class Page161 {
public static void main(String[] args) {
// 스택 메모리 값 (강제 초기화되지 않음)
int value3=0;
System.out.println(value3);
int[] value4 = null;
System.out.println(value4);
System.out.println();
// 힙 메모리의 초깃값( 강제 초기화)
// @기본 자료형 배열
boolean[] array1 = new boolean[3];
for(int i=0; i < array1.length; i++) {
System.out.println(array1[i]+" ");
}
System.out.println();
int[] array2 = new int[3];
for(int i=0; i < 3; i++) {
System.out.println(array2[i]+" ");
}
System.out.println();
double[] array3 = new double[3];
for(double i: array3) {
System.out.println(i);
}
// @참조 자료형 배열
String[] array4 = new String[3];
for(String e : array4) {
System.out.println(e);
}
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));
}
}