Skip to content

Latest commit

 

History

History
158 lines (101 loc) · 8.19 KB

readme9.md

File metadata and controls

158 lines (101 loc) · 8.19 KB

Java

[ 2022-08-03 ]

목차


  • 라이브러리(library)

    Java에서는 우리가 원하는 모든것은 객체 즉,class단위로 작성하여 프로그램을 작성한다.
    우리가 작성하는 class외에 Java에서는 미리 자주사용되고 유용한 기능을 하는 class들을 만들어 놓고 제공을한다.
    이떄 이 클래스들을 관련된 기능별로 분류하여 패키지단위로 묶어서 관리하는데 이 패키지 파일을 라이브러리라고 한다.
    API는 이러한 클래스들의 코드를 문서로 제공하는 것이다.

    현실세계에서의 라이브러리(도서관)란 필요할 때마다 꺼내볼 수 있는 책(지식)들이 모여있는 곳이다.
    프로그래밍에서의 라이브러리란 필요한 기능들이 모여있는 코드의 묶음이라고 생각할 수 있다.
    자주 사용되는 기능들을 라이브러리(객체나 함수등의 형태)로 만들어두면, 필요할 때마다 직접 호출하여 사용할 수 있다.

  • 프레임워크(framework)

    프레임워크란, 소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것이다.
    프레임워크는 라이브러리의 컬렉션이라고 할 수 있다.

    그렇다면 둘의 차이점은 뭘까?

    프레임워크는 작업(work)의 구조(frame)가 정해져 있는 라이브러리라고 볼 수 있다.
    단, '프레임워크가 원하는 방식'대로 다양한 기능을 제공한다.
    앱/서버 등의 구동, 메모리 관리, 이벤트 루프 등의 공통된 부분은 프레임워크가 알아서 관리하며,
    개발자는 서비스별로 다른 부분만 "프레임워크가 정해준 방식대로" 클래스, 메서드 등에 구현해두면 된다.

    라이브러리는 상대적으로 F/W(framework)에 비해 자유도가 더 높고,
    프레임워크는 정해진 틀이있는 구조 내에서 프로그래밍을 하기 때문에 라이브러리에 비해 상대적으로 더 빠른 개발 효율성을 가지고 있다.

    그럼 그 프레임워크 중 내가 어제 사용한 컬렉션 프레임 워크라는 녀석을 보자.

  • 컬렉션 프레임워크(collection framework)

    자바에서 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다.
    즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것이다.
    이러한 컬렉션 프레임워크는 자바의 인터페이스(interface)를 사용하여 구현된다.

    배열을 사용하다 보면 여러가지 비효율적인 문제가 생긴다. 가장 큰 문제점은 크기가 고정적이라는 것이다.
    배열의 크기는 생성할 때 결정되며 그 크기를 넘어가게 되면 더이상 데이터를 저장할 수 없다.
    또 데이터를 삭제하면 해당 인덱스의 데이터는 비어있어 메모리가 낭비되는 등 여러 문제점들이 발생한다.
    그렇기에 자바는 배열의 이러한 문제점을 해결하기 위해, 널리 알려져 있는 자료구조를 바탕으로 객체나 데이터들을 효율적으로 관리(추가, 삭제, 검색, 저장)할 수 있는
    자료구조들을 만들어 놓았다. 이러한 자료구조들이 있는 라이브러리를 컬렉션 프레임워크라고 한다.
    대표적으로는 List, Set, Map, Stack, Queue 등이 있다.

    image url

    핵심이 되는 인터페이스 3가지를 살펴보자면

      1. List 인터페이스
    
      2. Set 인터페이스
    
      3. Map 인터페이스
    

    이렇게 있다고 보면 된다. 각각의 인터페이스는 특징은 아래와 같다.

    • List

      List<E> : 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용한다.
      
    • Set

      Set<E> : 순서가 없는 데이터의 집합으로, 데이터의 중복을 허용하지 않는다.
      
    • Map

      Map<K,V> : 키와 값의 한 쌍으로 이루어지는 데이터의 집합으로, 순서가 없다.
                 이때 키는 중복을 허용하지 않지만, 값은 중복될 수 있다.
      

    어제 썼던 List<> 이 부분들이 컬렉션 프레임워크를 이용한 부분들이였다.
    다음 예제가 ArrayList 클래스를 이용하여 리스트를 생성하고 조작하는 예제이다.

    import java.util.*;
    
    public class Collection01 {
    
        public static void main(String[] args) {
    
            // 리스트 생성
            ArrayList<String> arrList = new ArrayList<String>();
    
            // 리스트에 요소의 저장
            arrList.add("넷");
    
            arrList.add("둘");
    
            arrList.add("셋");
    
            arrList.add("하나");
    
            // 리스트 요소의 출력
            for(int i = 0; i < arrList.size(); i++) {
    
                System.out.println(arrList.get(i));
    
            }
    
        }
    
    }
  • 제네릭(generic)

    어제 내가 쓴 꺽쇠안에 클래스 타입이 명시된 패턴을 제네릭(Generic) 이라고 부르며, 제네릭 파라미터는 꺽쇠안에 포함하여 전달한다.
    제네릭(generic)이란 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미한다.
    제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법이다.
    쉽게 이야기하면 파라미터 타입이나 리턴 타입에 대한 정의를 외부로 미룬다.

    이렇게 컴파일 시에 미리 타입 검사(type check)를 수행하면 다음과 같은 장점을 가진다.

    1. 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다
    
    2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다
    

    JDK 1.5 이전에서는 여러 타입을 사용하는 대부분의 클래스나 메소드에서 인수나 반환값으로 Object 타입을 사용했다.
    하지만 이 경우에는 반환된 Object 객체를 다시 원하는 타입으로 타입 변환해야 하며, 이때 오류가 발생할 가능성도 존재한다.
    하지만 JDK 1.5부터 도입된 제네릭을 사용하면 컴파일 시에 미리 타입이 정해지므로, 타입 검사나 타입 변환과 같은 번거로운 작업을 생략할 수 있게 된다.

    예시로 아래와 같이 하나의 제네릭 파라미터를 전달받는 클래스를 정의해보자.

    class MyArray<T> { // <T> 클래스 초기화 시 한 가지의 클래스 타입을 제네릭 파라미터로 받는다
    
        T element;
    
        void setElement(T element) { this.element = element; }
    
        T getElement() { return element; }
    }

    위의 예제에서 사용된 'T'를 타입 변수(type variable)라고 하며, 임의의 참조형 타입을 의미한다.
    꼭 'T'뿐만 아니라 어떠한 문자를 사용해도 상관없으며, 여러 개의 타입 변수는 쉼표(,)로 구분하여 명시할 수 있다.
    타입 변수는 클래스에서뿐만 아니라 메소드의 매개변수나 반환값으로도 사용할 수 있다.

    위와 같이 선언된 제네릭 클래스(generic class)를 생성할 때에는 타입 변수 자리에 사용할 실제 타입을 명시해야 한다.

    MyArray<Integer> myArr = new MyArray<>(); // Java SE 7부터 인스턴스 생성 시 타입을 추정할 수 있는 경우에는 타입을 생략할 수 있다.