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가지 방법이 있습니다.
- 중괄호{} 를 사용해서 초기화
- 반복문 for문을 사용해서 초기화 (또는 향상된 for문)
- 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 배열
- 선언, 생성, 초기화
- 배열 중에서도 가장 많이 사용하게될, 문자열 배열인, 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차원 배열을 선언할때는 1차원 배열에 대괄호를 하나더 추가해주면 됩니다.
- 생성
- 2차원 배열을 생성할때도 대괄호를 하나더 추가하면 됩니다.
- int[][] array = new int[][];
- 2차원 배열을 생성할때도 대괄호를 하나더 추가하면 됩니다.
- 초기화
- 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차원 배열 이상의 다차원 배열 이해
- 2차원 배열외에도 3차원, 4차원 등..이 있지만 거의 대부분 3차원 까지만 사용하는경우가 많습니다.
- 그럼, 3차원 배열에 대해서 알아볼까요?
- 3차원 배열 선언은 2차원 배열 생성에 괄호를 하나 더해주면 됩니다.
- ex. int[][][] multiArrary
- 초기화 할때는 중괄호를 더추가하면 됩니다.
- {{{배열원소1}, {배열원소2}}, {{배열원소3}}} 와 같은 형태로 초기화가 가능합니다.
- 3차원 배열 선언은 2차원 배열 생성에 괄호를 하나 더해주면 됩니다.
// 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 |