Language/Java

'Do it 자바프로그래밍 입문' 12장 정리

ABCD 2022. 9. 30.

제네릭 프로그래밍

  • 어떤 값이 하나의 참조형이 아닌 여러 참조 자료형을 사용 할 수 있도록 프로그래밍 하는 것

  • '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
반응형

댓글

💲 추천 글