Skip to main content

Java 심화

열거형 (Enum types)

열거형 (enum)은 서로 연관된 상수들의 목록, 집합을 의미하며 Java에서도 enum 타입이 지원된다.
상수를 분류하여 중복된 이름을 피하고 타입 안정성을 얻을 수 있다.
Java switch문에서도 사용 가능하다.

public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY
}

References

제네릭 (Generics)

타입을 구체적으로 지정하지 않고 매개변수화시켜서 추후에 지정할 수 있도록 일반화하는 것을 제네릭이라고 한다.

public class Util {
public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) { // 제네릭 메서드
return p1.getKey().equals(p2.getKey()) &&
p1.getValue().equals(p2.getValue());
}
}

public class Pair<K, V> { // 제네릭 클래스 (제네릭 타입: 제네릭 클래스, 제네릭 인터페이스)

private K key;
private V value;

public Pair(K key, V value) {
this.key = key;
this.value = value;
}

public void setKey(K key) { this.key = key; }
public void setValue(V value) { this.value = value; }
public K getKey() { return key; }
public V getValue() { return value; }
}

제네릭을 사용하는 이유

  • Object 클래스를 사용하는 것 보다 컴파일 타임 타입 체크를 확실하게 할 수 있고 타입 캐스팅을 줄일 수 있다.
  • 여러 다른 타입에 사용할 수 있고 커스터마이징 가능, 타입 체크 가능한 제네릭 알고리즘을 만들 수 있어서 코드의 중복을 막는데 도움이 된다.

References

예외 처리 (Exception handling)

프로그램 실행 중에 일반적인 흐름을 방해하는 이벤트를 예외라고 한다.
Java에서는 try, throws, throw 등을 사용하여 예외를 처리할 수 있다.

public void writeList() { // try-catch-finally
PrintWriter out = null;

try {
System.out.println("Entering" + " try statement");

out = new PrintWriter(new FileWriter("OutFile.txt"));
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
} catch (IndexOutOfBoundsException e) {
System.err.println("Caught IndexOutOfBoundsException: "
+ e.getMessage());

} catch (IOException e) {
System.err.println("Caught IOException: " + e.getMessage());

} finally {
if (out != null) {
System.out.println("Closing PrintWriter");
out.close();
}
else {
System.out.println("PrintWriter not open");
}
}
}
public void writeList() throws IOException, IndexOutOfBoundsException { // throws
...
}
public Object pop() {
Object obj;

if (size == 0) {
throw new EmptyStackException(); // throw
}

obj = objectAt(size - 1);
setObjectAt(size - 1, null);
size--;
return obj;
}

References

Further Reading

컬렉션 프레임워크 (Collections framework)

여러 요소를 하나로 묶은 객체를 컬렉션이라고 한다.
컬렉션 프레임워크는 컬렉션을 필요한 기능에 맞게 여러 자료 구조로 구현하여 요소를 추가, 삭제, 수정, 검색, 정렬 하는 메서드를 제공한다.

InterfaceHash TableResizable ArrayBalanced TreeLinked ListHash Table + Linked List
SetHashSetTreeSetLinkedHashSet
ListArrayListLinkedList
DequeArrayDequeLinkedList
MapHashMapTreeMapLinkedHashMap

List<E>

배열과 비슷하게 객체를 일렬로 늘어놓을 때 사용한다.
컬렉션의 요소가 되는 객체들이 중복되어도 무방하다.
객체를 인덱스로 관리하기 때문에 순서를 기억하게 되며 검색, 추가, 삭제의 기능이 기본적으로 제공된다.

Set<E>

요소의 중복이 없게 할 때 사용한다.
기본적으로는 순서를 고려하지 않으나 연결 리스트, 트리를 이용하여 구현한 경우 순서 고려, 정렬 기능까지 사용할 수 있다.

이터레이터 (Iterator)

컬렉션의 요소를 하나씩 순회할 때 사용하는 객체이다.
컬렉션에 따라 iterator() 메서드를 사용하여 이터레이터를 만들 수 있다.

References

Map<K,V>

Key와 value로 이루어진 객체를 저장할 때 사용한다.
Key와 value는 각각 객체로 이루어져 있고 하나의 entry 객체를 이룬다.
Key는 고유한 값을 가지고 있어야 하고 각 entry에 접근하는 역할을 할 수 있다.
Key와 entry는 중복이 허용되지 않고 value는 중복될 수 있다.

Set과 마찬가지로 기본적으로는 순서를 고려하지 않으나 연결 리스트, 트리를 이용하여 구현한 경우 순서 고려, 정렬 기능까지 사용할 수 있다.

이터레이터를 활용할 때 Map 자체로는 이터레이터를 사용할 수 없고 entrySet(), keySet(), values() 등 각 entry, key, value 들을 따로 Set, Collection으로 반환해주는 메소드를 활용한 후 이터레이터를 사용해야 한다.

References

Further Reading

애너테이션 (Annotations)

람다 (Lambda)

스트림 (Streams)

Further Reading

파일 입출력 (I/O)

스레드 (Threads)

자바 가상 머신 (Java virtual machine)

Java (JVM)의 메모리 구조, 관리

메서드 영역

선언한 클래스와 메서드에 대한 정보 저장한다.

힙 영역

new 키워드를 사용하는 등 새 인스턴스를 생성했을 때 그 정보를 저장한다.
힙 영역에 담긴 메서드 정보는 메서드 영역에 있는 메서드의 주소를 저장한다.

스택 영역

호출된 메서드를 후입선출의 스택 자료구조로 처리하게 되는데 메서드 내부에서 사용하는 참조변수, 매개변수, 지역변수, 리턴값, 중간 연산값 등을 스택 영역에 저장한다.
스택 영역에 있는 참조변수는 힙 영역에 있는 인스턴스의 주소를 저장한다.

런타임 상수 풀

class 파일에 있는 상수 풀을 저장한다.

PC 레지스터

각 스레드의 현재 실행중인 메서드의 위치를 가리킨다.

네이티브 메서드 스택

C 언어 등 자바가 아닌 언어를 포함한 native 메서드를 호출할 때 사용한다.

References

Further Reading