JAVA 자료형에 대하여 (feat.프론트엔드 연쇄질문마)
* 줄곧 javascript로만 개발한 나는 요즘 java를 배우면서 이제서야 제대로 프로그래밍의 세계에 입문하는 느낌이다. Java에서 자료형을 배우고 있는데, 다 익숙해보여서 만만한 호수인줄 알았다. 하지만 알고 보니 엄청 깊은 바다인 느낌. 질문이 꼬리에 꼬리를 물고 공부를 하다 보니, 좀 정리를 하자 싶어서 글로 남겨본다.
일단, Array를 선언하는 모습을 보자. 기존 자바스크립트에서 배열을 선언할때의 모습과 가장 유사하다고 볼수 있다.
// Javascript
let numbers = [ ]
const animals = [ 'cat', 'dog', 2, { name: "개똥이", age: 12 } ]
// JAVA
int[] numbers = new int[5]
String[]
단, javascript와의 차이점이라고 한다면, 다음과 같은 기본 특징이 있다.
- 자료형 선언 : 선언한 자료형에 맞는 자료만 넣을 수 있다. int[] 면, int(정수)만 넣을 수 있다.
- 배열의 불변성 : 변수를 선언할 때 미리 크기가 정해진다. new int[5]면 정수 5개만 받을 수 있는 배열이라는 뜻이다. 크기는 처음 결정되면 불변하다.
자료형 뒤에 "[]"만 붙여주면 그냥 배열Array가 된다.
기본 타입 배열 선언
: byte, short, int, long, float, double, char, boolean 이렇게 소문자로 시작하는 것들
int[] numbers = new int[5];
char[] characters = new char[5];
boolean[] flags = new boolean[3];
int[] numbers2 = { 1, 2, 3, 4, 5, 6, 7 } // 선언과 할당을 동시에. 크기는 7.
boolean[] codes = { true, false, false, true } // 선언과 할당을 동시에. 크기는 4.
참조 타입 배열 선언
: String, Object, Integer같은 클래스 혹은 List나 Map같은 인터페이스 참조형 타입
String[] names = new String[10];
String[] words = { "안녕하세요", "고맙습니다", "사랑합니다" }
Integer[] numbers = new Integer[4];
List<Integer>[] listOfScores = new List[10];
사용자 정의 클래스 타입 배열 선언 :
class Person {
String name;
int age;
}
Person[] peopleArray = new Person[3];
이 또한 자바스크립트와 매우 유사하다.
- length : 배열의 길이를 알 수 있다.
int[] numbers = { 9, 9, 9, 9, 9 }
System.out.println(numbers.length) // 출력: 5
- sort : 정렬할 수 있다.
int[] numbers = {5, 2, 8, 1, 9};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers)); // 출력: [1, 2, 5, 8, 9]
- toString : 배열을 문자열로 변환
int[] numbers = {1, 2, 3, 4, 5};
System.out.println(Arrays.toString(numbers)); // 출력: [1, 2, 3, 4, 5]
- fill : 배열을 특정 값으로 채운다.
int[] numbers = new int[5];
Arrays.fill(numbers, 10);
System.out.println(Arrays.toString(numbers)); // 출력: [10, 10, 10, 10, 10]
- 인덱스를 통한 요소 접근
int[] numbers = { 10, 20, 30, 40, 100 }
System.out.println(numbers[4]) // 출력: 100
- 인덱스를 통한 요소 수정
int[] numbers = {1, 2, 3, 4, 5};
numbers[2] = 10;
Array : 고정된 크기의 같은 타입 요소들의 연속된 집합
List : 순서가 있는 요소의 집합을 나타내는 인터페이스(Interface)
// Array
int[] numbersArray = new int[5];
// List
List<Integer> = new ArrayList<>();
Array : 메모리 사용이 효율적이다.
List : 메모리 사용량이 Array보다 많다.
Array : 크기가 고정. 불변하다.
List : 크기가 가변적이다.
// Array
int[] numbers = new int[10];
System.out.println(numbers.length) // 10
// List
List<String> names = new ArrayList<>();
names.add("Eric")
names.add("Hong")
System.out.println(names.size()) // 2
names.remove(0)
System.out.println(names.size()) // 1
System.out.println(names.get(0)) // 출력: "Hong"
Array : 모든 자료형 가능
List : 참조형 타입만 가능하다.
List<String> names; // (O)
List<Integer> numbers; // (O)
List<int> numbers; // (X)
List<boolean> flags; // (X)
Array : 인덱스로 빠르게 접근할 수 있다. 하지만 요소를 추가하고 삭제하기가 비효율적이다.
List : 요소를 추가하고 삭제, 검색하는 등의 다양한 메소드를 제공한다. (add, remove 등등)
Array는 이미 크기가 고정되어 있는, 가볍고 기본적인 연산이 필요할 때, 컴파일 단계에서 결정되는 배열을 정의할 때 사용하면 좋고 List는 런타임 중에 동적으로 연산이 가능하고 가변적이며 다양한 조작이 필요할 때 쓰는 것이 좋다.