분류 전체보기 127

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

컬렉션 프레임워크는 검색 기능을 강화시킨 TreeSet과 TreeMap을 제공하고 있다. 이름에서 알 수 있듯이 TreeSet은 Set 컬렉션이고, TreeMap은 Map 컬렉션이다. 이컬렉션들은 이진 (binary tree)를 이용해서 계층적 구조(Tree 구조)를 가지면서 객체를 저장한다. 이진트리 구조 이진 트리(Binary tree)는 여러 개의 노드(node)가 트리 형태로 연결된 구조로, 루트 노드(root node) 라고 불리는 하나의 노드에서 부터 시작해서 각 노드에 최대 2개의 노드를 연결할 수 있는 구조를 가지고 있다. 위 아래로 연결된 두 노드를 부모-자식 관계에 있다고 하며 위의 노드를 부모 노드, 아래의 노드를 자식 노드라고 한다. 하나의 부모 노드는 최대 두개의 자식 노드와 연결..

Map 컬렉션

Map 컬렉션은 키(Key) 와 값 (Value)으로 구성된 Entry 객체를 저장하는 구조를 가지고 있다. 여기서 키와 값은 모두 객체이다 키는 중복 저장될 수 없지만 값은 중복 저장 가능하다. 기존에 저장된 키와 동일한 키로 저장할시 기존 값이 새로운 값으로 대체 된다 Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다. 다음은 Map 컬렉션에서 공통적으로 사용 가능한 Map 인터페이스드의 메소드들이다. 키로 객체들을 관리하기 때문에 키를 매개값으로 갖는 메소드가 많다. 기능 메소드 설명 객체 추가 V put(K key, V value) 주어진 키로 값을 저장, 새로운 키일 경우 null을 리턴하고 동일한 키가 있을 경우 값을..

Set 컬렉션

List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다. 또한 객체를 중복해서 저장할 수 없고 , 하나의 null만 저장할 수 있다. Set 컬렉션은 수학의 집합에 비유 될 수 있다. 집한은 순서와 상관없고 중복이 허용되지않기 때문이다. 들어갈(저장할) 때의 순서와 나올(찾을) 때의 순서가 다를수도 있다 Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있다. 아래는 Set 컬렉션에서 공통으로 사용가능한 Set 인터페이스 메소드이다. 인덱스로 관리하지 않기 때문에 인덱스 매개값을 가지는 메소드는 없다. 기능 메소드 설명 객체추가 boolean add(E e) 주어진 객체를 저장, 객체가 성공적으로 저장되면 true를 리턴하고 중복 객체면 fa..

List 컬렉션

List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있다. 객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공한다. List 컬렉션은 객체 자체를 저장하는 것이 아니라 다음 그림과 같이 객체의 번지를 참조한다. 동일한 객체를 중복 저장할 수 있는데 이경우 동일한 번지가 참조된다, null도 저장이 가능한데, 이 경우 해당 인덱스는 객체를 참조하지 않는다. List 컬렉션에는 ArrayList, Vector, LinkedList 등이 있는데, 다음은 List 컬렉션에서 공통적으로 사용 가능한 List 인터페이스의 메소드들이다. 인덱스로 객체를 관리하기 때문에 인덱스를 매개값으로 갖는 메소드가 많다 기능 메소드 설명 객체추가 bool..

컬렉션 프레임 워크

컬렉션 프레임워크 소개 애플리케이션을 개발하다 보면 다수의 객체를 저장해 두고 필요할 때마다 꺼내서 사용하는 경우가 많다. 만약 10개의 Product 객체를 저장해 두고, 필요할 때마다 하나씩 꺼내서 이용한다고 가정해보자 어떻게 Product 객레츨 효율적으로 추가, 검색, 삭제 할지 고민해야 되는데, 가장 간단한 방법은 배열을 이용하는 것이다 // 길이 10인 배열 생성 Product[] array = new Product[10]; //객체 추가 array[0] = new Product("Model1"); array[1] = new Product("Model20"); //객체 검색 Product model1 = array[0]; Product model2 = array[2]; //객체 삭제 array..

람다식 표준 API의 함수적 인터페이스, 메소드 참조

표준 API의 함수적 인터페이스 자바에서 제공되는 표준 API에서 한 개의 추상 메소드를 가지는 인터페이스들은 모두 람다식을 이용해서 익명 구현 객체로 표현이 가능하다. 예를 들어 스레드의 작업을 정의하는 Runnable 인터페이스는 매개 변수와 리턴 값이 없는 run() 메소드만 존재하기 때문에 다음과 같이 람다식을 이용해서 Runnable 인스턴스를 생성 시킬수 있다. package Chapter14; public class RunnableExample { public static void main(String[] args) { Runnable r = () -> { for(int i = 0; i < 10; i++) { System.out.println("Hello from thread " + Thre..

람다식

람다식이란? 자바는 객체 지향 프로그래밍이 소프트웨어 개발의 주요 패러다임이였던 1990년대에 디자인 되었다. 객체 지향 프로그래밍 나오기 오래전부터 Lisp 또는 Scheme 와 같은 함수적 프로그래밍 언어들이 있었는데, 학계를 제외하고는 현업에서 큰 호응 받지 못했다. 최근 들어 함수적 프로그래밍이 다시 부각되고 있는데, 병렬 처리와 이벤트 지향 프로그래밍에 적합하기 때문이다. 그래서 객체 지향 프로그래밍과 함수적 프로그래밍을 혼합함으로써 더욱 효율적인 프로그래밍이 될수 있도록 프로그램 개발 언어가 변하고 있다. 자바는 함수적 프로그래밍을 위해 자바 8부터 람다식(Lambda Expressions)을 지원하면서 기존의 코드 패턴이 많이 달라졌다. 람다식은 수학자 알론조 처리(Alonzon Church..

[제네릭]

왜 제네릭을 사용해야 하는가? Java 5부터 제네릭(Generic) 타입이 새로 추가, 제네릭 타입을 이용함 으로써 잘못된 타입이 사용될수 있는 문제를 컴파일 과정에서 제거 제네릭은 컬렉션, 람다식, 스트림, NIO에서 널리 사용되므로 확실히 이해 API 도큐먼트를 보면 제네릭 표현이 많다, 제네릭은 클래스와 인터페이스, 메소드를 정의할때 타입(type)을 파라미터(parameter)로 사용할 수 있게함 타입 파라미터는 코드 작성시 구체적인 타입으로 대체 되어 다양한 코드 생성하도록 해줌 제네릭 코드의 장점 컴파일 시 강한 타입 체크를 할수 있다. -> 자바 컴파일러는 코드에서 잘못 사용된 타입 때문에 발생하는 문제점을 제거하기위해 제네릭 코드에 대해 강한 타입 체크를 한다. 실행 시 타입 에러가 나는..

스레드 풀

병렬 작업 처리가 많아지면 스레드 개수가 증가되고 그에 따른 스레드 생성과 스케줄링으로 인해 CPU가 바빠져 메모리 사용량이 늘어난다. 따라서 애플리케이션의 성능저하 된다. 갑작스런 병렬 작업의 폭증으로 인한 스레드의 폭증을 막으려면 스레드풀(ThreadPool)을 사용해야 한다. 스레드풀은 작업처리에 사용되는 스레드를 제한된 개수만큼 정해놓고 작업 큐 (Queue)에 들어노는 작업들을 하나씩 스레드가 맡아 처리한다 작업 처리가 끝난 스레드는 다시 작업 큐에서 새로운 작업을 가져와 처리한다. 그렇기 때문에 작업 처리 요청이 폭증되어도 스레드의 전체 개수가 늘어나지 않으므로 애플리케이션의 성능이 급격히 저하 되지 않는다. 자바는 스레드풀을 생성하고 사용할 수 있도록 java.util.concurrent 패..

스레드 그룹(ThreadGroup)

스레드 그룹은 관련된 스레드를 묶어서 관리할 목적으로 이용된다. JVM이 실행 되면 system 스레드 그룹을 만들고, JVM 운영에 필요한 스레드들을 생성해서 system 스레드 그룹에 포함시킨다 그리고 system의 하위 스레드 그룹으로 main을 만들고 메인 스레드를 main 스레드 그룹에 포함시킨다. 스레드는 반드시 하나의 스레드 그룹에 포함되는데, 명시적으로 스레드 그룹에 포함시키지 않으면 기본적으로 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 된다. 우리가 생성하는 작업 스레드는 대부분 main 스레드가 생성하므로 기본적으로 main 스레드 그룹에 속하게 된다. 스레드 그룹 이름 얻기 현재 스레드가 속한 스레드 그룹의 이름을 얻고 싶다면 다음과 같은 코드를 사용 할 수 있다. Thread..