1. 자바에서 배열은 어느 곳에 생성되는가? (자바 정적 메모리에 대해서 찾아보기)
- 배열은 Object여서 JVM의 동적 메모리(heap)에 생성된다. variable, array, object, etc. 등은 오직 동적 메모리에서만 생성된다. 만약 배열이 primtive type을 담더라도 항상 heap 영역에 저장된다.
2. 한 클래스의 메인 메소드를 다른 클래스에서 호출할 수 있는가? (직접 해보기)
- 호출할 수 있다. 다른 클래스에서 Classname.main()을 사용하면 호출할 수 있다. 그리고 String type의 배열을 매개변수로 주어야 한다.
-> 호출 가능하다. 어떻게 사용되는 지 몰라서 더 찾아보았더니, 호출할 경우 많은 error와 exception을 일으킨다고 한다. 이에 대해선 나중에 더 찾아보겠다.
3. 자바에서 배열은 무엇인가?
- 배열은 같은 타입의 데이터들을 모아놓은 집합이다. 또한 크기가 유한하고 정렬되어 있다. 정렬되어 있다는 것은 heap 영역에 선형방식으로 모든 요소가 하나씩 인접한 위치에 저장되었다는 것을 의미한다.
4. 배열의 타입엔 뭐가 있는가?
- 1차원 배열과 다차원 배열이 있다.
5. 배열의 크기를 음수로 선언할 수 있는가? (직접 해보기 + NegativeArraySizeException runtime Error인지 확인)
- 안된다. 음수로 선언하더라도 컴파일 시 에러는 발생하지 않는다. 그러나 실행하면 NegativeArraySizeException이 발생한다.
6. int[] array와 int array[]의 차이점은 무엇인가? (직접해보기)
- 차이점은 없다. 두 개 모두 배열을 선언하는 방법이다. 단지 차이점이 있다면 한 줄에서 한 개보다 많은 배열을 선언할 때, int[] arr1, arr2 이런 식으로 해야 한다는 것이다. 만약 int arr1[], arr2 이렇게 선언한다면 arr2는 int type의 변수로 선언된다.
-> 직접해보았고, int arr1[], arr2로 선언한 후, arr2에 int array 값을 넣으면 java: incompatible types: int[] cannot be converted to int 라는 에러가 발생한다.
7. 자바에서 배열을 어떻게 복사하는가? (직접해보기)
- 먼저 우리는 수동으로 배열을 반복해서 복사할 수 있다. 다른 방법으론 System 클래스의 arrayCopy() 메소드를 사용하면 된다. 이렇게 하면 가장 빠르게 배열을 복사할 수 있고, 배열의 부분을 복사하는 것도 가능하게 해준다. 이 두 방법이 가장 많이 쓰이는 방식이다.
그 외에도 Arrays.copyOf() 메소드나 clone() 메소드를 사용해서 배열을 복사할 수 있다.
-> arrayCopy() 메소드를 사용해서 복사해봤다. 이에 대해선 나중에 더 자세히 찾아보겠다.
8. 배열의 기본값은 무엇인가?
- 1. byte, short, int, long type은 기본값이 0이다.
2. float와 double type은 기본값이 0.0이다.
3. Boolean type은 기본값이 false다.
4. Object type일 경우 기본값을 null이다.
9. Jagged array(가변 배열)은 무엇인가?
- 가변 배열은 다차원 배열이지만, 각 요소가 다른 배열 크기를 가지고 있다. 예를 들어 int [][] array = new int[3][]으로 선언할 경우, array[0] = new int() { 1, 2, 3}; array[1] = new int() {3, 2}; 이렇게 저장할 수 있다.
10. 익명 배열은 무엇인가? (더 자세히 찾아보기)
- 이름이 없는 배열을 익명 배열이라고 한다. 배열을 한번만 쓸 때 사용한다. 변수에 저장되어 있지 않는 배열 참조다. 다른 객체의 생성자에 사용되어진다. 자바의 Polygon class는 익명 배열을 매개변수로 받는 생성자를 가지고 있다.
Polygon(int[] xvalues, int[] yvalues, int n) -> Polygon triangle = new Polygon(new int[] {0, 10, 5}, new int[] {10, 0, 5}, 3)
-> 익명 배열은 한 번만 필요하고, 다시 참조할 일이 없을 때 사용된다고 한다.
11. 배열에서 중복 요소를 찾는 방법은 몇 가지인가? (직접 해보기)
먼저 Brute Force Method, 이 방식으로 배열의 각 요소를 다른 요소들과 비교할 수 있다. 만약 두 개의 요소가 같다면, 그것을 중복값으로 여긴다. 시간 복잡도가 O(n^2)이다.
HashSet : HashSet class를 중복 요소를 찾는데 사용할 수 있다. 중복 요소를 찾기 위해서 배열의 요소를 반복해서 HashSet class의 add() 메소드를 호출해 HashSet에 삽입한다. 만약 메소드가 false를 리턴한다면 이는 이미 요소가 Set에 포함되어 있다는 것을 의미한다. O(n) 시간 복잡도를 가진다.
HashMap: HashMap은 key-value를 한 쌍으로 하여 요소를 저장한다. 중복 요소를 찾기 위해 HashMap을 사용할 경우, 배열의 요소를 key 값에 넣어주고, 나온 회수를 value에 저장해준다. 어떤 key의 value가 1보다 크다면, 그 key는 중복된 요소다. 시간과 공간 복잡도가 O(n)이다. 이 방법을 사용하면 요소가 얼마나 중복되었는지 그 회수를 알 수 있다.
-> Brute Force Method는 직접 구현해봤지만, 나머지 2개는 아직 못했다.
12. 배열에서 어떤 작업을 수행할 수 있는가?
- 검색, 정렬, 순회, 삭제 및 삽입을 수행할 수 있다.
13. 아래의 두 statement를 보고나서, 참인지 거짓인지 판단해라. 그리고 그 이유를 말해라. (직접 해보기)
int y=56;
int[] number={12, 34, 90, y, 65};
- 이것은 참이다. 왜냐하면 자바는 한 문장 내에서 초기화와 생성, 이 두 가지 다른 배열 syntax를 허용해주기 때문이다. 첫번째 statement는 선언, 생성 그리고 초기화를 한번에 진행한다.
1. y라는 이름을 가진 int type 변수를 선언한다.
2. 56이란 정수값을 생성한다.
3. 56이란 값을 y에 할당한다.
int[] number = {12, 34, 90, y, 65}; 는 이런 식으로 실행된다.
1. number라는 이름을 가진 int type 배열이 만들어진다.
2. 크기가 5인 int array가 생성된다.
3. 배열의 요소에 각 값을 채워넣는다.
4. 새로운 array 객체를 참조 변수인 number에 할당한다.
-> 디버깅을 해보았더니 y에 y: 56으로 표시되어 있었다.
14. Set은 배열이 될 수 있는가?
- 자바에서 Set은 배열이지만, 모든 배열이 Set은 아니다. 배열은 요소의 중복이 허용되지만, Set은 허용되지 않기 때문이다.
15. 배열을 volatile로 만들 수 있는가? (volatile이 뭔지 찾아보기)
- 가능하다. 그러나 배열을 가리키는 변수만 volatile로 만들 수 있다. 만약 각 요소들을 교체하여 배열을 변경하면, volatile 변수가 제공하는 보장이 유지되지 않는다.
-> 자바 volatile keyword는 자바 변수를 Main Memory에 저장하겠다는 것을 명시하는 것, 변수의 값을 Read할 때 CPU cache에 저장된 값이 아닌 Main Memory에 저장되어 있는 값을 읽는다. Write 할 때도 Main Memory에 작성한다.
-> 멀티 쓰레드에서 Volatile 변수를 사용하지 않으면, 각각 CPU cache에 저장된 값이 달라서 변수 값 불일치 문제가 발생하게 된다.
(어려워서 나중에 더 자세히 공부해보겠다.)
https://nesoy.github.io/articles/2018-06/Java-volatile
16. 크기를 할당하지 않고 배열을 선언하면 어떤 일이 일어나는가? (직접 해보기)
- 그것은 불가능하다. 만약 크기를 할당하지 않고 배열을 선언한다면 compile-time error가 발생한다. 예를 들어, height = new int[].
-> 직접해보니 array dimension missing error가 발생했다.
17. ArrayIndexOutOfBoundsException은 언제 발생하는가? (runtime인지 compile인지 확인하기)
- 프로그램이 배열의 index에 접근할 때 일어난다. 만약 접근하는 index값이 배열의 크기를 넘어서거나 음수일 경우에 일어난다.
-> Runtime Exception이어서 컴파일하는 동안 에러를 체크하지 않는다.
18. Arrays class의 어떤 메소드가 배열 내 특정 요소를 찾는데 사용되어지는가? (값들이 분류되지 않았을 때는?)
- binarySearch() method가 사용되어진다. 이 메소드는 binary search algorithm을 사용한다. 이 메소드를 호출하기 전에 배열의 요소들은 순서대로 정렬되어 있어야 한다. Arrays 클래스의 sort() 메소드를 사용해서 정렬할 수 있다. 정렬된 배열에서 요소를 찾는 가장 간단하고 효율적인 방법이다.
19. 배열의 클래스 이름은 어떻게 알아내는가? (직접 해보기)
- 배열은 객체다. 객체에서 우리는 class 이름을 알아낼 수 있다. Object의 메소드인 getClass()를 사용하여 객체를 실행하는 class의 이름을 반환받을 수 있다. Class의 메소드 getName()은 class나 array의 클래스 이름을 리턴한다.
20. Array와 ArrayList의 차이? (좀 더 찾아보기)
Array: Array는 정적이다. 크기가 정해져 있고, 한번 선언될 경우 크기를 변경할 수 없다. Primitive data type과 Class의 객체를 포함할 수 있다. Generic적인 요소를 가지고 있지 않다.
ArrayList: ArrayList는 크기가 동적이다. 즉 우리가 요소를 추가하면 크기가 자동적으로 커진다. Object entry만 포함할 수 있다. Generic적 요소를 가지고 있다.
21. 배열이 값을 갖고 있는지 확인하는 방법은? (직접 해보기 + 두 메서드의 차이점은??)
- 이를 위하여 Arrays 클래스는 isExists()와 contains() 메소드를 제공한다. 이 두 메서드 모두 요소가 있으면 true를 반환하고, 없으면 false를 반환한다.
22. 배열의 equilibrium index는 무엇인지 예를 들어라? (찾아보기)
- 만약 낮은 인덱스의 요소의 합이 높은 인덱스의 요소의 합과 같을 때 equilibrium index라고 한다. 예를 들어 [ -7, 1, 5, 2, -4, 3, 0]이라는 배열이 있다고 하자. 여기서 equilibrium index를 찾아보자. 인덱스 값보다 낮은 인데스의 총합: a[0] + a[1] + a[2] = -1이고, 높은 인덱스의 총합은 a[4]+a[5]+a[6]= -1이다. 따라서 equilibrium index는 3이다. 또한 6도 equilibrium index이다. a[0]~a[5]의 합이 a[6]의 값과 동일하기 때문이다.
23. 배열에서 left-rotation은 무엇인가? (right-rotation도 있나 찾아보자)
- left-rotation은 각 요소를 왼쪽으로 한 칸씩 움직이는 operation이다. 즉 가장 낮은 인덱스에 위치해 있던 값이 가장 높은 인덱스로 이동한다. 순환 배열로도 알려져 있다. [2, 4, 6, 9]라는 배열에 left-rotation을 두번 시행한다면, 1 회차: [4, 6, 9, 2], 2 회차: [6, 9, 2, 4] 가 결과로 나타나진다.
24. 배열의 장점과 단점
배열의 장점
- 같은 type을 가진 여러 요소들을 하나의 변수에 담을 수 있다.
- Stack, Queue, Tree 와 같은 다른 자료구조를 배열을 사용하여 구현할 수 있다.
- 실행시 인덱스를 사용하여 data 요소들을 불러낼 수 있다.
- 인덱스를 사용하여 배열의 각 요소에 매우 빠르게 접근할 수 있다. 시간 복잡도가 O(1)에 불과하다.
배열의 단점
- 크기를 무조건 선언해야만 한다.
- 정적인 구조여서 메모리 할당을 늘리거나 줄일 수 없다.
- 요소들이 연속된 메모리 위치에 저장되어 있어서 삽입 및 삭제 작업이 어렵고, 비용도 증가한다.
- 필요한 메모리보다 더 많이 메모리를 할당할 경우 메모리 낭비가 발생한다.
- generics를 사용할 수 없다.
25. ArrayStoreException이란? (직접 해보기)
- ArrayStoreException은 runtime exception으로, 선언된것 과 다른 데이터 타입을 저장하려고 할 때 발생한다.
String [] x = new String[3]; x[0] = 1; 이런 식으로 하면 발생.
26. 주어진 배열들이 동일한지 확인하는 법 (직접 해보기)
- Arrays.equals() 메소드를 사용하여 확인할 수 있다.
27. Java에서 Array와 LinkedList의 차이는?
- 동일한 수의 요소를 저장할 때 array가 더 적은 메모리를 사용한다. Array에선 요소의 데이터만 저장하는 반면에 LinkedList에선 다음 노드의 주소도 저장된다. Array는 연속된 메모리에 할당되어야 하지만, LinekdList의 요소들은 힙 영역 어디든지 있을 수 있다. 즉 LinkedList는 연속된 메모리 제한이 없다.
28. 두 배열 객체가 있는데, 첫 번째 객체는 크기가 100이고, 두번 째는 크기가 50이다. 두 배열 모두 같은 데이터 타입이다. 한 배열을 다른 배열에 할당 할 수 있는가? (직접 해보기)
- 가능하다. 왜냐하면 데이터 타입이 같은지만 비교하기 때문이다. 따라서 같은 데이터 타입이라면 가능하다.
29. 배열을 탐색하는 방법엔 무엇이 있는가?
- for loop와 for each loop이 있다.
30. int[] arr = new int[4]{1, 2, 3, 4} 로 배열을 정의할 수 있는가?
- 자바에서 배열을 초기화하는 잘못된 방법이다. 배열 안의 요소의 값을 선언함과 동시에, 배열의 크기를 나타낼 순 없다.
31. 배열은 thread-safe인가? (찾아보기, 동기화 얘기인듯.)
- 배열을 읽는 것은 thread-safe이지만, 수정하는 것은 그렇지 않다.
32. 두 배열의 교집합을 찾기. (직접해보자)
int[] arr1 = {1, 2, 3, 4, 5, 6};
int[] arr2 = {2, 3, 4, 7, 8};
Output : 2, 3, 4
33. 1~100이 저장되어 있는 배열에서 한 수가 없어졌다. 이 수가 무엇인지 찾자. (직접 해보자)
34. 배열에서 가장 큰 값과 작은 값을 찾자. (직접 해보기)
35. 자바에서 int type 혹은 String type 배열 뒤집기.(직접 해보자)
36. HashSet을 Array로 바꾸는 법은? (직접 해보기)
- toArray() 메소드를 사용하면 된다.
37. Array를 ArrayList로 바꾸는 법은? (직접 해보기)
- Array class의 asList() 메소드를 사용하면 된다. 혹은 addAll() 메소드를 사용해도 된다.
38. Array를 TreeSet으로 바꾸는 법은? (직접 해보기)
- Array를 TreeSet으로 바꾸기 위해선 먼저 Array를 asList()를 사용하여 List로 변경한다. 그다음에 List object를 TreeSet 생성자에 매개변수로 넘겨준다.
39. ArrayList를 String Array로 바꾸는 법은? (직접 해보기)
- 두 가지 방법이 있다. ArrayList의 get() 메소드를 사용하는 법과 toArray() 메소드를 사용하는 법이다.
40. 주어진 배열에서 두번째로 큰 값 찾기(직접 해보기)
- 가장 쉬운 방법은 정렬을 한 후, 두번째로 큰값이 나올 때까지 반복하는 것이다.
41. 가장 먼저 반복되는 값을 integer Array에서 찾기 (직접 해보기)
42. 반복되지 않는 첫번째 값은 integer Array에서 찾기( 직접 해보기)
42. Array의 Big-0 Complexity는?
- 접근 시 O(1), 찾거나, 추가, 삭제 시엔 O(n)
참고자료
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html
https://javahungry.blogspot.com/2019/03/array-interview-questions-and-answers-in-java.html
https://www.javatpoint.com/array-interview-questions-in-java
'멘토링' 카테고리의 다른 글
숫자 계산(돈 관련 일)을 할 때 어떤 자료형을 써야 할까? (0) | 2022.06.10 |
---|---|
자바에서 static methods와 static variables 저장 이해하기 (0) | 2022.06.10 |
primitive and reference variables (0) | 2022.06.09 |
저장 관점에서 디스크와 메모리의 차이는? (0) | 2022.06.09 |
자바에서 컴파일이란 무엇인가? (0) | 2022.06.09 |