제네릭 프로그래밍
- 어떤 값이 하나의 참조형이 아닌 여러 참조 자료형을 사용 할 수 있도록 프로그래밍 하는 것
- 'T' 위치에 나중에 실제 사용할 자료형을 지정한다.
- static 변수 or static 메서드 내부 자료형으로 사용 불가
ArrayList<String> list = new ArrayList<String>();
var list = new ArrayList<String>();
- 지역 변수에 한해 자료형 추론이 가능함
GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial();
- 제네릭에서 대입된 자료형을 명시하지 않는 경우
- (Powder)을 사용해 강제로 형변환을 해야한다.
- 만약 여러자료형을 동시에 사용하려면 Object 클래스를 사용
<T extends "클래스">
- "클래스" << 추상클래스
- T자료형에 사용할 자료형을 제한
- 사용하면 T자료형이 Object형이 아닌 "클래스"형으로 변환
제네릭 매서드
- 매개변수를 여러개 사용하는 제네릭 메서드
package generics;
public class Point<T, V>{
T x;
V y;
Point(T x, V y){
this.x = x;
this.y = y;
}
public T getX(){
return x;
}
public V getY(){
return y;
}
}
- 해당 좌표는 정수일수도 실수일수도 있다.
- 제네릭 클래스가 아니어도 제네릭 메서드는 사용이 가능
package generic;
public class GenericMethod {
public static <T, V> double makeRectangle(Point<T, V> p1, Point<T, V> p2) {
double left = ((Number)p1.getX()).doubleValue();
double right = ((Number)p2.getX()).doubleValue();
double top = ((Number)p1.getY()).doubleValue();
double bottom = ((Number)p2.getY()).doubleValue();
double width = right - left;
double hight = bottom - top;
return width * hight;
}
public static void main(String[] args) {
Point<Integer, Double> p1 = new Point<>(0, 0.0);
Point<Integer, Double> p2 = new Point<>(10, 10.0);
double rect = GenericMethod.<Integer, Double>makeRectangle(p1, p2);
//<Integer, Double> 이부분 생략 가능. 컴파일러가 자료형을 유추함
System.out.println("두 점으로 만들어진 사각형의 넓이는 " + rect + "입니다.");
}
}
- 제네식 클래스안에 제네릭 메서드 선언시 ex) public class Shape<T> 안의 makeRectangle()에서 사용한 T는 전혀 다른 의미
- makeRectangle() 메서드에서 사용한 T는 메서드 내에서만 유효함
컬렉션 프레임워크 - 자료구조(data structure)
- 프로그램 실행 중 메모리에 자료를 유지 · 관리하기 위해 사용
- 개발자가 필요할 때 직접 만들어 사용 할수도 있음
Collection 인터페이스
- 하위에 List / Set 인터페이스가 있다.
- Collection 인터페이스 중 자주 사용하는 메서드
메서드 | 설명 |
boolean add(E e) | Collection에 객체를 추가합니다. |
void clear( ) | Collection의 모든 객체를 제거합니다. |
Iterator<E> iterator | Collection을 순환할 반복자(Iterator)을 반환합니다. |
boolean remove(Object obj) | Collection에 매개변수에 해당하는 인스턴스가 존재하면 제거합니다. |
int size( ) | Collection에 있는 요소의 개수를 반환합니다. |
Map 인터페이스
- 하나가 아닌 쌍으로 되어 있는 자료를 관리하는 메서드가 선언되어 있음
- key - value 쌍이라고 표현
- key 값은 중복될 수 없는 유일하게 하나 있는 것!! 따라서 equals( ) 와 HashCode( ) 메서드를 재정의하여 사용하는 것이 좋다.
- value는 key에 대응하는 값으로 중복 가능하며 다수도 가능함
- 기본으로 검색용 자료 구조 - 어떤 Key 값을 알고 있을 때 value를 찾기위한 자료 구조
- 모든 자료를 순회할 수 있는 방법이 없다.
- Map 인터페이스 중 자주 사용하는 메서드
메서드 | 설명 |
V put(K key, V value) | key에 해당하는 value 값을 map에 넣습니다. |
V get(K key) | key에 해당하는 value 값을 반환합니다. |
boolean isEmpty( ) | Map이 비어있는지 여부를 반환합니다. |
boolean containsKey(Object key) | Map에 해당 key가 있는지 여부를 반환합니다. |
boolean containsValue(OBject value) | Map에 해당 value가 있는지 여부를 반환합니다. |
Set keyset( ) | key 집합을 Set로 반환합니다.(중복이 안 되므로 Set) |
Collection values( ) | value를 Collection으로 반환합니다.(중복 무관) |
V remove(key) | key가 있는 경우 삭제합니다. |
boolean remove(Object key, Object value) | key가 있는 경우 key에 해당하는 value가 매개변수와 일치하면 삭제합니다. |
List 인터페이스
- 객체를 순서에 따라 저장하고 유지하는데 필요한 메서드가 선언되어 있음
ArrayList
- 디폴트 생성자를 호출하여 배열의 크기를 지정하지 않으면 기본으로 크기 10개 짜리가 만들어진다.
- 10개 초과시 큰 용량의 배열을 새로 만들고 기존 항목을 복사한다.
동기화
- 두개 이상의 스레드가 동시에 Vector를 사용할 때 오류가 나지 않도록 실행순서를 보장하는 것
스레드
- 작업의 단위
ArrayList 와 Vector 클래스 차이
- 가장 큰 차이는 동기화 지원 여부
- 두 작업을 동시에 진행하는 멀티스레드 환경이 아닌 경우엔 ArrayList 사용을 권장 - 수행속도가 Vector보다 빠름
Vector 클래스
- 모든 메서드가 호출될 때마다 잠금과 해제과정이 일어남
- ArrayList로 구현했는데 나중에 동기화가 필요하다면 Vector로 바꾸지 않고 다음과 같이 ArrayList생성코드 작성
Collection.synchronizedList(new ArrayList<String>());
LinkedList 클래스
- 링크드 리스트의 각 요소는 다음 요소를 가리키는 주소값을 갖음
- 요소 추가시 가리키고 있는 주소값만 변경해주면 됨
- 요소 제거시 가리키고 있는 주소값만 변경해주면 됨. 이 때, 제거된 요소의 메모리는 나중에 가비지 컬렉터(G.C)가 수거함
배열
- 위치를 찾을 때는 LinkedList보다 우월함
자료의 변동(추가, 삭제)이 많으면 LinkedList가 효율적
자료의 변동(추가, 삭제)이 거의 없는 경우면 배열사용이 효율적
스택(Stack)
- 상자를 쌓듯이 자료를 관리
- 맨 나중에 올린 상자를 먼저 꺼내야함
- Last In First Out : LIFO 방식
큐(Queue)
- 선착순과 비슷
- 맨 앞에서 부터 꺼내어 사용하는 방식
- First In First Out : FIFO 방식
Iterator
- Collection 요소를 순회
- key를 순회할 때 사용
- 순서가 없어 get(i) 메서드를 사용할 수 없을 때 사용
Iterator ir = memberArrayList.iterator();
- Iterator를 사용하여 요소를 순회할 때 사용하는 메서드
메서드 | 설명 |
boolean hasNext( ) | 이후에 요소가 더 있는지를 체크하는 메서드이며, 요소가 없다면 true 값을 반환 |
E next( ) | 다음에 있는 요소를 반환 |
Iterator<Member> ir = arrayList.iterator(); // Iterator 반환
while(ir.hasNext()) { // 요소가 있는동안
Member member = ir.next(); // 다음 회원을 반환
int tempId = member.getMemberId();
if(tempId == memberId) { // 회원 ID가 일치하면
arrayList.remove(member); // 해당 회원 삭제
return true;
}
}
System.out.println(memberId + "가 존재하지 않습니다.");
return false;
Set 인터페이스
- 순서와 상관없이 중복을 허용하지 않는경우 사용
HashSet 클래스
- 집합자료구조를 구현하며 중복을 허용하지 않음
- 중복된 값 출력하지 않음
- ArrayList는 순서가 있는 구조라 추한 순서대로 출력되지만, HashSet은 추가된 순서와 무관하게 랜덤으로 출력
package collection.HashSet;
import java.util.HashSet;
public class HashSetTest {
public static void main(String[] args) {
HashSet<String> hashSet = new HashSet<>();
hashSet.add("임정순");
hashSet.add("박현정");
hashSet.add("홍연의");
hashSet.add("강감찬");
hashSet.add("강감찬");
System.out.println(hashSet);
}
}
[형연의, 박현정, 강감찬, 임정순]
TreeSet 클래스
- Tree로 시작하는 클래스는 데이터를 추가하면 결과값이 정렬됨
- TreeSet은 중복을 허용하지 않고, 출력 결과값도 정렬된다.
노드
- 트리 자료 구조에서 각 자료가 들어가는 공간
이진 검색 트리
- 비교 범위가 1/2 만큼씩 줄어 효과적으로 검색 할 수 있다.
23, 10, 48, 15, 7, 22, 56
- 가장 왼쪽 노드인 7부터 순회하면 결과는 다음과 같다.
7 - 10 - 15 - 22 - 23 - 48 - 56
- 맨 왼쪽 노드부터 시작해서 왼쪽 - 부모 - 오른쪽 순으로 순회하면 오름차순
- 맨 오른쪽 노드부터 시작해서 오른쪽 - 부모 - 왼쪽 순으로 순회하면 내림차순
Comparable 인터페이스
- 자기 자신과 전달받은 매개변수를 비교
- compareTo( ) 추상메서드가 포함 되어 있다. - compareTo( ) 구현해주어야함.
- 내림차순으로 정렬하려면 * (-1)을 추가하면 된다.
@Override
public int compareTo(Member member){
return (this.memberId - Member.memberId) * (-1);
}
//compareTo() 메서드 재정의
//추가한 회원 아이디와 매개변수로 받은 회원 아이디를 비교함
콜백(callback) 메서드
- 프로그래머가 작성하지만 시스템이나 자바 컬렉션 프레임워크가 호출하는 메서드
Comparator 인터페이스
- 두 매개변수를 비교
- compare( ) 메서드 재정의 해야함
- 내림차순으로 정렬하려면 * (-1)을 추가하면 된다.
해시 테이블
- 해시 방식의 자료를 저장하는 공간
- 자바는 해시테이블의 75%까지만 사용하고 컴파일러가 자동으로 메모리를 확장한다.
해시 함수
- key값이 정해지면 그에 대응하는 해시 테이블의 저장위치가 정해지는데 이런 위치를 계산하는 함수
HashMap 클래스
- Map인터페이스 중 가장 많이 사용
- 멀티 스레드 환경이 아니라면 HashTable 보다 유리
TreeMap 클래스
- TreeSet과 마찬가지로 이진 검색 트리로 구현
- key 값으로 정렬하므로 key 값에 해당하는 클래스에 comparable 또는 comparator 인터페이스 구현이 필수
728x90
반응형
'Language > Java' 카테고리의 다른 글
'Do it 자바프로그래밍 입문' 14장 정리 (0) | 2022.10.06 |
---|---|
'Do it 자바프로그래밍 입문' 13장 정리 (0) | 2022.10.05 |
'Do it 자바프로그래밍 입문' 11장 정리 (0) | 2022.09.27 |
'Do it 자바프로그래밍 입문' 10장 정리 (0) | 2022.09.23 |
'Do it 자바프로그래밍 입문' 9장 정리 (0) | 2022.09.21 |
댓글