[CODE-STATES-BE] SEC-1[JAVA] Generic,Collection

유형찬·2022년 9월 13일
0

Code States

목록 보기
6/21

What is Generic

  • 타입을 구체적으로 지정하는 것이 아니라, 추후에 지정할 수 있도록 일반화해두는 것
  • 작성한 클래스 또는 메서드의 코드가 특정 데이터 타입에 얽매이지 않게 해둔 것
  • 즉 , 다양한 클래스를 받아 올 수 있게 한 것

Example

public static <T> Response<T> success(String name, T body) {
        Map<String, T> map = new HashMap<>();
        map.put(name, body);

        return new Response(new ApiResponseHeader(SUCCESS, SUCCESS_MESSAGE), map);
    }

When using the Generic

  • 위와 같이 특정 반환 데이터가 구체적으로 정해지지 않았을 경우 제네릭을 사용 한다.
  • 어떤 데이터가 들어올 지 구체적으로 정해지지 않고 여러 곳에서 사용 될 때

제네릭은 Return Type , Class 멤버 변수 , 매소드 매개변수에 사용 될 수 있다.

WildCard

클래스 상속과 제네릭 관련한 내용이다.

  • 일반적으로 와일드카드는 extendssuper키워드를 조합하여 사용
<? extends T>
<? super T>

위와 같은 키워드들을 사용 하며 , 주로 다형성에서 제한을 둘 때 사용 한다고 말 할 수 있다.

class User<T> {
		public T phone;

		public User(T phone) {
				this.phone = phone;
		}
}
class IPhone extends Phone {}
class Andorid extends Phone {}

위 코드가 있다고 했을 때 , Phone 별로 기능을 나누어서 사용한다고 하자.

아이폰 , 안드로이드 폰은 서로 공통 부분도 있지만 차이점이 많이 존재 한다. 예를 들어

  • 아이폰 : Air Drop , FaceID 기능
  • 안드로이드 : 통화 녹음

공통 되지 않은 기능 또한 존재한다.

이런 경우에서

  • Iphone 계열 폰을 사용 중인 User 는 받아야 하나 안드로이드 폰을 사용 중인 유저는 사용하지 못하는 기능을 정의 해야 한다고 하자.

물론 다음과 같은 경우로도 할 수 있을 것이다.

방법 1.

public static void airDrop(User<IPhone> user) {
        System.out.println("IPhone만 airDrop을 사용할 수 있습니다. ");
  }
  • 매개 변수 제네릭 타입을 사전에 미리 지정 하여 사용
  • 이런 경우 IPhone을 상속 받는 객체의 경우 또한 사용 할 수 있다.
    • 그러나 자식 객체가 따로 만든 클래스 변수를 사용 할 수 없다.
    • 제네릭의 장점을 못 살린다. 제네릭은 각각의 객체의 클래스 변수들을 사용하는데 이 점이 크다 말 할 수 있다.

방법 2.

public static void airDrop(User<? extends IPhone> user) {
        System.out.println("IPhone만 airDrop을 사용할 수 있습니다. ");
  }
  • 매개변수 타입을 위와 같이 User<? extends IPhone> user 바꿨다.
  • 이런 경우 IPhone 을 상속 받는 모든 객체가 매개 변수로 들어 올 수 있다는 뜻이다.
  • 구체적인 타입 지정자를 정하지 않았기 때문에 제네릭의 장점을 살릴 수 있다.

Collection

사실 제네릭을 가장 많이 사용하는 건 아무래도 Collection 에서 가장 많이 사용한다.

컬렉션은 자료구조에 관한 내용이며 , 제네릭은 타입에 관한 내용이다.

  • 컬렉션 프레임 워크에서는 타입에 따른 객체가 따로 정의되어 있지 않다.
  • 제네릭을 사용하여 코드의 재사용성을 늘렸다.
  • 제네릭을 사용함으로써 개발자 개개인의 객체들 또한 자료구조로 이용 할 수 있다.

컬렉션은 뭐냐

  • Java에서는 데이터를 저장하기 위해 널리 알려져 있는 자료 구조를 바탕으로

객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 만든 인테페이스 , 클래스 프레임 워크

컬렉션의 구조

List

  • List는 데이터의 순서가 유지되며, 중복 저장이 가능한 컬렉션
  • ArrayList 는 Vector Collection 을 개선한 구조로 Vector Multi Tread 환경이 아니라면 잘 사용하지 않는다. Vector 는 Tread Safe 한 구조 이다.

ArrayList vs Linked List

  • ArrayList
    • 객체가 인덱스로 관리된다. 즉 , 데이터가 연속적으로 존재한다.
      • 이런 이유로 조회 기능에 있어서 상대적으로 Linked List 에 비해 빠르다.
      • 삽입, 삭제 등에 있어서 상대적으로 Linked List 에 비해 느리다.
        • 데이터가 추가 , 삭제 될 때 배열 처럼 데이터를 이동하기 위해서 데이터를 임시로 보관 뒤 복사 해야 하는 행위가 추가 된다.
  • Linked List
    • 데이터를 효율적으로 추가, 삭제, 변경하기 위해 사용
      • Linked List 의 경우 C에서 배우는 그 Linked List 이다. Prev에 이전 객체 주소를 저장하고 Next 에 다음 객체 주소를 저장하는 구조 이다.
        • 이런 구조 삽입 , 삭제를 할 때 내부의 Prev , next 의 참조 주소 값만 바꾸면 되어 빠르다.
        • 이런 구조로 데이터가 연속적이지 않아 조회가 느리다.
          • ArrayList 는 메모리에 연속적으로 저장되기 때문에 0번 Index 를 기준으로 index 값을 구해서 특정 인덱스로 바로 갈 수 있다.
          • Linked List 는 차례 대로 0번 부터 특정 index 까지 모든 내용을 순회 해야 한다.
          • 모든 내용을 순회 하는 경우 속도 차이는 거의 없다.

Set

  • Set은 데이터의 순서가 유지되지 않으며, 중복 저장이 불가능한 컬렉션

HashSet

  • 중복된 값을 허용하지 않으며, 저장 순서를 유지 하지 않음
  • 중복 판별은 어떻게 할까?
    • 포스팅 내용 중 Object Equals 와 HashCode 관련 내용이 있다

TreeSet

  • 이진 탐색 트리 형태로 데이터를 저장
  • 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가지는 특징

Map

  • 키(key)와 값(value)의 쌍으로 데이터를 저장하는 컬렉션
  • 데이터의 순서가 유지되지 않으며, 키는 값을 식별하기 위해 사용되므로 중복 저장이 불가능

Hashtable vs HashMap

profile
rocoli에요

0개의 댓글