이차원 가변 배열의 선언과 초기화
타입[][] 변수명 = new 타입[행의수][];
변수명[행의인덱스] = new 타입[열의수];
Arrays
배열을 다룰때 사용하는 유틸리티로 java.util이라는 패키지에 포함되어 있다.
여기서 java.lang 패키지에 있는 클래스를 제외한 패키지 내의 클래스를 사용하려면 해당 패키지 경로를 import 해줘야 한다.
package theory.array;
import java.util.Arrays;
public class ArrayMain {
public static void main(String[] args) {
int[] copyFrom = {1, 2, 3};
int[] copyTo1 = Arrays.copyOf(copyFrom, 5);
int[] copyTo2 = copyFrom;
int[] copyTo3 = Arrays.copyOfRange(copyFrom, 0, 2);
}
}
깊은 복사, 얕은 복사
이때, copyTo2와 copyFrom은 인스턴스 배열을 참조하게 되고, == 비교시 true가 나온다.
하지만, Arrays.copyOf은 새로운 메모리 공간에 값을 할당하여 copyTo1이 참조하게 하는 것이므로, == 비교시 false가 나온다.
Arrays.compare
비교할 때는 결과값으로 양수, 0, 음수가 나온다.
int[] compareTo = {0, 2, 3};
int compare = Arrays.compare(copyFrom, compareTo);
Arrays.sort, Arrays.binarySearch
배열을 정렬 후 이진탐색을 사용할 수 있다. 이때, 결과값 result에는 해당 key값이 몇 번째 index에 있는지 알려준다.
int[] beforeSort = {5, 4, 3, 2, 1};
Arrays.sort(beforeSort);
int result = Arrays.binarySearch(beforeSort, 4);
System.out.println("result = " + result);
단, 여기서 Arrays.sort(Object[])를 사용하려면 비교햐려는 객체의 기준을 정해주어야 한다. 그 기준을 정해주려면 java.lang.Comparable 인터페이스를 구현해주어야 한다. 즉, Comparable 은 어떤 객체가 큰지, 작은지 기준을 정해주는 interface이다.
package theory.array;
import java.util.Arrays;
public class ArraySortMain {
public static void main(String[] args) {
Item[] items = new Item[5];
items[0] = new Item("java", 1000);
items[1] = new Item("python", 2000);
items[2] = new Item("C#", 3000);
items[3] = new Item("javascript", 4000);
items[4] = new Item("Dart", 5000);
Arrays.sort(items);
for (Item item : items) {
System.out.println("item = " + item);
}
}
}
class Item implements Comparable{
private String name;
private int price;
public Item(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
@Override
public String toString() {
return "Item{" +
"name='" + name + '\'' +
", price=" + price +
'}';
}
@Override
public int compareTo(Object o) {
Item i = (Item) o;
return this.name.compareTo(i.name); // 양수, 0, 음수
}
}
여기서 compareTo 메서드는 파라미터로 들어온 Object와 내 자신을 비교하는 메서드이다. 다만, compareTo에는 Object를 받아들이도록 했지만, 실제로는 자신 자신과 같은 타입의 객체가 들어온다.
item = Item{name='C#', price=3000}
item = Item{name='Dart', price=5000}
item = Item{name='java', price=1000}
item = Item{name='javascript', price=4000}
item = Item{name='python', price=2000}
Compator
Arrays.sort(items, 정렬방법을 정의하는 객체)를 넣어서 정렬의 기준을 만들어 정렬해줄 수 있다.
Arrays.sort(items, new ItemSorter());
for (Item item : items) {
System.out.println("item = " + item);
}
}
}
class ItemSorter implements Comparator {
@Override
public int compare(Object o1, Object o2) {
Item item1 = (Item) o1;
Item item2 = (Item) o2;
return item1.getName().compareTo(item2.getName());
}
}
Arrays.sort(items, new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Item item1 = (Item) o1;
Item item2 = (Item) o2;
return item1.getName().compareTo(item2.getName());
}
});
그리고 여기서 Comparator는 메서드가 1개만 있는 인터페이스이기 때문에, 람다 인터페이스로도 사용할 수 있다.
Arrays.sort(items, (Object o1, Object o2) -> {
Item item1 = (Item) o1;
Item item2 = (Item) o2;
return item1.getName().compareTo(item2.getName());
});
Arrays.sort(items, (item1, item2) ->
item1.getName().compareTo(item2.getName())
);
명령행 아규먼트(Command-Line Arguments)
main 메서드에 있는 String[] args 파라미터가 명령행 아규먼트이다. 여기서 main 메서드는 JVM이 실행하는 메서드이고, 즉, JVM이 main 메서드를 실행할 때, String[] args를 인자로 넘겨준다는 것을 의미한다.
즉, Intellij에서는 Run/Debug Configurations 메뉴에 들어가서 Program Arguments에 값을 넣어주면 된다.
그러면 javac 클래스명.java로 컴파일을 하고,
java 클래스명 a b c d hello 처럼 프로그램 아규먼트가 뒤에 온다.
그리고 중간에 JVM에 주는 옵션이 있다. -javaagent:어떤설정
public class CommandLineArgumentExam {
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("args.length == 0");
System.exit(0); // 프로그램 종료.
}
for (String arg : args) {
System.out.println("arg = " + arg);
}
}
}
제한 없는 아규먼트
경우에 따라 메서드 아규먼트를 가변적으로 전달하고 싶은 경우가 있다. 이때 사용되는 문법은 다음과 같다.
int... args
내부적으로는 배열처럼 취급된다.
인용
https://youtu.be/9nROCTarzt8?si=Jh7sFrTql_hNzbcb
'Language > Java' 카테고리의 다른 글
I/O (Input, Output) (0) | 2023.09.17 |
---|---|
제네릭과 컬렉션 프레임워크 (0) | 2023.09.16 |
익명 클래스 (Anonymous Class) (0) | 2023.09.15 |
팩토리 메서드 패턴과 Java Reflection (0) | 2023.09.15 |
인터페이스 (0) | 2023.09.15 |