배열의 구조와 특징
배열(Array)이란?
배열 크기가 고정적인 배열이다. 항상 크기를 정해줘야 인덱스 값으로 접근하여 할당 연산자로 데이터값을 저장할 수 있다.
정적인 배열의 장점으로는 사이즈가 늘 일정해서 사이즈 값은 상수고 인덱스로 접근하기가 편하다.
또한 데이터를 저장할때는 반드시 모두 같은 타입이어야 배열에 저장이 가능하다.
-> 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것, 같은 타입의 여러 변수를 하나하나 저장해서 쓰는 것보다 한곳에 모아두고 필요한 것들만 사용하기 용이하기 때문에
위의 그림은 int[] arr = new int[3]; 으로 생성된 배열의 구조와 인덱스를 보여주고 있는 그림이다.
개념은 쉽지만 매번 사용할때마다 헷갈리고 다시 구글링을 하게 되서 배열의 간단한 사용을 코드와 출력부분으로 정리해놨다.
배열의 사용 (초기화 및 추가, 초기화 default 값, 배열 출력)
매번 쓸 때마다 헷갈려서 코드를 적어놓는다. 항상 Array는 인덱스로 접근할 수 있고, 인덱스값으로 할당연산자로 데이터를 넣을 수 있는 것을 명심하자! 편하게 데이터를 넣고 싶으면 ArrayList로 가변배열을 만들어야한다.
코드
package com.study;
import java.util.ArrayList;
import java.util.Arrays;
public class ArrayStudy {
public static void main(String[] args) {
// Array
int[] intArr1 = {}; //[]
int[] intArr2 = new int[4]; //[0, 0, 0, 0]
int[] intArr3 = {1, 1, 4, 5, 6}; //[1, 1, 4, 5, 6] new int[]{1, 1, 4, 5, 6} 로도 사용 가능
int[] intArr4; //선언만 하고
intArr4 = new int[2]; //생성 나중에 해도됨
int[] intArr5 = new int [1];
int[] intArr6 = new int[0];
//int arr 출력은 for-each 방법도 있으나 간편하게 해당 출력으로만 대체함
System.out.println("=== Array: int[] ===");
System.out.println("intArr1: "+ Arrays.toString(intArr1));
System.out.println("intArr1 길이: "+intArr1.length);
System.out.println("intArr2: "+ Arrays.toString(intArr2));
System.out.println("intArr3: "+ Arrays.toString(intArr3));
System.out.println("intArr4: "+ Arrays.toString(intArr4));
System.out.println("intArr5: "+ Arrays.toString(intArr5));
System.out.println("intArr6: "+ Arrays.toString(intArr6));
System.out.println("intArr6 길이: "+intArr6.length);
// intArr6[0] = 10; //크기가 없는 배열에는 값을 넣을 수 없다. 인덱스 오류가 날 것이다.
// System.out.println(Arrays.toString(intArr6));
intArr5[0] = 10;
System.out.println("intArr5[0] =10 한 후 intArr5: " + Arrays.toString(intArr5));
// intArr5[1] = 20; // 크기가 1인 배열에는 인덱스가 1부터는 존재하지 않음. 마찬가지로 넣을 수 없음. 인덱스 오류가 날 것이다.
// System.out.println(Arrays.toString(intArr5));
System.out.println();
System.out.println("=== Array: String[] ===");
String[] stringArr1 = new String[5];
System.out.println("stringArr1: "+ Arrays.toString(stringArr1));
stringArr1[0] = "Hi";
String[] stringArr2=new String[]{"Kim","Park","Yi"}; // new String[] 생략가능
System.out.println("stringArr1[0] = \"Hi\" 한 후 stringArr1: "+ Arrays.toString(stringArr1));
System.out.println("stringArr2: "+ Arrays.toString(stringArr2));
System.out.println();
System.out.println("=== Array: char[]===");
char[] charArr1 ={};
char[] charArr2 = {'a', 'b', 'c', 'd', 'e'};
System.out.print("charArr1: ");
System.out.println(charArr1);
System.out.print("charArr2: ");
System.out.println(charArr2); //char array만 println할 경우 println의 고유적인 기능
System.out.println("charArr2: "+ charArr2); // 다른것들이 추가되면 x
System.out.println();
System.out.println("=== Array: boolean[]===");
boolean[] booleanArr1 ={};
boolean[] booleanArr2 = new boolean[2];
System.out.println("booleanArr1: "+ Arrays.toString(booleanArr1));
System.out.println("booleanArr2: "+ Arrays.toString(booleanArr2));
System.out.println();
//Collection 프레임 워크의 일부인 ArrayList
ArrayList<Integer> IntegerArrayList = new ArrayList<>();
System.out.println("=== ArrayList : ArrayList<Integer> ===");
System.out.println("ArrayList is not equal Array, is List");
System.out.println("IntegerArrayList: "+ IntegerArrayList);
IntegerArrayList.add(3);
System.out.println("IntegerArrayList: "+ IntegerArrayList);
IntegerArrayList.add(5);
IntegerArrayList.add(3);
System.out.println("IntegerArrayList: "+ IntegerArrayList);
}
}
출력 값
=== Array: int[] ===
intArr1: []
intArr1 길이: 0
intArr2: [0, 0, 0, 0]
intArr3: [1, 1, 4, 5, 6]
intArr4: [0, 0]
intArr5: [0]
intArr6: []
intArr6 길이: 0
intArr5[0] =10 한 후 intArr5: [10]
=== Array: String[] ===
stringArr1: [null, null, null, null, null]
stringArr1[0] = "Hi" 한 후 stringArr1: [Hi, null, null, null, null]
stringArr2: [Kim, Park, Yi]
=== Array: char[]===
charArr1:
charArr2: abcde
charArr2: [C@1b6d3586
=== Array: boolean[]===
booleanArr1: []
booleanArr2: [false, false]
=== ArrayList : ArrayList<Integer> ===
ArrayList is not equal Array, is List
IntegerArrayList: []
IntegerArrayList: [3]
IntegerArrayList: [3, 5, 3]
값을 할당하지 않고 초기화 시
int는 0 (double이나 float, long도 숫자니까 0.0, 0 으로 같겠죠?),
String은 null,
boolean은 false로 초기화 되는 것을 확인할 수 있습니다.
또한 값을 인덱스로 접근하여 할당연산자로 저장하는 것을 알 수 있습니다. 이때 인덱스 값이 배열의 길이에 없을 경우 에러가 납니다!
+ 추가적으로 ArrayList도 조금 적었는데 매번 헷갈려서 적어놨습니다. 가변적인 배열을 사용하고 싶을 때는 ArrayList를 사용하면됩니다. 인덱스 접근 없이 그냥 배열에 연속해서 넣고 싶을 때 유용합니다
위에서는 인덱스로 출력하는 걸 지양하고싶어서 사용이 안됐지만 length로 배열의 길이를 구할 수 있고 다음과 같이 for문으로 출력 가능합니다.
int[] intArr = new int[3];
for(int i =0; i< intArr.length; i++){
System.out.print(intArr[i] + " ");
}
System.out.println(); //줄바꿈을 위함
참고할 만한 문제 :
https://www.acmicpc.net/problem/10818
10818번: 최소, 최대
첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
www.acmicpc.net
https://school.programmers.co.kr/learn/courses/30/lessons/12910
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
'자료구조 & 알고리즘 > 선형 자료구조' 카테고리의 다른 글
[자료 구조] 연결리스트(LinkedList) in java (2) | 2023.06.16 |
---|---|
[자료 구조] 큐 (Queue ) in java (0) | 2023.06.13 |
[자료 구조] 스택 (Stack) in java (0) | 2023.06.12 |