안 씀/java-개념

1차원 배열

unhyepnhj 2024. 5. 4. 18:53

배열(array): 인덱스와 인덱스에 대응하는 데이터들로 이루어진 연속적인 자료 구조

- 같은 종류의 데이터들이 순차적으로 저장

배열을 사용하는 이유


일차원 배열

- C나 C++과 달리 두 단계로 이루어짐

  • 배열에 대한 레퍼런스 변수 선언
  • 데이터를 저장할 공간 할당 

 

1. 배열 선언: 배열 선언문으로 레퍼런스 변수를 선언

- 배열의 타입은 배열을 구성하는 원소의 타입

int intArray[];		//이렇게나
int[] intArray;		//이렇게 선언할 수 있음

- 이 선언만으로는 배열 공간이 할당되지 않으며, 레퍼런스 변수 intArray만 생성(정수를 저장할 공간이 생성되지 않았으므로 intArray의 값은 null)

- intArray는 주소 값(레퍼런스 값)을 가지며 그 자체가 배열은 아님

 

※배열 선언 시 [ ]안에 배열 크기를 지정하면 안 됨

int intArray[10];		//컴파일 오류

 

2. 배열 생성: 데이터를 저장할 배열 공간을 할당

- new 연산자를 사용하여 배열을 생성

- [ ]안에 생성할 원소 개수 지정

intArray = new int[5];

 

+ 배열 선언, 생성 동시에

int intArray[];
intArray = new int[5];				//따로따로

int intArray[] = new intArray[10];		//동시에

 

배열 초기화

- 배열 선언문에서 { }안에 원소를 나열하여 초기화된 배열 생성 가능

int intArray[] = {4, 3, 2, 1, 0};			//배열 크기는 자동으로 5가 됨
double doubleArray[] = {0.1, 0.2, 0.3, 0.4};		//배열 크기는 자동으로 4가 됨

- 생성되는 배열의 원소 개수는 { }안에 나열된 값의 개수로 정해지므로 [ ]안에 크기를 설정해서는 안 됨

초기화하여 생성한 결과


배열 인덱스와 원소 접근

- 배열의 인덱스는 정수만 가능

- 인덱스는 0부터 시작

- 마지막 원소의 인덱스는 (배열 크기-1)

 

배열 변수명과 [ ] 사이에 원소의 인덱스를 적어 접근

int intArray[] = new int[3];		//원소 3개, 인덱스는 0~2까지 가능
intArray[0] = 5;
intArray[1] = 4;
intArray[2] = 3;
int n = intArray[1];			//원소 1의 값을 읽어 n에 저장 -> n=4

 

인덱스의 범위

n = intArray[-2];		//실행 오류(인덱스로 음수 사용 불가)
n = intArray[3];		//실행 오류(intArray 인덱스의 범위(0~2) 초과)

 

반드시 배열을 생성한 후 접근

int intArray[];			//배열 레퍼런스만 선언(저장 공간 할당하지 않음)
intArray[1] = 8;		//오류(생성되지 않은 배열 사용)

- 배열의 원소에 접근하려면 반드시 배열이 생성(=공간 할당)돼 있어야 함

- 배열이 생성되지 않은 상태에서 배열을 사용하면 컴파일 오류나 실행시간 오류 발생


레퍼런스 치환과 배열 공유

- java에서는 레퍼런스 변수와 배열 공간이 분리

- 다수의 레퍼런스가 하나의 배열 공간으르 가리키는 배열 공유 가능

int intArray[] = new int[5];
int myArray[] = intArray;		//레퍼런스 치환 -> myArray는 intArray와 동일한 배열을 참조

- 두 번째 라인은 레퍼런스 변수 myArray를 생성하고 intArray 변수의 값을 myArray에 치환하는 코드

- intArray 배열이 복사되는 것이 아니라 배열에 대한 주소(=레퍼런스)만 복사됨

- myArray는 intArray와 동일한 레퍼런스 값을 가지게 됨 -> myArray는 intArray의 배열을 공유

- myArray로 intArray의 배열 원소에 접근 가능

intArray와 myArray가 같은 배열을 참조하기 때문에, myArray[1]=6; 에 의해 먼저 기록된 값 2가 6으로 변경


 

배열의 크기

- 자바는 배열을 객체로 관리

- 배열이 생성되면 객체가 생성

- 객체에는 배열의 저장 공간과 함께 배열의 크기 값을 가진 length 필드가 존재

int intArray[] = new int[5];
int size = intArray.length;		//size=5

- length 필드를 이용하여 배열의 크기를 알아낼 수 있음

for(int i=0; i<intArray.length; i++){
	...
}

- 배열의 크기만큼 반복할 때 유용


 

배열과 for-each문

for(변수:배열레퍼런스){
	...반복문...
}

※for-each문: 기존의 for문을 변형하여 배열이나 나열(enumeration)의 크기만큼 루프를 돌며 각 원소를 순차적으로 접근하기 위해 만든  for문

//배열 n에 들어 있는 모든 정수를 더하는 코드

int[] num = {1, 2, 3, 4, 5};
int sum = 0;
for(int k:num){		//반복될 때마다 k가 num[0], num[1], ..., num[4]로 설정
	sum += k;
}
System.out.println("합: "+sum);

//합: 15
//문자열 배열에 있는 모든 문자열을 for-each문으로 출력하는 코드

String fruits[] = {"사과", "배", "바나나". "체리", "딸기"};
for(String s:fruits){		//반복할 때마다 s는 fruits[1], fruits[1], ..., fruits[4]로 설정
	System.out.print(s + " ");
}

//사과 배 바나나 체리 딸기
//나열 타입(enum)에 대해서도 for-each문 가능

enum Week{월, 화, 수, 목, 금, 토, 일}		//enum타입 Week 선언
for(Week day:Week.values()){
	System.out.print(day+"요일");
}

//월요일 화요일 수요일 목요일 금요일 토요일 일요일

 


예제 3-7 양수 5개를 입력받아 배열에 저장하고 가장 큰 수를 출력하는 코드 작성

 

예제 3-8 length 필드를 이용하여 배열 크기만큼 정수를 입력받고 평균을 구하는 코드 작성

 

예제 3-9 for-each문을 이용하여 다음 출력문이 출력되도록 코드 작성

>>