본문 바로가기

Java

5-1장 배열(1)

 

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