출시·고도화 중
Java 안내서 · 3/6
Java의 값은 크게 기본 타입(primitive)과 참조 타입(객체)으로 나뉩니다. 이 장에서는 두 종류의 차이, 배열, 클래스 · 인터페이스 · 레코드 · 열거형으로 자기 타입을 만드는 방법, 제네릭의 기초, 그리고 가장 많이 쓰는 컬렉션인 List, Map, Set 을 다룹니다.
기본 타입은 값 자체를 저장하며 null 이 될 수 없습니다. 그 밖의 모든 것은 객체이고, 변수에는 객체를 가리키는 참조가 저장됩니다.
| 기본 타입 | 크기 | 감싸는 클래스 |
|---|---|---|
byte, short, int, long | 8, 16, 32, 64비트 정수 | Byte, Short, Integer, Long |
float, double | 32, 64비트 부동소수점 | Float, Double |
char | 16비트 UTF-16 코드 단위 | Character |
boolean | 참 또는 거짓 | Boolean |
컬렉션에는 객체만 넣을 수 있으므로 int 는 Integer 로 자동 변환(오토박싱)됩니다. 이때 감싸는 객체끼리 == 로 비교하면 값이 아니라 참조를 비교하므로 equals 를 써야 합니다. 또 null 인 Integer 를 int 로 풀면 NullPointerException 이 발생합니다.
int a = 1_000; // 밑줄로 자릿수 구분
long big = 9_000_000_000L; // long 리터럴은 L
double pi = 3.14159;
Integer x = 1000; // 오토박싱
Integer y = 1000;
System.out.println(x.equals(y)); // true
System.out.println(x == y); // 참조 비교라 false일 수 있음
int parsed = Integer.parseInt("42");
String text = String.valueOf(parsed);배열은 길이가 고정된 같은 타입 값의 모음입니다. 길이는 length 필드로 얻고, 인덱스는 0부터 시작합니다. 범위를 벗어나면 ArrayIndexOutOfBoundsException 이 발생합니다. 정렬과 출력 같은 도우미는 java.util.Arrays 에 있습니다.
int[] scores = {90, 75, 88};
String[] names = new String[3]; // 모두 null로 초기화
names[0] = "Duke";
java.util.Arrays.sort(scores);
System.out.println(java.util.Arrays.toString(scores)); // [75, 88, 90]
int[][] grid = new int[2][3]; // 2행 3열
grid[1][2] = 7;크기가 바뀌어야 하는 데이터라면 배열보다 ArrayList 같은 컬렉션이 편리합니다.
인터페이스는 구현해야 할 메서드를 정의하는 계약이며, default 메서드로 기본 구현을 줄 수도 있습니다. 클래스는 여러 인터페이스를 구현할 수 있지만 상속은 하나의 클래스만 받을 수 있습니다.
레코드(record)는 값을 담는 불변 데이터 클래스를 짧게 선언하는 방법입니다. 생성자, 접근자, equals, hashCode, toString 을 컴파일러가 만들어 줍니다. 접근자 이름은 getX() 가 아니라 필드 이름 그대로 x() 입니다.
interface Shape {
double area();
default String describe() {
return getClass().getSimpleName() + " area=" + area();
}
}
record Circle(double radius) implements Shape {
Circle { // 간결한 생성자: 검증
if (radius < 0) throw new IllegalArgumentException("radius < 0");
}
public double area() { return Math.PI * radius * radius; }
}
record Rect(double width, double height) implements Shape {
public double area() { return width * height; }
}
enum Status {
ACTIVE("활성"), SUSPENDED("정지");
private final String label;
Status(String label) { this.label = label; }
String label() { return label; }
}열거형(enum)은 정해진 상수 집합을 타입으로 표현합니다. 필드와 메서드를 가질 수 있고 switch 와 잘 어울립니다. Status.valueOf("ACTIVE"), Status.values() 같은 메서드가 자동으로 제공됩니다.
제네릭은 타입을 매개변수로 받아 여러 타입에서 재사용할 수 있는 코드를 만듭니다. 컴파일 시점에 타입을 검사하므로 형변환 실수를 줄여 줍니다. 꺾쇠 안의 타입은 객체 타입이어야 하므로 List<int> 가 아니라 List<Integer> 를 씁니다.
record Pair<A, B>(A first, B second) {}
static <T extends Comparable<T>> T max(java.util.List<T> items) {
T best = items.get(0);
for (T item : items) {
if (item.compareTo(best) > 0) best = item;
}
return best;
}
var pair = new Pair<>("age", 30); // 다이아몬드 연산자로 추론
String key = pair.first();
int biggest = max(java.util.List.of(3, 9, 4)); // 9T extends Comparable<T> 처럼 경계를 두면 그 타입이 가진 메서드를 쓸 수 있습니다. 읽기 전용 매개변수에는 List<? extends Number> 같은 와일드카드를 쓰기도 합니다.
java.util 의 컬렉션 프레임워크는 인터페이스와 구현으로 나뉩니다. 변수 타입은 인터페이스로 선언하고 구현은 필요에 맞게 고르는 것이 관례입니다.
| 인터페이스 | 주요 구현 | 특징 |
|---|---|---|
List | ArrayList, LinkedList | 순서가 있고 중복을 허용 |
Set | HashSet, LinkedHashSet, TreeSet | 중복이 없음 |
Map | HashMap, LinkedHashMap, TreeMap | 키와 값의 쌍 |
import java.util.*;
List<String> langs = new ArrayList<>(List.of("Java", "Go"));
langs.add("Rust");
langs.remove("Go");
Set<String> tags = new HashSet<>();
tags.add("jvm");
tags.add("jvm"); // 중복은 무시됨
System.out.println(tags.size()); // 1
Map<String, Integer> stock = new HashMap<>();
stock.put("apple", 3);
stock.merge("apple", 2, Integer::sum); // 5
int pears = stock.getOrDefault("pear", 0);
for (Map.Entry<String, Integer> e : stock.entrySet()) {
System.out.println(e.getKey() + "=" + e.getValue());
}
List<Integer> fixed = List.of(1, 2, 3); // 변경 불가 목록List.of, Set.of, Map.of 로 만든 컬렉션은 변경할 수 없어서 add 를 호출하면 UnsupportedOperationException 이 발생합니다. 변경이 필요하면 위처럼 new ArrayList<>(...) 로 복사해 씁니다. HashMap 과 HashSet 은 순서를 보장하지 않으므로 넣은 순서가 필요하면 LinkedHashMap, 정렬이 필요하면 TreeMap 을 씁니다.
equals 를 씁니다.List, Set, Map 을 상황에 맞게 고릅니다.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.