Java 교육 Step3(래퍼 클래스, 제너릭, 컬렉션 프레임워크)
1. 래퍼(Wrapper) 클래스
- 기본데이터를 감싸고 있는 클래스 (기본데이터 타입을 만들어주는 클래스를 만들자, 포장)
참고) Object는 최상의 클래스(기본타입은 받을수 없다)
public void m(Object obj) -> 다 받아준다 근데 m(10) m(10.5) ... 사용하려면 overloding을 해야된다?
기본타입 : 프리미티브 타입, 래퍼 타입 ( 서로 호환은 안됨)
목적: 기본데이터 타입을 래퍼타입으로 바꾸는것 즉 감싸서 (기본 toString이 래퍼클래스에 있다)
가지비? 수정불가 불변(Immutable) 그러니 new 한다(Boxing UnBoxing이유) p107
내용은 동일하지만 Wrapper당
T rv = 10 ; 올른쪽에 기본데이터가 자동으로 Wrapper가 되는경우는 래퍼타입일때만 함
1. 래퍼클래스 등장이유
외계인(기본타입) 을 지구인(클래스 타입)으로 만들어주는 클래스
2. 래퍼클래스의 기본 개념
2.1 래퍼클래스의 종류
래퍼 클래스 : 메서드를 가지고 있다
2.2 Boxing & UnBoxing
Boxing : 래퍼클래스로 기본타입을 감싸 인스턴스 생성
UnBoxing : 반대과정
예시)
Integer i = new Integer(10)
java5부터 Integer i = 10 가능하나 인스턴스 생성이 이루어진다.
i += 10
※ 래퍼로 생성된 인스턴스는 문자열 인스턴스처럼 한번 생성하면 불변(Immutable) 이다
래퍼런스 타입과 기본타입은 절대 호환안됨(연산안됨)
2.3 AutoBoxing & AutoUnBoxing
Integer i = 10;
i += 10;
2. 제너릭(Generic)
java5
1. 제너릭 기본
데이터 타입의 일반화
기타내용) 대문자 아무거나
overridng 을 피하기 위해 만들었당~~
2. 제너릭 클래스
참고)에러는 컴파일타임, Exception runtime에 발생
컴파일 타임에 에러 발생하고자 함(타입체크 선행)
2.1 Object 클래스를 이용하여 하나의 클래스로 처리하는 방법
Object 하나로 파라메터 처리하기 위해
ex) gs2.boxing("식품") -> 실행이 된다 : 에러가 발생하지 않는다(컴파일 타입)
2.2 각 배송물건에 대해 개별 배송 클래스로 처리하는 방법
배송클래스를 두개 Class로 만들때
-> runtime에서 에러 발생
2.3 제너릭 클래스
- Object가 적용된 자리(데이터 타입)를 T로 치환한다
- T로 치환된 자리의 타입은 인스턴스 생성시 결정된다.
- T자리에 클래스 타입만 들어올수 있다
※ 하나의 클래스로 만들수 있고 에러처리가능(데이터의 안전성 보장하기 위해)
예시)
Class T goods<T>{
T goods;
public void boxing(T goods){
this.goods = goods;
생성
GoodShip<Electonic> gs1 = enw GoodShip<Electonic>();
※ GoodShip이 다양한 클래스 대응(코드 간결), 데이터 타입에 안정성(컴파일 타임 에러)
3. 제너릭 메서드
파라메터가 다를 때 적용할수 있다 - > 캡슐화도 기능
- 메서드 오버로딩을 대체할수 있다
- 같은 기능을 수행하나 전달되는 파라미터가 다를 때 적용할 수 있다.
선언방법) public static <T> void seeSmartTV(T param)
정식) shower.<AAA>gMethod(aaa)
shower.gMethod(aaa) ==> 캡슐화에 기능이 있다
4. 제네릭 고급
일부 제한 기능
참고)
-묵시적 형변환원칙
10 + 10.2 큰것에 반영된다. = 이라는것은 동일형이여야 된다.
-명시적 형변환
에러가 뜨는자리인데 에러 없게 하기 위해 -> 개발자의 손실을 감당한다.
타입을 줄이겠다(좁히겠당)
데이터가 짤리거나 .. 좁히기 위해
4.1 제네릭 메서드에서 파라메터의 데이터 타입의 제한
모든클래스가 아니라 내가 원하는 클래스 타입으로 제한 하는것
extends를 사용
주절이) 블루레이 영상+ 음성 분리
public static<T> void seeSmartTV(T param){
((Computer)param).runProgram();
public static<T extends Computer> void seeSmartTV(T param){
param.runProgram();
4.2 제네릭 메서드에서 파라미터로 배열전달
public static <T> void printArr(T[] arr) -> 모든테이터 타입의 배열을 찍는다
for(int i = 0; i<arr.length;i++){
}
잠깐)
int [] arr =new int[5]; -> java는 배열을 instance로 본다
명시적 선언 -> 인스턴스로 만들때 주소값을 만들고 -> 이항연산자는 같아야 Class로 받야야되는데(주소를 받을?)
int [] => data type으로 봐야되고 래퍼런스 타입이고 array 타입이다.
arr는 래퍼변수이고 즉 주소를 가지고 있다.
모든프로그램에서 배열의 이름은 주소값이다.
파라메터는 복제되어 전달인데? arr은 서울시 주민번호라 하면 아됨 주소를 전달한다
잠깐) 왜 배열을 쓸까?
1. 반복문의 사용조건 : 코드는 변하지 않고 값만 바뀐다. <- 변수가 많음(안됨) a~z
2. 반복문을 못쓰면 길어짐
반복문에 For문의 약점
1) 반복대상의 갯수를 모르면 안된다. ~~~> length의 태생
2) 순서가 없는데이터인경우 에러 된다.
Collection은 저장소이다 왜 Java는 배열이 있는데 만들었을까? 어떤저장소를 선택해야되는지?
4.3 제네릭과 와일드 카드
제너릭 클래스에서 T를 제한하고 싶을때 즉 Car클래스를 상속받은것만으로 제한할때
1) AAA<? extends X> aaa
X라는 클래스를 포함하여 X의 하위의 클래스는 모두 올수 있다
2) AAA<? super X> aaa
X라는 클래스를 포함하여 X의 상위의 클래스는 모두 올수 있다
예시)
public static void drivingCar(Cargo<? extends Car> cg) ==> 여시서 dirvingCar는 일반메서드
Cargo의 타입은 Car를 포함하여 하위 클래스는 모두 올수 있다
3. 컬렉션 프레임 워크(Collection Framework)
저장소이다
Warapper 제너릭을 알아야 알수 있다.
클래스의 공부팁
최상클래스(super)의 메서드를 알면 상속받고 overrindg되고 (공통되는 기능이 들어감)
최상의 클래스가 interface이면 -> 생성할일이 없다(왜 인스턴스를 생성하지 못함)
목적 : 공부하는 방법 주요콜랙션을 알자 --> 무수히 많다(성능을 잘못잡았을때 성능이 안나옴)
성능이안나오는 주범1
주절이1)
D.S : 자료구조 (수학 F 증명하는 수학 목표1-time sort 의 증명 2-메모리를 적게)-> class를 많이 만듬
< 알고리즘이 상위과정
자료구조에서 성능이 좋은 알고리즘이 Collection에 있다
sort : 1) 0번째 방에서 ~~~ 작은수 select소트
2) 앞뒤로 바꾸고 맨뒤에서 정렬 버블소트 : 시간복잡도+공간복잡도 크다
quick sort 를 쓰면 빠르다 node
주절이2)
배열의 장점 : 검색속도가 좋다(이름과 index를 알면 한번에 찾는다)
단점 : 1) size조정이 안된다. 2) 메모리 낭비가 심하다 3) 타입을 하나만 쓸수있다.
배열은 첫 마지막을 point를 가지고 address를 쓰는데 빈공간이 있으면 안된다 방의갯수가 크면
오버로드 발생,
첫번째 공간이 사라질때 shift, 추가될때 shift 가 발생
==> 배열은 삽입할때 안좋다
==> java는 Class로 , C는 구조체를 사용한다.
※ 보통 사이즈를 잡을때 넉넉히 ~~~ max로
컬렉션에는 인스턴스 만 저장된다
=> 클래스로 생성된 인스턴스만 저장 한다 (기본데이터는 ? 래퍼) 생성된 구조 인스턴스 값을 받음
1. 컬랙션 프레임워크의 개요
1.1 개요
컬랙션은 저장소이다 프레임워크로 불린다는것은 개발자가 구현해야될 코드를 미리 구현됨
- 컬랙션에는 "인스턴스" 만 저장된다.
=> 클래스로 생성된 인스턴스만 저장 한다 (기본데이터는 ? 래퍼) 생성된 구조 인스턴스 값을 받음
1.2 구조
클래스의 최상클래스(super)의 메서드를 알면 상속받고 overrindg되고 (공통되는 기능이 들어감)
override이면 method name parameter, return type이 안바뀌고 동일함 , map만 다름
1.3 List 를 구현한 클래스
List를 구현한 컬렉션 클래스의 공통 성격
- 데이터의 저장순서를 유지
- 중복데이터의 저장을 허용
- > Framework라 부르는게 삽입삭제를 알아서 한다(인스턴스에 따라 저장소가 달라진다 즉 소스코드는 동일하다)
1.3.1 ArrayList
1차원의 배열
장점 : 검색속도가 빠름 (인텍스로 데이터를 찾기때문에)
단점 : 데이터 삽입, 삭제 연산시 부하가 많음
1.3.2 LinkedList
하나의 주소에 데이터가 있는구조
장점 : 데이터 삽입 삭제가 용이함
단점 : 데이터 검색속도의 일관된 보장이 어려움
시작:다음주소 주소:다음주소 주소:다음주소... 끝 ==> 즉 중간삽입이 용이
실시간 검색어(배열) 1등이 먼저나오는 알고리즘 없다 -> 다뒤져봐야지 일관성
인스턴스 응답속도를 동일하게 만들어준다?
검색관련 : B, B+ B* tree 크롤링
node
1.4 Collection을 사용하는 이유는 무엇인가?
검색 -> 배열의 자료구조 변경시
※ 저장소가 바뀌면 코드가 달라지는데 Collection을 사용하면 동일하다
Colleciton을 만든이유 class만 바꾸면 된다
상속만 잘 설계하면 된다
1.5 Set을 구현한 클래스(집합이다)
- 데이터의 저장 순서를 유지하지 않는다(집합의 특징)
- 중복데이터의 저장을 허용하지 않는다(원소나열법-집합의 특징)
근데 일부에서는 ? HashSetCheck1 참고
Hash :검색 찾는데이터가 알고리즘이 없으면 순차
10,15,2,6,11,4 ==> %3 균등하게 나눈다 Hash 알고리즘임
- 단 중복의 기준은 개발자가 정할수 있다
hSet.add(new Data(15)) <-> hSet.add(15)
1.5.1 Set에서 반복처리
SDS LG SK LG -> 3개
new로 생성시 4개
Iterator (반복자) - > for문에는 사용못함(set이 순서가 없어서)
list는 쓸수 있다 왜 줄서있어서..
1.5.2 HashSet
※ hasCode, toString을 override를 통하여 중복 제거
hasCode에 검색 알고리즘이 들어감 Has알고리즘 --> overriding 해야됨
equal() 메서드는 '==' 연산자를 통해 같음을 오버라이딩 한다.
1.5.3 TreeSet
Tree가 별거 다쓴다 Java에서는 무조건 정렬 Class이다
- Tree를 기반으로 자료를 저장하고 데이터를 정렬한다.
- 정렬의 기준은 개발자가 한다 (정렬은 Iterator가 결정한다 itr=sTree.descendingIterator(), 래퍼클래스는 별도 코딩으로
해야지~~~compareTo를 쓰고 꼭 Comparable를 구현 Mak Interface)
- TreeSet<E>에 데이터 저장시 반드시 Comparable<T> 인터페이스의 구현이 필요
compareTo 메서드의 오버라이딩이 필요 ==>VO Class 일때
- 혹은 Compare<T> 인터페이스 구현시
compare메서드의 오버라이딩이 필요 ==>VO Class 일때
- 이따 메서드의 전달된 파라메터기준으로
1) 파라메터가 작으면 +(정수) 리턴
2) 같으면 0 리턴
3) 파라메터가 크면 -(정수) 리턴
※ add메서드 : compareTo hasCode가 자동으로 되는게 있네
1.6 Map을 구현한 클래스
- 데이터를 저장할때 사용하는 메서드가 add()에서 put()으로 바뀜
- Map<K,V>에 데이터를 저장할때 key,value 구조 저장(열쇠를 꽂아야 나옴 get에 index가 아니라 key임)
- key는 중복이 있으면 안됨
NevigableSet<Integer> navi = tMap.navigableKeySet();
Iterator itr = navi.iterator();
or
Iterator<integer> itr = tMap.keySet().iterator();
※ 정렬은 iterator() descendingIterator()
Collection은 API가 많다 ~~~
많이 쓰는것~ Map, Collection 저장소 안에 저장소를 넣는다 Colleciton은 인스턴스만 저장 인스턴스는 클래스로 만들어짐
cp, sc, tv 등등을 저장하는 Map 즉 Map만 가져오면 다 가져온다.
spring put? 제일 밖에 Map이 있다
디자인 패턴 3가지
※ 앞으로 collection에서는 for 를 안쓰고 Iterator를 쓴다 --> 다 사용할수 있으니 패턴이라 한다.