본문 바로가기

JAVA

배열(자료구조) Array

여러개의 변수를 모아 저장하고 싶을 때 배열이라는 변수에 저장한다.

여러개의 값들을 한꺼번에 넣거나 하나씩 넣을 수 있고, 꺼낼 때는 하나씩 꺼낼 수 있다.

자료구조 중 하나.

선언 방법

1. 타입 [ ] 변수 ; (일반적)

int[] Array;

2. 타입 변수 [ ] ;

int Array[];

생성

new 명령을 통해 생성하고, [ ] 안에 크기를 지정한다.

사이즈를 지정해서 생성된 배열은 각 칸마다 순번이 있다.

순번은 0부터 시작.

배열 생성시 각 타입별 초기값으로 초기화 되어 채워진다.

※ 참조형 변수이기 때문에 실제 값을 가지고 있지 않고, 실제 값의 주소값을 저장하고 있다.

 

int[] Array = new int[3];

순회

배열의 값을 하나씩 꺼내서 사용하는 것

// 단건 조회
int[] Array = new int[3];
System.out.println(Array[1]); // 배열의 2번째 값 출력

// 배열 순회
int[] Array = new int[3];
// 배열이 초기화된 값을 출력해본다.
for(int i=0; i<intArray.length; i++) { // .length 는 배열의 길이
	System.out.println(Array[i]);
}

+ .length() 매소드

배열의 길이를 반환하는 함수

초기화

1. 중괄호 { } 사용

2. 반복문 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

복사

얕은 복사

배열은 참조형 변수. 배열 변수간 = 을 사용해 복사하면 주소값만 복사된다.

주소값만 복사되고 실제 값은 한개로 유지되는 것을 얕은 복사라고 한다.

변수 명은 다르지만 같은 값을 가리키고 있는 것!

※ 복사한 배열에서 수정을 할 경우 가리키는 값이 수정되기 때문에 원본 값도 수정되니 조심!

// 얕은 복사
int[] a = { 1, 2, 3, 4 };
int[] b = a; // 얕은 복사
b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
System.out.println(a[0]); // 출력 3

깊은 복사

진짜 새로운 배열을 똑같이 만들고 싶을 때 사용한다.

실제 값을 가지고 있는 배열의 기본형의 값을 꺼내 복사하면 된다.

for문을 통해 값을 하나씩 꺼내 복사하는 방법과 여러 메서드를 사용하는 방법이 있음

// 깊은 복사 (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값도 같이 넣어줍니다.
	}
}

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"};

char 배열

문자열 = 문자배열

String = char[ ]

 

기본형 변수 vs 참조형 변수

1. 기본형 변수는 소문자로 시작, 참조형 변수는 대문자로 시작

2. 기본형 변수는 값 자체를 저장, 참조형 변수는 별도의 공간에 값을 저장하고 그 주소를 저장함

 

String이 더 많은 기능을 가지고 있기 때문에 많이 사용한다.

  • length() : 문자열의 길이를 반환 (리턴타입 : int)
  • charAt(int index) : 문자열에서 해당 index의 문자를 반환 (리턴타입 : char)
  • substring(int from, int to) : 문자열에서 해당 범위에 있는 문자열을 반환(to는 포함X) (리턴타입 : String)
  • equals(String str) : 문자열의 내용이 같은지 확인. 같으면 true, 다르면 false (리턴타입 : boolean)
  • toCharArray() : 문자열을 문자배열로 변환해서 반환 (리턴타입 : char[ ])
  • new String(char[ ] charArr) : 문자배열을 받아서 String으로 복사해서 반환 (리턴타입 : 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 으로 변환

다차원 배열

2차원 배열 선언

int[ ][ ] array

int array[ ][ ]

int[ ] array[ ]

생성

int[ ][ ] array = new int[ ][ ];

초기화

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 는 위 노란색 네모박스 안에있는 숫자를 의미하며 인덱스 라고 부릅니다.
    }
}

가변 배열

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}
};

 

2차원 배열과 같은 방식으로 3차원 배열도 생성할 수 있다.

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

 

'JAVA' 카테고리의 다른 글

Annotation 어노테이션  (0) 2023.04.12
컬렉션(자료구조)  (0) 2023.04.04
반복문  (0) 2023.04.04
조건문  (0) 2023.04.04
연산자  (0) 2023.04.03