JAVA

[JAVA] 배열

개발 공주 2023. 5. 26. 23:32
728x90

1.배열

--선언

  • 📌 int 와 같은 기본형 변수는 1개의 값만 변수에 저장할 수 있다면 int[] 와 같은 배열형 변수는 여러개를 변수에 저장할 수 있습니다.
    • 여러개를 하나의 변수에 넣어놓고 들고다니거나 하나씩 꺼내서 쓸 수 있다는 점에서 분류통의 개념과 비슷합니다.
    • 단, 하나의 배열형 변수에는 같은 타입의 변수만 담을 수 있습니다. (=김치통에는 김치만!)
  • 한번에 많은 양의 데이터를 다루거나 계산할때 사용합니다.
  • 배열은 영어로 Array 라고 부릅니다.
  • 선언방법은 2가지 방법이 있습니다.
// 배열 선언

// 일반적인 선언방식
int[] intArray;    // 정수 배열
long[] longArray;
double[] doubleArray;  // 실수 배열 
char[] charArray;  // 문자 배열
String[] stringArray; // 문자열 배열

// 2번째 선언방식
int intArray[];    // 정수 배열
long longArray[];
double doubleArray[];  // 실수 배열 
char charArray[];  // 문자 배열
String stringArray[]; // 문자열 배열

--생성

  • 📌배열(Array)는 참조형 변수들처럼 new 명령을 통해서 생성하며, 대괄호[] 안에 크기를 지정해줍니다.
  • 배열을 만들때 new 명령어로 생성하고 배열에 몇개를 담을지 미리 정의해준다고 생각하면 됩니다.
  • ☝️주의할점은 사이즈를 지정해서 생성된 배열은 각 칸마다 순번이 있다는걸 기억하자.
  • 순번은 0부터 시작하기 때문에 8개 사이즈의 분류통이라면 0번~7번까지 있습니다.
  • 추가로, 분류통(배열)은 생성될때 각 타입별 초기값으로 초기화 되어 채워집니다.
    • 예를들어, int 는 0, boolean 은 false, String 은 null 값과 같은 초기값이 정해져 있습니다.
  • 여기서 중요한건 참조형 변수이기 때문에 실제 값을 담지않고 실제값의 주소값을 저장하고 있게됩니다.
// 배열 생성

//배열 생성후 초기화하면 배열의 주소가 할당된다.
int[] intArray = new int[3]; // 초기값 {0,0,0}
boolean[] boolArray = new boolean[3]; // 초기값 {false, false, false}
String[] stringArray = new String[3]; // 초기값 {"","",""}
		
//배열 선언만 해놓고 나중에 초기화를 시킬수도 있다.
int[] intArray2;
intArray2 = new int[3]; // 초기값 {0,0,0}

--순회

  • 📌배열 안에 담겨있는 변수들을 하나씩 꺼내서 사용하는것을 순회라고 합니다.
  • 먼저 배열의 값을 하나 뽑아서 조회하는 방법을 알아봅시다.
    • 앞서 설명드린것처럼 배열에는 순번이 있고 해당 순번을 통해 하나의 값을 조회할 수 있습니다.
    • 해당 배열변수 뒤에 순번을 대괄호[]로 감싸서 명시해주면 됩니다.
  • 배열을 순회하는 방법은 반복문을 사용이 가장 일반적인 방법입니다.
  • 반복문 안에서 단건 조회헀던것처럼 대괄호 [] 안에 반복문 순번값 i 를 넣어주면 됩니다. [i]
//길이가 8인 정수배열 선언
int[] intArray = new int[3];

// 배열이 초기화된 값을 출력해본다.
for(int i=0; i<intArray.length; i++) { // .length 는 배열의 길이
	System.out.println(intArray[i]);
}
.length() 메서드
length() 메서드는 배열이 지원하는 메서드로써 해당 배열의 길이값을 응답해줍니다.
배열의 길이는 처음에 선언한 크기를 가지고 있습니다.

--초기화

  • 배열(분류통)을 초기화 할때는 아래 3가지 방법이 있습니다.
    1. 중괄호{} 를 사용해서 초기화
    2. 반복문 for문을 사용해서 초기화 (또는 향상된 for문)
    3. Arrays.fill 메소드를 사용해서 초기화
      • Arrays 클래스는 Java 에서 기본으로 제공하는 메소드가 담긴 클래스 입니다.
// 배열 초기화 

import java.util.Arrays; // Arrays 클래스를 import 해주세요!

public class Main {

	public static void main(String[] args) {
		//1. 배열에 특정값 대입하며 선언
		int[] intArray = {1, 2, 3, 4, 5};
		String[] stringArray = {"a", "b", "c", "d"};

		//2-1. for문을 통해 값을 대입
		for (int i = 0; i < intArray.length; i++) {
			intArray[i] = i;
		}

		//2-2. 향상된 for문을 통한 배열 출력
		for (int i : intArray) {
			System.out.print(i); // 01234
		}

		System.out.println(); // 줄바꿈

		//3. 배열의 주소를 모두 같은값으로 초기화
		Arrays.fill(intArray, 1);//배열의 모든 값을 1로 초기화

		for (int i : intArray) {
			System.out.print(i);  // 11111
		}
	}
}

// 출력
01234
11111

--복사

  • 얕은 복사
    • 배열은 참조형 변수이며 실제값이 아닌 실제값의 주소값을 가진다고 했다.
    • 따라서 배열 변수간에 대입 연산자 = 를 사용해서 복사를 하게 되면 주소값만 복사됩니다.
    • 이렇게 주소값만 복사되고 실제값은 1개로 유지되는걸 얕은 복사 라고 합니다!
    • 주소값만 복사된다?
      • 주소값만 복사된다는건 변수명은 서로 다르지만 같은 값을 보고 있다는것을 뜻해요.
      • 비유하자면 내가 가진 핸드폰, PC 로 각각 카카오톡에 로그인해도 나의 카톡 계정은 1개인것처럼, 변수명은 여러개지만 결국 실제값은 1개인것과 같다고 보시면 됩니다.
  • 깊은 복사
    • 얕은 복사처럼 가짜 복사가 아니라 진짜 새로운 배열을 똑같이 만들고 싶을때 깊은 복사를 합니다.
    • 깊은 복사는 결국 실제 값을 가지고 있는 배열의 기본형 값을 꺼내서 복사해주면 됩니다.
    • 반복문 for 문 을 통해서 하나씩 꺼내서 복사해주는 방법과 여러 메서드를 사용하는 방법이 있습니다.
      • 어떤 메소드가 있는지는 스니펫을 참조하세요.
// 깊은 복사

int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length]; 

for (int i = 0; i < a.length; i++) {
    b[i] = a[i]; // 깊은 복사
}

b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)

System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로 입니다.

// 깊은 복사 메서드

// 1. clone() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone(); // 가장 간단한 방법입니다. 
// 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!


// 깊은 복사 메서드

import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		// 2. Arrays.copyOf() 메서드
		int[] a = { 1, 2, 3, 4 };
		int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
	}
}

2.String 배열

 

  1. 선언, 생성, 초기화
    • 배열 중에서도 가장 많이 사용하게될, 문자열 배열인, String 배열에 대해서 좀 더 자세히 알아봅시다.
    • 선언하고 생성하는 방법은 기존 배열과 동일합니다.
  • String 배열 선언과 생성
// String 배열을 아래와 같이 선언과 생성할 수 있습니다.
String[] stringArray = new String[3];
  • String 배열의 초기화
// 선언 후 하나씩 초기화 할 수 있습니다.
String[] stringArray = new String[3];
stringArray[0] = "val1";
stringArray[1] = "val2";
stringArray[2] = "val3";

// 선언과 동시에 초기화 할 수 있습니다.
String[] stringArray1 = new String[]{"val1", "val2", "val3"};
String[] stringArray2 = {"val1", "val2", "val3"};

2.String 기능 활용 (= char 배열)

  • 📌 문자열 = 문자배열
    • char 배열은 “문자배열”이고 String 은 문자열 입니다.
    • 즉 수식으로 표현하면 아래와 같습니다.
    • String = char[]
기본형 변수와 참조형 변수의 차이!
- 기본형 변수는 소문자로 시작하고 참조형 변수는 대문자로 시작합니다
- 다시한번 리마인드! 참조형 변수는 실제값의 주소값을 저장하고 있는 변수 입니다.
  • String 은 char배열과 같기 때문에 둘다 문자열을 저장할 수 있는 변수 입니다.
  • 하지만 String을 더 많이 쓰는데 그 이유는 참조형 변수가 더 많은 기능들을 가지고 있기 때문입니다.
  • char배열에는 없은 String 만 가지고 있는 기능은 아래와 같습니다.
메서드 응답값 타입  설명
length() int 문자열의 길이를 반환한다.
charAt(int index) char 문자열에서 해당 index의 문자를 반환한다
equals(String str) boolean 문자열의 내용이 같은지 확인한다. 같으면 결과는 true, 다르면 false가 된다.
substring(int from, int to) String 문자열에서 해당 범위(from~to)에 있는 문자열을 반환한다. (to는 범위에 포함되지 않음)
toCharArray() toCharArray() 문자열을 문자배열(char[])로 변환해서 반환한다.
new String(char[] charArr) String 문자배열(char[]) 을 받아서 String으로 복사해서 반환한다.
// String 기능 활용하기

String str = "ABCD";

// length()
int strLength = str.length();
System.out.println(strLength);  // 4 출력

// charAt(int index)
char strChar = str.charAt(2); // 순번은 0부터 시작하니까 2순번은 3번째 문자를 가리킵니다.
System.out.println(strChar);  // C 출력

// substring(int from, int to)
String strSub = str.substring(0, 3); // 0~2순번까지 자르기 합니다. (3순번은 제외)
System.out.println(strSub);  // ABC 출력

// equals(String str)
String newStr = "ABCD";  // str 값과 같은 문자열 생성
boolean strEqual = newStr.equals(str);
System.out.println(strEqual); // true 출력

// toCharArray()
char[] strCharArray = str.toCharArray(); // String 을 char[] 로 변환

// 반대로 char[] 를 String로 변환하는 방법
char[] charArray = {'A', 'B', 'C'};
String charArrayString = new String(charArray); // char[] 를 String 으로 변환

3. 다차원 배열

1. 2차원 배열(2열 배열), 순회

  • 지금 까지 학습한, 1열로 구성된 분류통을 배열이라고 하고, 이것은 말그대로 1열로 되어있기 때문에 1열배열 즉, 1차원 배열 이라고도 부릅니다.
  • 1열배열을 위로 쌓으면 2열배열이 되고 이걸 2차원 배열이라고 합니다.
  • 1차원 배열과 2차원 배열을 이해하기 쉽도록 그림으로 표현하면 아래와 같습니다. 
  • 이걸 저장소 관점으로 그림을 그려서 표현해보면 아래와 같습니다.

  • 선언
    • 2차원 배열을 선언할때는 1차원 배열에 대괄호를 하나더 추가해주면 됩니다.
      • int[][] array
      • int array[][]
      • int[] array[]
    • 1차원 배열과 2차원 배열의 선언에 따른 저장소 할당의 차이점을 그림으로 표현하면 아래와 같습니다. (노란색 네모안의 코드로 해당 값을 하나의 변수로써 저장하거나 조회할 수 있습니다.)

  • 생성
    • 2차원 배열을 생성할때도 대괄호를 하나더 추가하면 됩니다.
      • int[][] array = new int[][];
  • 초기화
    • 2차월 배열을 초기화는 아래 2가지 방법이 있습니다.

1. 중괄호를 사용해 선언과 동시에 초기화 합니다.

// 중괄호를 사용해 초기화

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

2. 선언/생성 이후 반복문을 통해 초기화를 합니다.

// 반복문을 통한 초기화

int[][] array = new int[2][3]; // 최초 선언

for (int i = 0; i < array.length; i++) {
    for (int j = 0; j < array[i].length; j++) {
        arr[i][j] = 0;  // i, j 는 위 노란색 네모박스 안에있는 숫자를 의미하며 인덱스 라고 부릅니다.
    }
}

2. 가변 배열

  • Java 프로그래밍 에서는 2차원 배열을 생성할 때 열의 길이를 생략하여, 행마다 다른 길이의 배열을 요소로 저장할 수 있습니다.
  • 이렇게 행마다 다른 길이의 배열을 저장할 수 있는 배열을 가변 배열이라고 합니다.
// 가변 배열

// 선언 및 초기화
int[][] array = new int[3][];
// 배열 원소마다 각기다른 크기로 지정 가능합니다.
array[0] = new int[2];
array[1] = new int[4];
array[2] = new int[1];

// 중괄호 초기화할때도 원소배열들의 크기를 각기 다르게 생성 가능합니다.
int[][] array2 = {
    {10, 20},
    {10, 20, 30, 40},
    {10}

};

3. 2차원 배열 이상의 다차원 배열 이해

  1. 2차원 배열외에도 3차원, 4차원 등..이 있지만 거의 대부분 3차원 까지만 사용하는경우가 많습니다.
  2. 그럼, 3차원 배열에 대해서 알아볼까요?
    • 3차원 배열 선언은 2차원 배열 생성에 괄호를 하나 더해주면 됩니다.
      • ex. int[][][] multiArrary
    • 초기화 할때는 중괄호를 더추가하면 됩니다.
    • {{{배열원소1}, {배열원소2}}, {{배열원소3}}} 와 같은 형태로 초기화가 가능합니다.
// 3차원 배열의 이해

// 중괄호 3개를 써서 3차원 배열 초기화를 할 수 있습니다.
int[][][] MultiArray = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};

4. 다차원 배열 조회

  • 2차원 배열 조회할때는 2차원 인덱스를 가진만큼 2중 반복문을 통해 출력할 수 있습니다.
    • 2중 반복문을 통해 가변 배열도 출력 가능합니다.
// 가변 2차원 배열 조회
int[][] array = {
	{10, 20, 30},
	{10, 20, 30, 40},
	{10, 20}
};

for (int i = 0; i < array.length; i++) { // 1차원 길이
	for (int j = 0; j < array[i].length; j++) { // 2차원 길이
		System.out.println(array[i][j]); // 2중 반복문으로 i, j 인덱스 순회
	}
}

// 출력
10
20
30
10
20
30
40
10
20

// 최대값 구하기

int[] arr = { 3, 2, 1, 5, 1 };

// 최대값 초기값 세팅
int max = arr[0];

// 최대값 구하기
for (int num : arr) {
    if (num > max) { // 반복문 돌면서 나(max)보다 값이 작으면 저장
        max = num;
    }
}

// 최대값 5 출력
System.out.println(max);

// 최소값 구하기

int[] arr = { 3, 2, 1, 5, 1 };
 
// 최소값 초기값 세팅
int min = arr[0];

// 최소값 구하기
for (int num : arr) {
    if (num < min) { // 반복문 돌면서 나(min)보다 값이 작으면 저장
        min = num;
    }
}

// 최소값 1 출력
System.out.println(min);

'JAVA' 카테고리의 다른 글

[JAVA] JVM 구조와 메모리 영역  (0) 2023.05.28
[JAVA] 참조형 배열로 정리하기 (컬렉션)  (0) 2023.05.27
[JAVA] 조건문, 반복문  (0) 2023.05.24
[JAVA] 연산자  (0) 2023.05.24
[JAVA] 변수  (0) 2023.05.23