Java 78

[JAVA] 수정할 수 없는 컬렉션

수정할 수 없는 컬렉션수정할 수 없는 컬렉션이란 요소를 추가, 삭제할 수 없는 컬렉션을 말한다. 컬렉션 생성 시 저장된 요소를 변경하고 싶지 않을 때 유용하다. 여러 가지 방법으로 만들 수 있는데, 먼저 첫 번째 방법으로는 List, Set, Map 인터페이스의 정적 메서드인 of()로 생성할 수 있다.List immutableList = List.of(E... elements);Set immutableSet = Set.of(E... elements);Map immutableMap = Map.of(K k1, V v1, K k2, V v2, ...); 두 번째 방법은 List, Set, Map 인터페이스의 정적메서드인 copyOf()을 이용해 기존 컬렉션을 복사하여 수정할 수 없는 컬렉션을 만드는 것이다...

Language/JAVA 2024.10.18

[JAVA] 동기화된 컬렉션

동기화된 컬렉션컬렉션 프레임워크의 대부분의 클래스들은 싱글 스레드 환경에서 사용할 수 있도록 설계되었다. 그렇기 때문에 여러 스레드가 동시에 컬렉션에 접근한다면 의도하지 않게 요소가 변경될 수 있는 불안전한 상태가 된다. Vector와 Hashtable은 동기화된 메서드로 구성되어 있기 때문에 멀티 스레드 환경에서 안전하게 요소를 처리할 수 있지만, ArrayList와 HashSet, HashMap은 동기화된 메서드로 구성되어 있지 않아 멀티 스레드 환경에서 안전하지 않다. 경우에 따라서는 ArrayList, HashSet, HashMap을 멀티 스레드 환경에서 사용하고 싶을 것이다. 이런 경우를 대비해서 컬렉션 프레임워크는 비동기화된 메서드를 동기화된 메서드로 래핑 하는 Collections의 sync..

Language/JAVA 2024.10.18

[JAVA] LIFO와 FIFO 컬렉션

LIFO와 FIFO 컬렉션후입선출(LIFO)은 나중에 넣은 객체가 먼저 빠져나가고, 선입선출(FIFO)은 먼저 넣은 객체가 먼저 빠져나가는 구조를 말한다. 컬렉션 프레임워크는 LIFO 자료구조를 제공하는 스택 클래스와 FIFO 자료구조를 제공하는 큐 인터페이스를 제공하고 있다. StackStack 클래스는 LIFO 자료구조를 구현한 클래스이다. 다음은 Stack 객체를 생성하는 방법이다.Stack stack = new Stack();Stack stack = new Stack(); 다음은 Stack 클래스의 주요 메서드이다.리턴 타입메서드설명Epush(E item)주어진 객체에 스택을 넣는다.Epop()스택의 맨 위 객체를 빼낸다. 다음은 동전 케이스를 Stack 클래스로 구현한 예제이다. 동전 케이스는 ..

Language/JAVA 2024.10.18

[JAVA] 검색 기능을 강화시킨 컬렉션

TreeSetTreeSet은 이진트리를 기반으로 한 Set 컬렉션이다. 이진트리는 여러 개의 노드가 트리 형태로 연결된 구조로, 루트 노드라고 불리는 하나의 노드에서 시작해 각 노드에 최대 2개의 노드를 연결할 수 있는 구조를 가지고 있다. TreeSet은 객체에 저장하면 부모 노드의 객체와 비교해서 낮은 것은 왼쪽 자식 노드에, 높은 것은 오른쪽 자식 노드에 저장한다.TreeSet treeSet = new TreeSet();TreeSet treeSet = new TreeSet(); Set 타입 변수에 대입해도 되지만 TreeSet 타입으로 대입한 이유는 검색 관련 메서드가 TreeSet에만 정의되어 있기 때문이다. 다음은 TreeSet이 가지고 있는 검색 관련 메서드들이다.리턴 타입 메서드설명Efirs..

Language/JAVA 2024.10.18

[JAVA] Map 컬렉션

Map 컬렉션Map 컬렉션은 키와 값으로 구성된 엔트리 객체를 저장한다. 여기서 키와 값은 모두 객체이다. 키는 중복 저장할 수 없지만 값은 중복 저장할 수 있다. 기존에 저장된 키와 동일한 키로 값을 지정하면 기존 값은 없어지고 새로운 값으로 대체된다.기능메서드설명객체 추가V put(K key, V value)주어진 키와 값을 추가, 저장이 되면 리턴객체 검색boolean containsKey(Object key)주어진 키가 있는지 여부boolean containsValue(Object value)주어진 값이 있는지 여부Set> entrySet()키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴V get(Object key)주어진 키의 값을 리턴boolean isEmpty()..

Language/JAVA 2024.10.18

[JAVA] Set 컬렉션

Set 컬렉션List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다. 또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다. Set 컬렉션은 수학의 집합에 비유될 수 있다. 집합은 순서와 상관없고 중복이 허용되지 않기 때문이다. 또한 구슬주머니와도 같다. 동일한 구슬을 두 개 넣을 수 없으며, 들어갈 때와 나올 때 순서가 다를 수도 있기 때문이다.기능메서드설명객체 추가boolean add(E e)주어진 객체를 성공적으로 저장하면 true를 리턴하고 중복 객체면 false를 리턴객체 검색boolean contains(Object o)주어진 객체가 저장되어 있는지 여부isEmpty()컬렉션이 비어있는지 조사Iterator iterator()저장된 객체를 한..

Language/JAVA 2024.10.18

[JAVA] 데몬 스레드와 스레드풀

데몬 스레드데몬(daemon) 스레드는 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이다. 주 스레드가 종료되면 데몬 스레드도 따라서 자동으로 종료된다. 데몬 스레드를 적용한 예로는 워드의 자동 저장, 미디어 플레이어의 동양상 및 음악 재생, 가비지 컬렉터 등이 있는데, 여기에서 주 스레드(워드, 미디어 플레이어, JVM)가 종료되면 데몬 스레드도 같이 종료된다. 스레드를 데몬으로 만들기 위해서는 주 스레드가 데몬이 될 스레드의 setDaemon(true)를 호출하면 된다.public static void main(String[] args) { AutoSaveThread thread = new AutoSaveThread(); thread.setDaemon(true); thread.s..

Language/JAVA 2024.10.17

[JAVA] 스레드 메서드

스레드 이름스레드는 자신의 이름을 가지고 있다. 메인 스레드는 'main'이라는 이름을 가지고 있고, 작업 스레드는 자동적으로 'Thread-n'이라는 이름을 가진다. 작업 스레드의 이름을 Thread-n 대신 다른 이름으로 설정하고 싶다면 Thread 클래스의 setName() 메서드를 사용하면 된다.thread.setName("스레드 이름"); 스레드 이름은 디버깅할 때 어떤 스레드가 작업을 하는지 조사할 목적으로 주로 사용된다. 현재 코드를 어떤 스레드가 실행하고 있는지 확인하려면 정적 메서드인 currentThread()로 스레드 객체의 참조를 얻은 다음 getName() 메서드로 이름을 출력해 보면 된다.Thread thread = Thread.currentThread();System.out.p..

Language/JAVA 2024.10.17

[JAVA] 멀티 스레드

멀티 스레드운영체제는 실행 중인 프로그램을 프로세스로 관리한다. 멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 말하는데, 이때 운영체제는 멀티 프로세스를 생성해서 처리한다. 하지만 멀티 태스킹이 꼭 멀티 프로세스를 의미하지는 않는다. 하나의 프로세스 내에서 멀티 태스킹을 할 수 있도록 만들어진 프로그램도 있다. 예를 들어 메신저는 채팅 작업을 하면서 동시에 파일 전송 작업을 수행하기도 한다. 하나의 프로세스가 두 가지 이상의 작업을 처리할 수 있는 이유는 멀티 스레드가 있기 때문이다. 스레드는 코드의 실행 흐름을 말하는데, 프로세스 내에 스레드가 두 개라면 두 개의 코드 실행 흐름이 생긴다는 의미이다. 멀티 프로세스가 프로그램 단위의 멀티 태스킹이라면 멀티 스레드는 프로그램 내부에서의 멀티 ..

Language/JAVA 2024.10.17

[JAVA] 타입 파라미터

제한된 타입 파라미터경우에 따라서는 타입 파라미터를 대체하는 구체적인 타입을 제한할 필요가 있다. 예를 들어 숫자를 연산하는 제네릭 메서드는 대체 타입으로 Number 또는 자식 클래스(Byte, Short, Integer, Long, Double)로 제한할 필요가 있다. 이처럼 모든 타입으로 대체할 수 없고, 특정 타입과 자식 또는 구현 관계에 있는 타입만 대체할 수 있는 타입 파라미터를 제한된 타입 파라미터라고 한다. 정의는 다음과 같다.public 리턴타입 메서드(매개변수, ...) { ... } 상위 타입은 클래스뿐만 아니라 인터페이스도 가능하다. 인터페이스라고 해서 implements를 사용하지는 않는다. 다음은 Number 타입과 자식 클래스에만 대체 가능한 타입 파라미터를 정의한 것이다.p..

Language/JAVA 2024.10.16