배열

배열이란?

같은 타입의 여러 변수를 하나로 묶어 다루는 것을 말한다.

// 변수 선언
int score1, score2, score3, score4, score5;

// 배열 선언
int[] score = new int[5];

같은 타입의 변수를 5개 선언하는 것과 배열의 공간을 5개 선언하는 것 두 개가 같은 의미가 될 수 있다.

1. 배열의 선언과 생성

1.1. 배열의 선언

  • 1. int[] score;
  • 2. int score[];

위 두 가지 방식 중 1번을 가장 많이 사용하며 2번의 경우 배열과 기본형이 혼동될 수 있다.

1.2. 배열의 생성

'new' 연산자를 사용하여 생성한다.

// 배열 선언
int[] score;

// 배열 생성
score = new int[5];

배열을 선언하면 메모리에 변수의 저장 공간이 생성된다.

배열을 생성하면 변수의 저장 공간에 배열의 주소 값이 저장된다.

int형의 배열은 기본값으로 배열에 0이 들어간다.

배열의 선언과 생성

2. 배열의 길이와 인덱스

2.1. 배열의 인덱스

  • 배열의 요소(element) : 배열의 각 저장 공간(score[0] ~ score[2])
  • 접근 방법 : 배열의 이름[인덱스 번호] ex) score[0]
  • 저장 방법 : score[0] = 100;
  • 읽는 방법 : int n = score[0];
  • 인덱스에 상수 대신 변수로 사용 가능하다.
  • 배열의 길이를 벗어나는 인덱스를 사용 시 ArrayIndexOutOfBoundsException 에러가 발생한다.
  • 인덱스를 변수로 사용하면 컴파일 시 에러를 파악하지 못하여 실행 중에 에러가 발생한다.

2.2. 배열의 길이

  • 배열의 길이 접근 방법 : 배열.length
  • 배열의 최대 길이 : int의 최댓값, 약 20억
  • 길이가 0인 배열 생성 가능하다.
  • 길이는 요소를 저장할 수 있는 공간의 개수이다.
  • 배열의 길이는 상수이며 변하지 않고 변경할 수도 없다.
// for문을 이용한 배열 접근

int[] list = new int[]{10, 20, 30, 40, 50};	// 배열 선언 및 생성

for(int i = 0; i < list.length; i++) {	// 배열의 길이를 이용한 for문
	System.out.println(list[i]);	// 변수를 이용한 배열 접근
}

2.3. 배열의 길이 변경하기

  1. 더 큰 배열을 생성한다. ex) new int[10];
  2. 기존 배열(new int[5])을 큰 배열에 복사한다.

3. 배열의 초기화

// 변수 선언
int[] score = new int[]{10, 20, 30, 40, 50}; // {}안에 값의 개수에 의해 길이 지정된

int[] score = new int[]{10, 20, 30, 40, 50}; // 생성과 동시에 초기화 가능
int[] score = {10, 20, 30, 40, 50}; // 선언과 동시에 초기화 가능

int[] score;
score = {10, 20, 30, 40, 50}; // 에러 발생
score = new int[]{10, 20, 30, 40, 50}; // 정상

// 메소드 사용
int add(int[] arr) {...}

add(new int[]{10...80}); // 정상
add({10...80}); // 에러

3.1. 길이가 0인 배열

// 길이가 0인 배열 생성
int[] score = new int[0];
int[] score = new int[]{};
int[] score = {};

3.2. 배열의 출력

int[] arr = {10 ... 80};

// 1. 10부터 80까지 한줄씩 출력
for(int i = 0; i < arr.length; i++) {
	System.out.println(arr[i]);
}

// 2. 배열의 주소 출력
System.out.println(arr);

위의 예제 중 1번은 for문을 이용해서 배열의 요소를 읽어오면서 출력하는 예제이고 2번은 arr변수에 저장되어있는 배열의 주소를 출력하는 예제이다.

 

System.out.println은 Char형 배열을 구분자 없이 출력

char[] crr = {'A', 'B', 'C'};

System.out.println(crr); // ABC 출력

4. 배열의 복사

int[] source = new int[5];
int[] target = new int[7];

// source의 길이만큼 for문을 돌면서 target 요소에 값 넣기
for(int i = 0; i < source.length; i++) {
	target[i] = source[i];
}

source = target;

Ox110은 사용하지 않아 JVM의 가비지 컬렉터에 의해 자동으로 메모리에서 제거된다.

 

System.out.arrycopy() 함수를 이용한 복사

System.out.arrycopy(source, 0, target, 0, source.length); // source[0]에서 target[0]으로 source.length개의 데이터 복사

5. 배열의 활용

5.1. 배열의 위치 랜덤 하게 바꾸기

// 배열의 위치 랜덤하게 바꾸기
int[] num = new int[]{10, 20, 30, 40, 50, 60, 70, 80};

for(int i = 0; i < num.length; i++) {
  int n = (int) Math.random() * 10;
  
  int t = num[0]
  num[0] = num[n];
  num[n] = t;
}

5.2. 로또 번호 생성기

int[] num = new int[7];

for(int i = 0; i < num.length; i++) {
  int n = (int) Math.random() * 45;
  
  int t = num[i];
  num[i] = num[n];
  num[n] = t;
}

5.3. 버블 정렬을 이용한 오름 차순

for(int i = 0; i < num.length; i++) {
	for(int j = 0; j < num.length - 1 - i; i++) {
    	if(이전 > 이후) swap();
    }
}

// 총 비교 회수는 num.length가 내림차순 되는 회수이다.
// num의 길이가 5이면

// 1 => 5 - 1 => 4회
// 2 => 5 - 2 => 3회
// 3 => 5 - 3 => 2회
// 4 => 5 - 4 => 1회
// 5 => 5 - 5 => 0회

// 총 10번의 비교를 한다.
// 버블 정렬은 비효율적이나 간단하다.

6. String 배열

6.1. String 배열의 선언과 생성

String[] str = new String[5]; // 기본 값 : null

6.2. String 배열의 초기화

// 초기화 1
String[] names = new String[3];

names[0] = "개";
names[1] = "발";
names[2] = "자";


// 초기화 2
String[] names = new String[]{"개", "발", "자"};
String[] names = {"개", "발", "자"};

String은 클래스라서 객체를 생성해야 하지만 큰따옴표("") 리터럴을 이용하여 생성 가능하다.

// 클래스를 이용한 초기화
names[0] = new String("개");

// 리터럴을 이용한 초기화
names[0] = "개";

참조형 배열의 경우 배열에 값이 들어가지 않고 객체의 주소가 저장된다.

참조형 변수에는 객체가 메모리에 저장된 주소인 4byte의 정수 값(Ox0 ~ Oxffffff) 또는 null이 저장된다.

7. char 배열과 String 클래스

String class는 char 배열에 여러 가지 기능을 추가하여 만든 것이다.

문자열은 변경되지 않고 추가만 되며 변경 시에는 StringBuffer를 이용하여 변경 가능하다.

7.1. String 클래스의 주요 메서드

  • charAt : 문자열에서 특정 위치의 문자 찾기
  • length : 문자열의 길이
  • substring : 문자열에서 from, to로 문자 찾기
  • equals : 대상 문자열과 같은지 비교
  • toCharArray : 문자열을 char배열로 변환

7.2. char 배열과 String 클래스의 변환

// char[] => String
char[] c = {'A', 'B', 'C'};
String s = new String(c); // ABC로 변환


// String => char[]
String s = "ABC";
s.toCharArray(); // {'A', 'B', 'C'}로 변환

8. 커맨드 라인을 통해 입력받기

// 커맨드 라인 입력
> java MainTest abc 123

main(String[] args) {
	args[0]; // "abc";
    args[1]; // "123";
}

매개변수는 공백으로 구분되기 때문에 문자열에 공백이 있다면 큰따옴표("")로 묶어서 사용해야 한다. ex) "Hello World"

main 메서드에 전달된 파라미터가 없을 때 JVM이 null 대신 크기가 0인 배열을 생성하여 매개변수로 전달한다.

9. 다차원 배열

다차원 배열이란? 2차원 이상의 배열을 말한다.

9.1. 2차원 배열의 선언과 인덱스

* 2차원 배열의 선언 방식

  1. int[][] num;
  2. int num[][];
  3. int[] num[];

차원이 늘어날수록 []가 추가된다.

 

* 2차원 배열의 길이

int[][] num = new int[4][3];

num.length => 4

num[0].length => 3

 

* 2차원 배열의 인덱스

생성 방식 : int[][] num = new int[4][3]; // 4행 3열의 배열 생성

접근 방식 : num[1][1]; // 1행 1열 읽기

9.2. 2차원 배열의 초기화

// 2차원 배열 선언 및 생성
int[][] num = new int[][]{{1, 2, 3}, {4, 5, 6}};
int[][] num = {{1, 2, 3}, {4, 5, 6}};

// 보기 좋은 선언

int[][] num = {
				{1, 2, 3},
                {4, 5, 6}
              };

9.3. 2차원 배열의 메모리 구성

2차원 배열 메모리 구성

10. 가변 배열

// 가변 배열 선언 및 생성
int[][] num = new int[5][]; // 2번쨰 차원의 길이를 지정하지 않는다.

num[0] = new int[3];
num[1] = new int[4];
num[2] = new int[5];
num[3] = new int[6];
num[4] = new int[7];


// 가변 배열 초기화
int[][] num = {
				{100, 100, 100},
                {100, 100, 100, 100},
                {100, 100, 100, 100, 100}
               };

위의 예제에서 볼 수 있듯이 num배열의 각 요소 안에 들어 있는 배열의 길이가 서로 다르다.

'개발 언어 > Java' 카테고리의 다른 글

[Java] 클래스와 객체  (0) 2021.08.20
[Java] 객체 지향 프로그래밍  (0) 2021.08.20
[Java] 제어문  (0) 2021.08.18
[Java] 연산자  (0) 2021.08.18
[Java] 형변환  (0) 2021.08.18

+ Recent posts