ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 19일차 - TreeSet<E>, Queue<E>, 컬렉션 기반 알고리즘, 열거형, 매개변수의 가변인자, 어노테이션, 네스티드 클래스, 람다
    AI 솔루션 개발자과정(Java, Python) 2022. 11. 3. 17:56

    TreeSet<E> 클래스의 이해와 활용

    Set<E> 인터페이스를 구현하는 TreeSet<E> 클래스

    트리(Tree) 자료구조를 기반으로 인스턴스를 저장하고, 이는 정렬 상태가 유지되면서 인스턴스가 저장됨을 의미한다.

     

    for-each문에 의한 반복, 반복자에 의한 반복 모두 가능하다.

     

    TreeSet은 제네릭 기반 클래스이기 때문에 정렬을 위한 Compareble 인터페이스또한 제네릭기반 인터페이스로 작성해야한다.

     

    Comparator<T> 인터페이스

     

     

    23-4. Queue<E> 인터페이스를 구현하는 컬렉션 클래스들

    스택(Stack)과 큐(Queue) 그리고 덱(Deque)

    스택은 박스처럼 먼저 넣는 물건은 아래에 쌓이는 형식이다

    물건을 넣은 순서의 역순으로 꺼내야 한다. First in last out

     

    큐는 터널처럼 먼저 들어온 자료가 먼저 나가는 형식이다.

    자료를 넣은 순서대로 차례대로 나간다. First in First out

     

    덱은 터널이긴 하나, 두 구멍이 모두 입구도 출구도 될 수 있다.

    따라서 일정한 규칙에 의해 입출(in-out)되지 않는다.

     

     

    큐 인터페이스

    큐의 구현

    다형성 : 부모 타입 참조 변수가 자식 타입 인스턴스를 참조할 수 있는 것.

     

    다형성으로 인한 특징 : 부모 타입 참조 변수로 자식 인스턴스를 참조했을 때, 부모 타입의 멤버 또는 자식이 오버라이딩한 대상에 대해서만 접근할 수 있다.

     

    LinkedList<E>는 List<E>와 동시에 Queue<E>를 구현하는 컬렉션 클래스이다.

    따라서 어떠한 타입의 참조변수로 참조하느냐에 따라 ‘리스트’로도큐’로도 동작한다.

    또한 Deque<E>도 구현 가능하다. LinkedList<E>는 '리스트', '큐', '덱' 모두 동작한다.

     

    스택의 구현

    스택은 덱을 기준으로 구현하는 것이 자바에서의 원칙이다.

     

    Map<K, V> 인터페이스를 구현하는 컬렉션 클래스들

    맵 : 두 개의 자료가 하나의 요소를 구성하는 특성을 지닌다.

    각 자료는 키와 밸류로 구분, 키는 실질적 데이터가 아니다.

    키는 실질적 데이터인 밸류를 찾기 위한 지표 역할을 한다.

     

    키의 중복은 불가능 하다. 하지만 밸류의 중복은 가능하다.

     

    HashMap<K, V> 클래스는 Iterable<T> 인터페이스를 구현하지 않으니 for-each문을 통해서, 혹은 ‘반복자’를 얻어서 순차적 접근을 진행할 수 없다.

    대신 다음 메소드 호출을 통해서 Key를 따로 모아 놓은 컬렉션 인스턴스를 얻을 수 있다. 그리고 이때 반환된 컬렉션 인스턴스를 대상으로 반복자를 얻을 수 있다.

       public Set<K> keySet()

     

    TreeMap<K, V>

    TreeMap<K, V>은 자료를 오름차순으로 정렬하는 기능도 포함하고 있다.

     

     

     

    컬렉션 기반 알고리즘

    정렬(sort)

     

     

     

     

     

    제네릭 기반의 클래스, 또는 제네릭 기반의 인터페이스 간에 <>안의 타입이 서로 다르면 상속 관계가 성립되지 않는다. 따라서 Collection의 sort는 하한제한을 이용해 컴파일 에러를 방지한다.

     

     

     

    열거형

    인터페이스 기반 상수의 정의: 자바 5 이전의 방식

     

     

    이전 방식의 문제점

     

     

     

    자료형의 부여를 돕는 열거형

    case문에서는 표현의 간결함을 위해 Do와 같이 ‘열거형 값’의 이름만 명시하기로 약속되어 있다.

     

     

    클래스 내에 열거형 정의 가능

    클래스 내에 열거형이 정의되면 해당 클래스 내에서만 사용 가능한 열거형이 된다.

     

     

    열거형 값의 정체: 열거형 값이 인스턴스라는 증거1

     

    열거형 값의 정체: 열거형 값이 인스턴스라는 증거2

     

     

    매개변수의 가변 인자 선언

    자료형과 매개변수 사이에 ...을 붙여서 가변 인자 선언을 한다.

     

     

    가변 인자 선언에 대한 컴파일러 처리

    어노테이션

    어노테이션의 종류

    @Override

    오버라이딩. 같은 이름의 메소드를 재정의하여 사용한다.

     

    @Deprecated

    문제의 발생 소지가 있거나 개선된 기능의 다른 것으로 대체되어서 더 이상 필요 없게 되었음을 뜻 함

     

    @SuppressWarnings

    @SuppressWarnings("deprecation")

    @Deprecated 로 인해 발생하는 deprecation 관련 경고 메시지를 생략하라는 의미이다. 

     

     

    네스티드 클래스

    네스티드 클래스의 구분

    이너 클래스를 세분화하면 3가지로 나눌 수 있다.

     

    멤버 클래스 (Member Class)

      → 인스턴스 변수, 인스턴스 메소드와 동일한 위치에 정의하는 클래스. 멤버 역할을 하는 클래스이다.

    로컬 클래스 (Local Class)

      중괄호 내에, 특히 메소드 내에 정의하는 클래스이다.

    익명 클래스 (Anonymous Class)

      → 클래스를 1회성으로 재정의 하여 사용하는 클래스이다.

     

     

    Static 네스티드 클래스

    (static)클래스 멤버는 (non-static)인스턴스 멤버에 접근할 수 없다.
     클래스 멤버 입장에서는 인스턴스 멤버의 존재 여부를 보장할 수 없다.
     추가로, static 네스티드 클래스는 외부 클래스의 메소드에도 접근할 수 없다.

    static 클래스의 num은 인스턴스 멤버에 접근할 수 없으니 static 키워드를 붙여서 접근이 가능하게 만들어야 한다.

     

     

     

    멤버 클래스는 인스턴스 객체이기 때문에 인스턴스 생성이 선행되어야 한다.

     

    멤버 클래스의 인스턴스는 외부 클래스의 인스턴스에 종속적이다.

     

     

    멤버 클래스의 사용 용도.

    멤버 클래스는 클래스의 정의를 감추어야 할 때 유용하게 사용이 된다.

    멤버 클래스를 private로 정의해서 사용 용도를 외부 클래스 내부로 제한한다.

     

     

     

    로컬 클래스

    로컬 클래스는 멤버 클래스와 상당 부분 유사하다. 지역(특히 메소드) 내에 정의된다는 차이점만 보인다.

     

    익명 클래스

    익명 클래스는 인터페이스를 바로 구현할 때 자주 사용한다.

    익명 클래스는 1회성으로 따로 지정한 이름이 없어서 익명 클래스 라고 부른다.

    익명 클래스의 마지막에는 꼭 세미콜론(;)을 붙여야 한다.

     

     

     

     

     

    람다

    람다의 이해

    람다는 메소드를 좀 더 간결하게 표현하는 규칙이다.

     

    람다 기본형

    (매개변수) -> { 기능(지역) }

    람다를 사용하는 주된 목적 : 인터페이스에 정의된 단 하나의 추상 메소드가 있을 때 그것을 최대한 간결하게 정의한다.

    문자열을 받아서 출력하는 인터페이스를 구현했다.이를 익명 클래스를 이용하면 코드가 간결해진다.

     

    익명 클래스를 사용하여 간결해진 코드를 람다를 사용하여 더 간결하게 표현할 수 있다.

    Printable prn =   은 인터페이스의 참조변수 선언이다.

    (s)는 인터페이스의 매개변수, 출력문은 인터페이스의 기능이다.

     

     

    b는 바이크 인터페이스의 참조변수이고, 익명 클래스를 기반으로 메소드를 정의한 코드이니 이는 인스턴스 생성이라 볼 수 있어서 대상이 학실한 참조 대상을 지운다.

    public void drive는 인터페이스의 메소드와 같으니 지운다.

    dist가 매개변수라고 판단하기 힘드니 인터페이스의 메소드 매개변수는 되돌린다.

    대신 매개변수의 대상임은 파악되니 자료형 int는 제거한다.

     

    매개변수 (dist)가 body부분을 실행시킨다는 뜻에서 -> 를 매개변수와 body사이에 입력한다.

Designed by Tistory.