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() 등이 대표적이다.
- 포장 클래스는 기본 타입을 객체로 다룰 수 있도록 해주는 클래스이다.
- 예를 들어, int는 Integer 클래스로 포장된다.
- 이 클래스를 사용하면 기본 타입을 컬렉션과 같은 객체 기반의 데이터 구조에서 사용할 수 있다.
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를 사용한다.
- 대표적인 구현체로는 ArrayList, LinkedList, Vector가 있다.
- ArrayList: ArrayList는 크기를 동적으로 조절할 수 있는 배열이다.
- 데이터의 인덱스를 통해 빠르게 접근할 수 있지만, 중간 삽입이나 삭제에는 느리다.
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을 사용한다.
- 대표적인 구현체로는 HashSet, LinkedHashSet, TreeSet이 있다.
- 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 구조의 특성을 보여준다.
'IT & AI > AI 지식' 카테고리의 다른 글
JAVA 인터페이스, 중첩 클래스, 예외 처리 방법 (0) | 2024.11.22 |
---|---|
JAVA 객체 지향 프로그래밍: 클래스, 상속 (0) | 2024.11.21 |
JAVA 조건문, 반복문, 참조 타입(배열) 정리 (2) | 2024.11.21 |
JAVA 초보자를 위한 변수, 연산자, 데이터 입출력 이해 (1) | 2024.11.20 |
C 언어 메모리 동적 할당, 구조체, 파일 입출력 (1) | 2024.11.20 |