※ 개인적인 개발 수업 정리글입니다. 꾸준히 정리할 예정이고 틀린 부분이 있다면 언제든지 댓글 환영입니다.
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랑 비슷
'Govern > Eclipse SE -상속,클래스,타입' 카테고리의 다른 글
07-27(화) ArrayList / HashMap (0) | 2021.07.27 |
---|---|
07-26(월) 1.사용자예외클래스 throws/throw (0) | 2021.07.27 |
07-23(금) 2.클래스들,Array API, 예외처리조금 (1) | 2021.07.27 |
07-23(금) 1.커플링 중첩클래스 (0) | 2021.07.23 |
07-22(목) 다형성 instanceof 추상클래스 인터페이스 (0) | 2021.07.22 |