Java(6)

Jinny·2021년 5월 12일
0

제네릭(Generic) 프로그래밍

모든 종류의 타입을 다룰 수 있도록 일반화된 타입 매개 변수(generic type)로 클래스나 메서드를 선언하는 기법이다. 클래스 내부에서 사용하는 데이터 타입을 클래스의 인스턴스를 생성할 때 결정한다.

  • 실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적이다.
  • 자료형 매개변수는 보통 type의 의미로 T를 많이 사용하고, 이는 생성될때 타입이 결정되므로 T 에 static 키워드는 사용할 수 없다.

  • 처리 방법: 타입 제거(type erasure)라는 개념에 근거한다.

    • 소스 코드를 JVM이 인식하는 바이트 코드로 변환할 때 인자로 주어진 타입을 제거하는 기술이다.
  • 복수 제네릭도 가능하다.

  • 특징

    • 컴파일 시 강한 체크 타입 가능

      • 기본 데이터 타입(int, long)으로는 지정 불가능하고, Wrapper 클래스(Integer, Boolean) 등 참조 자료형으로 가능하다.
    • 제네릭 타입으로 특정 클래스나 자식 클래스 타입만 오도록 타입 매개변수를 제한할 수 있다.

    class Stack<T extends 클래스>

c++의 템플릿(Template)

  • 개념: 템플릿은 하나의 클래스를 서로 다른 여러 타입에 재사용할 수 있도록 하는 방법

    • 예를 들어 여러 타입의 객체를 저장할 수 있는 연결리스트와 같은 자료구조를 만들 수 있다.
  • 처리 방법: 컴파일러는 인자로 주어진 각각의 타입에 대해 별도의 템플릿 코드를 생성한다.

    • 예를 들어 MyClass가 MyClass와 정적 변수(static variable)를 공유하지 않는다.

    • 하지만 java에서 정적 변수는 제네릭(Generic) 인자로 어떤 타입을 주었는지에 관계없이 MyClass로 만든 모든 객체가 공유한다.

java의 제네릭(Generic)과 c++의 템플릿(Template)의 차이

2. c++의 Template에는 int와 같은 기본 타입을 인자로 넘길 수 있지만, java의 Generic에서는 기본 자료형은 사용할 수 없고 Integer와 같은 참조 자료형만 사용 가능하다.
3. java에서 MyClass로 만든 모든 객체는 Generic 타입 인자가 무엇이냐에 관계없이 전부 동등한 타입이다.
   - c++에서는 다른 Template 타입 인자를 사용해 만든 객체는 서로 다른 타입의 객체이다.
     3. java의 경우 Generic 타입 인자를 특정 클래스나 자식 클래스 타입만 오도록 타입 매개변수를 제한할 수 있다.
4. java에서 Generic 타입의 인자는 static 메서드나 변수를 선언하는 데 사용될 수 없다.
   - 왜냐하면 두 가지 다른 타입으로 선언한 두 인스턴스가 static 메서드와 변수를 공유하기 때문이다.
   - c++ Template은 이 두 인스턴스를 다른 클래스로 처리하므로 Template 타입 인자를 정적 메서드나 변수를 선언하는 데 사용할 수 있다.

JAVA Collections Framework

  • Map

    • 검색을 위한 자료구조
    • 데이터를 삽입할 때 Key와 Value의 형태로 삽입되며, Key를 이용해서 Value를 얻을 수 있다.
    • 내부적으로 hash 방식으로 구현되어 있다.
    • HashMap & HashTable
      • HashTable은 동기화를 지원하고 HashMap은 동기화를 지원하지 않음
      • 지금은 대부분 HashMap 사용
    • TreeMap
      • key 객체를 기준으로 정렬
      • key에 해당하는 클래스에 Comparable이나 Comparator 인터페이스를 구현해야함
  • Collection

    • List

      • 선형 자료구조
      • 순서가 있는 Collection
      • 데이터를 중복해서 포함할 수 있다.
      • Stack, Queue 등 포함
    • Set

      • 집합적인 개념의 Collection
      • 순서의 의미가 없다.
      • 데이터를 중복해서 포함할 수 없다.
      • 인덱스로 객체를 관리하지 않기 때문에 데이터를 검색하기 위해서는 iterator() 메서드로 반복자를 생성하고 데이터를 가져와야함.
    • HashSet

      • 값을 저장할 때 인스턴스의 해시값을 기준으로 저장하기 때문에 순서대로 저장되지 않음
      • 검색이 빠름
      • hashCode() 를 통해 hash value 추출
    • TreeSet

      • 객체의 정렬에 사용되는 클래스
      • 이진탐색트리의 형태로 구현되어 있다.
      • 객체 비교를 위해 정렬 대상이 되는 클래스에 Comparable이나 Comparator 인터페이스를 구현해야함(Comparator 사용시 TreeSet 생성자에 Comparator가 구현된 객체를 매개변수로 전달)
      • 레드-블랙 트리로 구현
    • LinkedHashSet

      • 입력된 순서대로 데이터를 관리
profile
삐약 응애

0개의 댓글