안녕하세요! JAVA는 프로그래밍 언어 중에서도 다양한 응용 프로그램 개발에 필수적인 역할을 합니다.
따라서 이를 위해 꼭 알아야 할 JAVA의 기본 API 클래스, 스레드 활용법, 그리고 데이터를 효율적으로 관리할 수 있는 컬렉션 프레임워크를 쉽게 이해할 수 있도록 정리해보았습니다.
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 구조의 특성을 보여준다.
혹시 이해가 어려우시다면, 이전 글을 먼저 참고해보시면 좋을 것 같습니다.
JAVA 변수, 연산자, 데이터 입출력
안녕하세요! 문과 출신 방구석 데이터 전문가와 함께하는 JAVA 기초 글에 오신걸 환영합니다. 지난 글까지는 파이썬과 C언어를 다뤄보았는데 JAVA는 C언어와 비슷한 부분이 많아서 C언어를 잘 아시
actshiny.com
JAVA 조건문, 반복문, 참조 타입(배열) 정리
안녕하세요! 지난 글에서 JAVA의 기본적인 내용에 대해 알아보았습니다. 이번에는 조건문, 반복문, 참조타입, 배열에 대해서 정리해보았습니다. C언어를 공부하신 분들은 JAVA와 크게 다르지 않다
actshiny.com
JAVA 객체 지향 프로그래밍: 클래스, 상속
안녕하세요! 지난 글까지 JAVA의 전반적인 내용에 대해 다뤄보았습니다. C언어와 파이썬(python)과 겹치는 내용들이 많았는데요. 이번에는 JAVA 프로그래밍의 핵심인 클래스와 상속에 대해 정리해보
actshiny.com
JAVA 인터페이스, 중첩 클래스, 예외 처리 방법
안녕하세요! 오늘 다뤄볼 내용은 JAVA의 코드의 유연성과 안정성을 높이는 핵심 요소입니다.객체 지향 프로그래밍의 핵심인 인터페이스, 코드 구조를 효율적으로 만들어주는 중첩 클래스, 그리
actshiny.com
'IT & AI > AI 지식' 카테고리의 다른 글
SQL 기본 및 명령어 DCL, DDL, DML, TCL (0) | 2024.11.26 |
---|---|
JAVA 입출력 스트림, 보조 스트림, 입출력 API (0) | 2024.11.23 |
JAVA 인터페이스, 중첩 클래스, 예외 처리 방법 (0) | 2024.11.22 |
JAVA 객체 지향 프로그래밍: 클래스, 상속 (0) | 2024.11.21 |
JAVA 조건문, 반복문, 참조 타입(배열) 정리 (2) | 2024.11.21 |