Govern/Eclipse SE -상속,클래스,타입

07-26(월) 2.제네릭/컬렉션/ Iterator

Mary's log 2021. 7. 27. 08:02

※ 개인적인 개발 수업 정리글입니다. 꾸준히 정리할 예정이고 틀린 부분이 있다면 언제든지 댓글 환영입니다.


10장. 제네릭,  컬렉션 API, Map API

 제네릭 

[ 문제 발생 ]

다형성으로 Object 배열을 사용하면 자바의 모든 데이터 저장이 가능.

- 특정 데이터형만 추출할때는 instanceof 연산자를 사용하여 일치하는 데이터만 추출하도록 코드 추가

- 다형성에 의해서 다른 잘못된 데이터형이 저장되어도, 파일 시점에서는 확인할 수 없고 실행시에 확인.

 

[ 해결방안=제네릭 ]

1. 사용하는 데이터형을 체크하기 때문에, 프로그램의 안정성을 향상

2. 데이터 사용시 형변환 코드가 필요하지 않기 때문에, 코드 사용도 간편

 

========================================>

object타입 객체들을 어떤 타입으로 튈지 모르고(object타입이 아니더라도),

배열 안에, 여러종류 의 타입이 있을 수 있으니까?

↓↓↓↓↓↓↓↓↓↓

데이터 타입을 잡고 가는, 잡아서 나중에 오류가 나지 않게하는 그런 이유?

==============================================

 

 클래스의 제네릭 타입 

public   class        클래스이름< T >  {  ~  }           //  < T > = 파라미터 선언

public interface 인터페이스이름< T >  {  ~ }

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ일단 위와같이 클래스인터페이스 이름 뒤에 제네릭을 넣고ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

ex)
Bird<String> A = new Bird<String>();  //Bird클래스는 String타입.. 뭐가 String타입? 모든게?
Emp<String> B = new Emp<>();

★ ArrayList 클래스는 ArrayLIst< > list = new ArrayList< >( ) ;  ==>객체 생성 시, 제네릭 써줘야함!!!

 

 

■ 클래스 제네릭의 파라미터 타입 제한

<T extends 타입>에 설정 가능한 타입은 해당 타입과 그 자식 클래스로 한정된다.

public   class        클래스이름< T  extends 타입>  {  ~  }           //  파라미터 선언

 

 

■  메서드의 제네릭 타입       

public <타입_파라미터> void  method1 (타입_파라미터 변수명) { }

public <타입_파라미터> 타입_파라미터 method2 (타입_파라미터 변수명) {
          return 타입_파라미터;
}

ex)
public static < P > void method   ( P p ) { }
public static < P > P     method2 ( P p ) { 
       return p ;
}

method ( new Vehicle( ) ) ;
Vehicle v = method2 ( new Vehicle ( ) ) ;

 

 

■ 메서드에서 제네릭 타입 제한

 


 

프로젝트 11Day1의 클래스 GenericTest

 

 

 

 

 

프로젝트 11Day1의 클래스 GenericTest1

ㄴ아예 처음부터 String타입으로만 보내고 받을 수 있기 때문에

   따로 형변환 안해줘도 됨.

 

<최종적으로는>

 

 


 

 컬렉션 API 

-다수의 데이터를 쉽게 처리가능한 표준화된 클래스들

-객체만 저장가능

-자동으로 크기 증가

-저장된 객체를 삭제수정삽입 가능

-Set, List, Map 3가지

-Set 계열 특징: 데이터를 넣으면 순서대로 저장되지 않아서, 중복이 허용되지 않음. =>똑같은 데이터 없음

-List 계열 특징: 데이터를 넣으면 순서대로 저장되어서, 중복 허용됨. 

                     ★Set에선 못했던, 특정값 검색, 중간에 값 삽입수정 가능.

 

 

<변수와 배열과 컬렉션의 차이점>

< 컬렉션 클래스 상속 관계>

<<인터페이스 Set>> - 순서X, 중복불가

  • HashSet  클래스         : Set에 객체저장. Hash를 사용하여 처리속도가 빠름.
  • LinkedHashSet 클래스 : HashSet과 거의 같음. 차이점은 Set에 추가되는 순서를 유지.
  • TreeSet   클래스         : 객체의 Hash값에 의한 오름차순의 정렬 유지.

<<인터페이스 List>> - 순서O, 중복가능

  • List     클래스       : List의 요소는 순서를 가짐.
  • ArrayList  클래스   : List에서 객체를 얻어내는데 효율적. 동기화 제공X.
  • LinkedList  클래스 : List에서 앞뒤의 데이터를 삽입,삭제하는데 효율적. 동기화 제공X
  • Vector  클래스      : 기본적으로 ArrayList와 동등하지만, 동기화 제공O. 가장 성능이 좋지않음.

<<인터페이스 Map>>

  • HashMap  클래스       : Map에 key를 저장. hash를 사용하여 성능이 좋음. 저장순서 유지X. 오로지 하나의 null키?
  • LinkedHashMap 클래스 : HashMap과 거의 같음. 저장순서유지O.
  • HashTable  클래스      : 동기화 제공O. null key와 null value 저장불가.

 

※인터페이스는 객체생성이 불가하지만, 다형성 적용하면->자식클래스 변수의 데이터형으로는 사용가능


★★★<제네릭스>★★★ 

-컬렉션 선언 시, < > 안에 매개변수 타입을 선언해서 전달.

 

< List에 타입을 제한해서, 특정 타입만 받도록 함. >

ex) List intList = new AraayList();

     list.add( "String type" );

=================> int 타입을 저장하는 intList 변수에, String타입을 저장해도, 문제가 안생김.

ex) List<Integer> intList = new AraayList<Integer>();

     list.add( "String type" );

=================> 컴파일 시, 에러가 뜸.

 

 

< Map에 타입을 제한해서, 특정 타입만 받도록 함. >

ex) Map<Integer, Integer> map= new HashMap<Integer, Integer>();

     map.put( 10, 100 );

     System.out.println( map.get(10) );

=================> key, value 전부 int 타입만 받음

ex) Map<String, String> map= new HashMap<String, String>();

ex) Map<String, Object> map= new HashMap<String, Object>();

ex) Map<Long, String> map= new HashMap<Long, String>();

 


< Set, List에서 쓸 수 있는 기본 함수>

- <Set,List타입의> 변수.add(  Object 인자 or 객체 );  ==> 데이터 추가

  변수.add( "홍길동" );   /   변수.add( 100 );   /  변수.add( new Date() );

- <Set,List타입의> 변수.size( );                               ==> 데이터 갯수
- <Set,List타입의> 변수.isEmpty( );                         ==> boolean 타입. 비어있는지?
- <Set,List타입의> 변수.contains( Object 인자 );       ==> boolean 타입. 데이터가 포함되어있는지?
- Object [ ] 변수 = 변수.toArray( );      ==> 저장된 데이터를 Object 배열로 변환만 해줌. 출력XXX

 

<인터페이스 List와, 하위클래스에서 쓸 수 있는 함수> - 순서O,중복가능

- List 타입의 변수.add( idx, 값 ) ;    ==>데이터 추가

  ==> 이미 해당 인덱스에 데이터가 있어도, idx와 값을 적어서 추가하고, 기존 데이터는 하나씩 밀어짐.

- List 타입의 변수.get( idx ) ;         ==>데이터 추출

  ==> List는 순서가 있어서, .get( idx ) 로 원하는 값 추출가능. idx=0부터

- List 타입의 변수.set( idx, 값 ) ;    ==>데이터 수정

  ==> list.set ( 0, "사과")   // 인덱스 0에 "바나나"로 있어도, "사과"로 수정

- List 타입의 변수.remove( idx or "데이터" ) ;    ==>데이터 삭제

  ==> 인덱스나 데이터만 입력해도, 데이터 삭제 가능

- List 타입의 변수.subList( 시작idx부터 , idx까지  ) ;    ==>특정 데이터를 idx로 추출

  ==> list.subList( 0 , 2 ) ;  // 인덱스 0,1,2

 

 

<인터페이스 Collections 함수> 

Collection.sort( 변수명 ) ;      // 오름차순 정렬

Collection.reverse( 변수명 ) ;  // 내림차순 정렬

 


< 컬렉션 API에 데이터추출 하위클래스 API >

■  java.util.Enumeration  

-초창기에 나온 오래된 인터페이스.
-순서를 가지고 있는 배열의 한 종류

-'커서'로 현재의 최초 위치 0에서부터 시작
-Enumeration함수 :  add( ) 아니고 addElement( ) ????,   hasMoreElements(),    nextElements()

 

ex) Enumeration <String> enm = set.elements();  // set안에 String타입의 1,2,3,4,5,6 값 있음.
    while ( enm.hasMoreElementst() ) {
             String m = enm.nextElemts();
             sysoutpl( m ) ;

             sysoutpl( enm.nextElements() ) ; //그냥 바로 적어도 됨

 

■  java.util.Iterator      -인터페이스 set , list 어디든 사용가능

-hasNext 함수로 일관된 방식으로 추출가능

-Iterator함수 :   hasNext(),  next(),  ,remove()

 

ex) Iterator <String> ite = set.iterator();  // set안에 String타입의 1,2,3,4,5,6 값 있음.
    while ( ite.hasNext() ) {
             String m = ite.next();
             sysoutpl( m ) ;

             sysoutpl(  ite.next() ) ;  //그냥 바로 적어도 됨
==================> 개행으로 1  2  3  4  5  6

 

■  foreach 함수

■  toString 함수

 

쿰뱅이 :: 자바 Enumeration 인터페이스 정말 궁금합니다... (tistory.com)

[Java] 자바 HashMap 사용법 & 예제 총정리 (tistory.com)

 

 

< 정렬 >

- '배열'의 정렬      : Arrays.sort( 변수명 ) ; 

- 'ArrayList'의 정렬 : Collection.sort( 변수명 ) ;


 

컬렉션   1) 인터페이스 Set 

  • HashSet          : Set에 객체저장. Hash를 사용하여 처리속도가 빠름.
  • LinkedHashSet : HashSet과 거의 같음. 차이점은 Set에 추가되는 순서를 유지.
  • TreeSet           : 객체의 Hash값에 의한 오름차순의 정렬 유지.

 

프로젝트 11Day2의 클래스SetTest

첫번째

두번째

세번째

마지막 

 

 

프로젝트 11Day2의 클래스SetTest2

첫번쨰 1,2

 

 

3. 일관된 방법인 Iterator 이용 ===> StringTokenizer랑 비슷