본문 바로가기
IT & AI/AI 지식

JAVA 기본 API, 스레드, 컬렉션 프레임워크

by 빛나는해커 2024. 11. 22.

1.  기본 API 클래스

 

java.lang 패키지

  • 자바 API 도큐먼트는 자바에서 제공하는 다양한 클래스와 메소드를 설명하는 공식 문서이다.
  • 이 문서를 통해 자바의 표준 라이브러리의 사용법을 이해하고 적절하게 활용할 수 있다.
  • 자바 API 도큐먼트는 자바 프로그래밍을 할 때 필수적인 정보들을 제공한다.
  • API 도큐먼트에서는 클래스에 대한 상세 정보를 제공한다.
  • 각 클래스 페이지는 클래스의 이름, 설명, 필드, 생성자, 메소드에 대한 설명을 포함하고 있으며, 사용법과 예시를 제공하여 클래스의 사용법을 쉽게 이해할 수 있다.
  • Object 클래스는 자바의 모든 클래스의 최상위 부모 클래스이다.
  • 모든 자바 클래스는 Object 클래스를 상속받기 때문에, Object 클래스의 메소드를 기본적으로 사용할 수 있다.
  • 대표적인 메소드로는 toString(), equals(), hashCode() 등이 있다.
public class Example {
    public static void main(String[] args) {
        Object obj = new Object();
        System.out.println(obj.toString());
    }
}
  • System 클래스는 표준 입력, 출력, 에러 출력 스트림과 관련된 메소드들을 제공한다.
  • 대표적으로 System.out은 표준 출력 스트림으로, 콘솔에 메시지를 출력할 때 사용한다.
  • 또한, System.currentTimeMillis()는 현재 시간을 밀리초 단위로 반환한다.
  • Class 클래스는 클래스의 메타 정보를 제공한다.
  • 이 클래스를 사용하여 클래스 이름, 필드, 메소드 등의 정보를 런타임에 얻을 수 있다.
  • 이는 리플렉션(reflection)과 같은 기술에 사용된다.
public class Example {
    public static void main(String[] args) {
        Class<?> clazz = Example.class;
        System.out.println("클래스 이름: " + clazz.getName());
    }
}
  • String 클래스는 문자열을 다루기 위한 클래스이다.
  • 문자열은 불변 객체로, 한 번 생성된 문자열은 변경할 수 없다.
  • String 클래스는 문자열 조작을 위한 다양한 메소드를 제공하며, concat(), substring(), equals(), length() 등이 대표적이다.
  • 포장 클래스는 기본 타입을 객체로 다룰 수 있도록 해주는 클래스이다.
  • 예를 들어, intInteger 클래스로 포장된다.
  • 이 클래스를 사용하면 기본 타입을 컬렉션과 같은 객체 기반의 데이터 구조에서 사용할 수 있다.
Integer num = Integer.valueOf(10);
int value = num.intValue();
  • Math 클래스는 수학적인 연산을 수행하는 메소드를 제공한다.
  • abs(), ceil(), floor(), max(), pow(), random() 등이 대표적인 메소드이다.
  • 이 클래스는 수학적인 계산이 필요한 경우 유용하게 사용된다.
int maxValue = Math.max(5, 10);
System.out.println("더 큰 값: " + maxValue);

 

java.util 패키지

  • Date 클래스는 날짜와 시간을 다루기 위한 클래스이다.
  • 현재 날짜와 시간을 얻기 위해 많이 사용되지만, 최신 버전에서는 java.time 패키지의 클래스를 사용하는 것이 권장된다.
  • Calendar 클래스는 날짜와 시간을 다루는 보다 유연한 방법을 제공한다.
  • 날짜의 특정 요소(연도, 월, 일 등)를 쉽게 다룰 수 있으며, 시간 조작이 필요할 때 유용하다.
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
System.out.println("현재 연도: " + year);

2.  스레드(Thread)

 

멀티 스레드

  • 스레드는 프로그램 내에서 독립적으로 실행되는 작업 단위이다.
  • 자바에서는 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현하여 스레드를 생성할 수 있다.
  • 자바 애플리케이션은 기본적으로 하나의 메인 스레드를 통해 실행된다.
  • 메인 스레드는 main() 메소드에서 시작된다.
  • 작업 스레드를 생성하려면 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현해야 한다.
  • start() 메소드를 호출하면 새로운 스레드가 생성되어 작업을 수행한다.
public class Task extends Thread {
    @Override
    public void run() {
        System.out.println("작업 스레드 실행 중");
    }

    public static void main(String[] args) {
        Task task = new Task();
        task.start();
    }
}
  • 여러 스레드가 공유하는 자원에 동시에 접근할 경우, 예상치 못한 결과가 발생할 수 있다.
  • 이를 방지하기 위해 synchronized 키워드를 사용하여 메소드를 동기화할 수 있다.
public synchronized void increment() {
    // 공유 자원을 안전하게 수정
}

 

스레드 제어

  • 스레드는 생성, 실행, 대기, 종료와 같은 다양한 상태를 가진다.
  • Thread 클래스는 이러한 스레드의 상태를 제어하는 다양한 메소드를 제공한다.
  • 스레드 상태를 제어하기 위해 sleep(), wait(), notify() 등의 메소드를 사용한다.
  • sleep() 메소드는 스레드를 일정 시간 동안 멈추게 하고, notify()wait() 메소드는 스레드 간의 협업을 위해 사용된다.
  • 데몬 스레드는 주 스레드가 종료되면 함께 종료되는 보조적인 역할을 하는 스레드이다.
  • setDaemon(true) 메소드를 사용하여 스레드를 데몬으로 설정할 수 있다.
Thread daemonThread = new Thread(() -> {
    while (true) {
        System.out.println("데몬 스레드 실행 중");
    }
});
daemonThread.setDaemon(true);
daemonThread.start();

3.  컬렉션 프레임워크

 

컬렉션 프레임워크

  • 자바의 컬렉션 프레임워크는 데이터를 효율적으로 저장하고 조작할 수 있는 표준화된 클래스들의 집합이다.
  • 이 프레임워크를 통해 데이터 그룹을 처리하는 작업이 간단해지고, 다양한 자료구조와 알고리즘을 쉽게 활용할 수 있다.
  • 컬렉션 프레임워크는 주로 List, Set, Map 인터페이스를 중심으로 구성된다.
  • List는 순서가 있는 데이터의 집합으로, 중복된 요소를 허용한다.
  • 예를 들어 학생 명단, 쇼핑 목록처럼 데이터의 순서가 중요한 경우 List를 사용한다.
  • 대표적인 구현체로는 ArrayListLinkedListVector가 있다.
  • ArrayListArrayList는 크기를 동적으로 조절할 수 있는 배열이다.
  • 데이터의 인덱스를 통해 빠르게 접근할 수 있지만, 중간 삽입이나 삭제에는 느리다.
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println(list.get(1));  // 출력: Banana
  • LinkedList: LinkedList는 요소를 노드 단위로 연결하여 저장하는 자료구조이다.
  • 중간 삽입, 삭제가 빈번할 경우 ArrayList보다 효율적이다.
List<String> linkedList = new LinkedList<>();
linkedList.add("Dog");
linkedList.add("Cat");
linkedList.addFirst("Rabbit");
System.out.println(linkedList);  // 출력: [Rabbit, Dog, Cat]
  • Vector: Vector는 ArrayList와 유사하지만, 동기화를 지원하여 스레드 안전하다.
  • 스레드 환경에서 List가 필요한 경우 사용된다.
  • Set은 중복된 요소를 허용하지 않는 데이터의 집합이다.
  • 예를 들어, 학생들의 고유한 학번처럼 유일한 값만을 저장하고자 할 때 Set을 사용한다.
  • 대표적인 구현체로는 HashSetLinkedHashSetTreeSet이 있다.
  • HashSet: HashSet은 해시 알고리즘을 사용하여 요소를 저장하며, 순서를 보장하지 않는다.
  • 중복을 허용하지 않으며, 빠른 검색과 삽입을 제공한다.
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Apple");  // 중복 요소 추가 시도
System.out.println(hashSet);  // 출력: [Apple, Banana]
  • LinkedHashSet: LinkedHashSet은 요소의 삽입 순서를 유지하며, HashSet과 유사하게 중복을 허용하지 않는다.
Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("One");
linkedHashSet.add("Two");
linkedHashSet.add("Three");
System.out.println(linkedHashSet);  // 출력: [One, Two, Three]
  • TreeSet: TreeSet은 이진 탐색 트리의 형태로 요소를 저장하며, 요소를 자동으로 정렬한다.
  • 기본적으로 오름차순 정렬이 이루어진다.
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(1);
treeSet.add(2);
System.out.println(treeSet);  // 출력: [1, 2, 3]
  • Map은 키와 값의 쌍으로 데이터를 저장하는 컬렉션이다.
  • 키는 중복될 수 없지만, 값은 중복될 수 있다.
  • 대표적인 구현체로는 HashMap, LinkedHashMap, TreeMap이 있다.
  • HashMap: HashMap은 키-값 쌍을 해시 테이블에 저장하며, 순서를 보장하지 않는다.
  • 빠른 검색, 삽입, 삭제가 가능하다.
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Apple", 3);
hashMap.put("Banana", 5);
hashMap.put("Cherry", 7);
System.out.println(hashMap.get("Banana"));  // 출력: 5
  • LinkedHashMap: LinkedHashMap은 삽입된 순서를 유지하는 HashMap이다.
  • 데이터의 삽입 순서가 중요한 경우 사용된다.
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("A", 1);
linkedHashMap.put("B", 2);
linkedHashMap.put("C", 3);
System.out.println(linkedHashMap);  // 출력: {A=1, B=2, C=3}
  • TreeMap: TreeMap은 키를 자동으로 정렬하여 저장하는 Map이다.
  • 기본적으로 오름차순으로 정렬된다.
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("Banana", 5);
treeMap.put("Apple", 3);
treeMap.put("Cherry", 7);
System.out.println(treeMap);  // 출력: {Apple=3, Banana=5, Cherry=7}

 

LIFO와 FIFO 컬렉션

  • Stack은 LIFO(Last In, First Out) 구조로, 나중에 추가된 요소가 먼저 제거된다.
  • 주로 재귀적인 데이터 구조나 작업을 수행할 때 유용하다. 
  • push(), pop(), peek() 메소드를 통해 데이터를 추가하고 제거할 수 있다.
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.pop());  // 출력: 3
System.out.println(stack.peek());  // 출력: 2
  • 위 코드에서 stack은 3을 마지막으로 추가했기 때문에 pop() 메소드를 호출하면 가장 나중에 추가된 3이 제거된다.
  • Queue는 FIFO(First In, First Out) 구조로, 먼저 추가된 요소가 먼저 제거된다.
  • 줄 서기, 작업 큐 등 순차적으로 처리해야 할 때 유용하다. 
  • LinkedList를 사용하여 큐를 구현할 수 있으며, offer()poll()peek() 메소드를 사용한다.
Queue<String> queue = new LinkedList<>();
queue.offer("First");
queue.offer("Second");
queue.offer("Third");
System.out.println(queue.poll());  // 출력: First
System.out.println(queue.peek());  // 출력: Second
  • 위 예제에서 queue는 먼저 들어온 "First"가 먼저 제거되며, 이는 FIFO 구조의 특성을 보여준다.

JAVA 기초 API, 스레드, 컬렉션 프레임워크 소개 이미지