본문 바로가기
Java

Java 복습_08

by 지민재 2022. 7. 4.
반응형
SMALL

배열이란?

자료를 순차적으로 관리하는 구조, 배열

학교에 학생이 100명 있습니다. 학번의 자료형을 정수라고 하면 학생이 100명일 때 int studentID1, int studentID2, int studentID3,...,int studentId100 이렇게 변수 100개를 선언해서 사용해야 합니다. 그런데 학번에 대한 여러 개 변수들을 일일이 쓰는 것은 번거로운 일입니다. 이때 사용하는 자료형이 **배열(array)**입니다.

  • 배열을 사용하면 자료형이 같은 자료 여러개를 한 번에 관리할 수 있습니다.
  • 배열은 자료가 연속으로 나열된 자료구조입니다.

배열 선언과 초기화

  • 배열을 사용하려면 먼저 배열을 선언해야 합니다.
  • 배열도 변수와 마찬가지로 자료형을 함께 선언합니다.
자료형[] 배열이름 = new 자료형[개수];
자료형 배열이름[] = new 자료형[개수];
  • 배열을 이루는 각각의 자료를 배열요소라고 합니다. 배열 요소는 자료형이 모두 같습니다.
  • 먼저 저장하려는 자료의 성격에 맞게 자료형을 정하고 선언하려는 배열의 요소 개수만큼[] 안에 적습니다.
  • new 예약어는 배열을 새로 만들라는 의미입니다.
  • 배열형 자료라는 의미로 변수 앞에 **자료형[]**을 사용하는 자료형[] 변수이름 = new 자료형[개수]; 선언 방식이 조금 더 유의미합니다.(물론 두 방법 모두 올바른 사용방법입니다.)
  • 상기 선언 방식을 사용해서 학생들의 학번을 배열로 선언하면
int[] studentIDs = new int[10]; // int형 요소가 10개인 배열 선언
  • int형 요소가 10개인 배열을 선언한 것입니다. 이렇게 선언했을 때 메모리 상태를 그림으로 나태내면 다음과 같습니다.

  • 배열을 선언하면 선언한 자료형과 배열 길이에 따라 메모리가 할당됩니다.
  • 위 그림을 보면 자료형이 int형이므로 배열 요소를 저장할 수 있는 공간의 크기는 전부 4바이트로 동일합니다.
  • 배열 요소를 저장할 수 있는 공간이 총 10개이므로 이 배열을 위해 총 40바이트의 메모리가 할당되는 것입니다.

배열 초기화하기

  • 자바에서 배열을 선언하면 그와 동시에 각 요소의 값이 초기화됩니다.
  • 배열의 자료형에 따라 정수는 0, 실수는 0.0, 객체 배열은 null로 초기화 되며, 다음처름 배열 선언과 동시에 특정 값으로 초기화할 수도 있습니다.
  • 배열리 초기화 요소의 개수만큼 생성되므로 []안의 개수는 생략합니다.
int[] studentIDs = new int[]{101, 102, 103}; // 개수는 생략함
  • 다음과 같이 값을 넣어 초기화할 때 []안에 개수를 쓰면 오류가 발생합니다.
int[] studentIDs = new int[3]{101, 102, 103}; // 오류 발생
  • 선언과 동시에 초기화 할 때 다음과 같이 new int[]부분을 생략할 수도 있습니다. int형 요소 3개가 배열을 생성한다는 의미이므로 new int[]를 생략해도 됩니다.
int[] studentIDs = {102, 102, 103}; // int형 요소가 3개인 배열 생성
  • 하지만 다음과 같이 배열의 자료형을 먼저 선언하고 초기화하는 경우에는 new int[]를 생략할 수 없습니다.
int[] studentIDs; // 배열 자료형 선언
studentIDs = new int[]{101, 102, 103}; // new int[]를 생략할 수 없음

배열 사용하기

  • 선언한 배열의 각 요소에 값을 넣을 때나 배열 요소에 있는 값을 가져올 때는 []를 사용합니다.
  • 만약 배열의 첫 번째 요소에 값 10을 저장한다면 다음처럼 코드를 작성합니다.
studentIDs[0] = 10;  // 배열의 첫 번째 요소에 값 10을 저장

인덱스 연산자

  • []는 배열을 처음 선언할 때 사용한 연산자입니다. 배열 이름에 []를 사용하는 것을 인덱스 연산이라고 합니다.
  • 인덱스 연산자의 기능은 배열 요소가 저장된 메모리 위치를 찾아 주는 역할 입니다.
  • 변수 이름으로 변수가 저장된 메모리의 위치를 찾는 것처럼, 배열에서 [i] 인덱스 연산을 하면 i번째 요소의 위치를 찾아 해당 위치의 메모리에 값을 넣거나 이미 저장되어 있는 값을 가져와서 사용할 수 있습니다.
  • 예를 들어 int형으로 선언한 num배열의 네 번째 요소에 값 25를 저장하고, 그 값을 가져와 int형 변수 age에 저장한다면 다음 그림과 같습니다.

배열의 물리적 위치와 논리적 위치는 같습니다.
물리적(physical)위치란 배열이 메모리에서 실제 저장되는 곳을 의미하며, 논리적(logical) 위치란 이론상 배열 위치를 의미합니다. 배열은 요소 10개를 선언하면 사용하는 실제 값도 바로 이웃한 메모리에 놓입니다. 즉 '5 다음에 10이 있다'는 논리적 순서와 실제 메모리를 살펴보면 값 5가 놓인 메모리 주소에서 4바이트(int형 크기) 다음 메모리 주소에 값 10이 놓입니다.

배열의 순서는 0번 부터

  • 배열 길이(처음에 선언한 배열 전체 요소 개수)가 n이라고 하면, 배열 순서는 0번부터 n-1번까지 입니다.
  • 0번 요소를 배열의 첫 번째 요소라고 합니다.
package study01;

public class Git_Java_1 {

	public static void main(String[] args) {
		int[] num = new int[] {1,2,3,4,5,6,7,8,9,10};

		for(int i = 0; i < num.length; i++) {
			System.out.println(num[i]);
		}
	}

}
/*실행결과
1
2
3
4
5
6
7
8
9
10
*/

 

!! 배열의 첫 번째 요소 인덱스는 0부터 시작합니다.

0부터 9까지 반복이면 조건식을 i<=9로 쓰는 게 더 좋은것이 아닌가?
i<=9 보다는 i < 10으로 하는것이 더 직관적입니다. 왜냐하면 10이 배열의 길이이므로 10으로 쓰는 것이 훨씬 직관적이기 떄문입니다. 배열 객체의 속성인 length를 사용하면 배열의 길이를 쉽게 알 수 있습니다.

  • 자바의 배열은 배열의 길이를 나타내는 length 속성을 가집니다.
  • 자바에서 배열 길이는 처음에 선언한 배열의 전체 요소 개수를 의미합니다. 전체 길이를 알고 싶은 배열 이름 뒤에 마침표(.) 연산자를 붙이고 length 속성을 쓰면 배열 길이를 반환합니다.
  • for문의 조건에서 얼만큼 반복할지 결정해야 하는데, 배열 요소 끝까지 반복하기 위해 배열 전체 길이(length)를 넣습니다, 따라서 num.length 값은 10이 됩니다.
  • 이렇게 배열 전체 길이만큼 수행문을 반복해야 할 때는 숫자를 직접 사용하는 것보다 length 속성을 사용하는 것이 좋습니다.

객체 배열 사용하기

  • 동일한 기본 자료형(int 등)변수 여러 개를 배열로 사용할 수 있듯이 참조 자료형 변수도 여러 개를 배열로 사용할 수 있습니다.
  • 객체배열은 int나 char등 기본 자료형 배열과 사용방법이 조금 다릅니다.
package study01;

public class Book {
	private String bookName;
	private String author;

	public Book() {
	} // 디폴트 생성자

	public Book(String bookName, String author) {
		this.bookName = bookName;
		this.author = author;
	}

	public String getBookName() {
		return bookName;
	}

	public void setBookName(String bookName) {
		this.bookName = bookName;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public void showBookInfo() {
		System.out.println(bookName + "," + author);
	}
}

Book 클래스는 책 이름과 저자를 멤버 변수로 가지는 클래스 입니다 .디폴드 생성자 외에도 책 이름과 저자 이름을 받는 생성자를 하나 더 구현했습니다.

package study01;

public class Array02_test {

	public static void main(String[] args) {
		Book[] library = new Book[5]; // Book 클래스형으로 객체 배열 생성

		for (int i = 0; i < library.length; i++) {
			System.out.println(library[i]);
		}
	}

}
실행결과
null
null
null
null
null
  • Book[] library = new Book[5]; 문장을 보면 Book 인스턴스 5개가 생성된 것처럼 보이나 Book 인스턴스 5개가 바로 생성되는 것은 아닙니다. 이때 만들어 지는 것은 인스턴스 주소를 담을 공간 입니다.
  • Book[] library = new Book[5];는 각각의 Book인스턴스 주소 값을 담을 공간 5개를 생성하는 문장입니다.
  • Book 주소값을 담을 공간이 5개 만들어 지고 자동으로 각 공간은 비어 있다는 의미의 null 값으로 초기화됩니다.

향상된 for문과 배열

  • JDK1.5부터 제공되는 향상된 for문(enhanced for loop)은 배열의 처음부터 끝까지 모든 요소를 참조할 때 사용하는 편리한 반복문 입니다.
  • 향상된 for문은 배열 요소 값을 순서대로 하나씩 가져와서 변수에 대입합니다.
  • 따로 초기화와 종료 조건이 없기 때문에 모든 배열의 시작 요소부터 끝 요소까지 실행합니다.
for(변수 : 배열) {
	반복 실행문;
}

다차원배열

  • 이차원 이상으로 구현한 배열을 다차원 배열
  • 다차원 배열은 평면이나 공간 개념을 구현하는 데 사용합니다.

이차원 배열

  • 다음은 2행 3열의 이차원 배열을 선언하는 코드의 논리적 구조입니다.

  • 배열의 모든 요소를 참조하려면 각 행을 기준으로 열 값을 순회하면 됩니다. -이차원 배열을 초기화하려면 다음처럼 행과 열 개수에 맞추어서 중괄호 {}안에 콤마(,)로 구분해서 값을 적습니다.
  • 이렇게 이차원 배열을 초기화하면 괄호 안에 적은 6개의 값이 순서대로 arr 배열의 각 요소에 저장됩니다.

package study01;

public class Array02_test {

	public static void main(String[] args) {
		Book[] library = new Book[5]; // Book 클래스형으로 객체 배열 생성

		for (int i = 0; i < library.length; i++) {
			System.out.println(library[i]);
		}
	}

}
/*
실행결과
1
2
3

4
5
6
*/

'Java' 카테고리의 다른 글

Java 복습_10  (0) 2022.07.10
Java 복습_09  (0) 2022.07.06
Java 복습_7  (0) 2022.06.29
Java 복습_6  (0) 2022.06.18
Java 복습_5  (0) 2022.06.09

댓글