728x90
  • 메소드(함수)를 간단한 식으로 표현하는 방법
  • 익명 객체 (반환 타입과 이름이 없음)
  • 함수는 클래스에 독립적이고 메소드는 클래스에 종속적

람다식 작성

// 기존 메소드 정의
int max(int a, int b) {
	return a > b? a : b;
}

// 람다식 적용
// 1. 메소드의 이름과 반환타입을 제거하고 {메소드블록} 전에 -> 를 추가
(int a, int b) -> {
	return a > b? a : b;
}

// 2. 반환값이 있는 경우에는 식이나 값만 적고 return문 생략 가능하며 끝에 ;도 생략
(int a, int b) -> a > b? a : b

// 3. 매개변수의 타입도 예상 가능한 경우 생략 가능 (대부분 생략 가능)
(a, b) -> a > b? a : b

작성시 주의사항

// 매개변수가 하나이고 타입이 없는 경우 경우 괄호 생략가능
(a) -> a * a // a -> a * a 처럼 괄호 생략 가능하지만
(int a) -> a * a // int a -> a * a 는 타입이 있기 때문에 생략 불가능

// 블록 안의 문장이 하나만 있는 경우 {}, ; 생략 가능
(int i) -> { System.out.println(i); }
(int i) -> System.out.println(i)

// 하나뿐인 문장이 return문이면 {}, ; 생략 불가
// 하지만 대부분의 경우 return을 생략하기 때문에 신경 쓸 필요 없음

함수형 인터페이스

단 하나의 추상 메소드만 선언된 인터페이스

함수형 인터페이스 타입의 참조변수로 람다식 참조 가능 (매개변수 개수와 반환타입 일치해야 함)

// 함수형 인터페이스 선언
@FunctionalInterface
interface MyFuntion {
	int max(int a, int b); //public abstract는 항상 기본값으로 지정
}

// 람다식의 사용
// 람다식(익명 객체)를 다루기 위해서는 함수형 인터페이스로 참조변수 타입을 지정
// 함수형 인터페이스의 추상 메소드를 구현하여 사용하기 편하게 해주는 역할
MyFuntion f = (a, b) -> a > b ? a : b;
int value = f.max(3, 5);

// 람다식을 함수형 인터페이스 타입의 매개변수로 사용할 수도 있음
void aMethod(MyFunction f) { // 아래와 같은 코드
	f.max(3, 5);
}
aMethod(((a, b) -> a > b ? a : b)); // 위와 같은 코드

// 람다식을 함수형 인터페이스 타입의 반환타입으로도 사용가능
MyFunction myMethod() { // 아래와 같은 코드
	MyFunction f = (a, b) -> {a > b ? a : b};
    return f;
}
MyFunction myMethod() { return (a, b) -> {a > b ? a : b}; } // 위와 같은 코드

java.util.function 패키지

자주 사용되는 다양한 함수형 인터페이스를 제공하는 패키지

매개변수를 3개 이상 받는 함수형 인터페이스는 제공하지 않기 때문에 직접 정의해야 함

// java.lang.Runnable
// 매개변수와 반환값이 모두 없는 경우
void run()

// Supplier<T>
// 매개변수는 없고 반환값은 있는 경우
T get()

// Consumer<T>
// 매개변수만 있고 반환값은 없는 경우
void accept(T t)

// Function<T, R>
// 일반적인 함수로 하나의 매개변수를 받아 결과를 반환
R apply(T t)

// Predicate<T>
// 조건식을 표현하는데 사용하며, 매개변수는 하나고 반환타입은 boolean
boolean test(T t)

// 매개변수가 2개인 함수형 인터페이스
// BiConsumer<T, U>
// 두개의 매개변수만 있고 반환값 없음
void accept(T t, U u)

// BiPredicate<T, U>
// 매개변수 두 개, 반환값은 boolean으로 조건식을 표현할 때 사용
booleadn test(T t, U u)

// BiFunction<T, U, R>
// 두 개의 매개변수로 하나의 결과 반환
R apply(T t, U u)

// 매개변수 타입과 반환타입이 일치하는 함수형 인터페이스
// UnaryOperator<T> 단항연산자
// Function의 자손으로 매개변수와 반환타입이 같음
T apply (T t)

// BinaryOperator<T> 이항연산자
// BiFunction의 자손으로 매개변수와 반환타입이 같음
T apply(T t, T t)

 

Predicate의 결합

and(&&), or(||), negate(!) 메소드를 사용해 두 개의 Predicate를 하나로 결합 가능

A.negate // == !A
A.and(B) // == A && B
A.or(B) // == A || B

p = A.negate
p.and(B).or(C)

// 결과를 확일할 때는
참조변수명.test(비교할요소)

// 등가비교를 하는 경우에는 isEquals 메소드 사용
Predicate<T> x = Predicate.isEquals(비교될요소).test(비교할요소)

// 조건식 두개 적용
// 조건식 x, y 두 개가 있고 x의 출력과 y의 입력이 같다면
x.andThen(y) // == x를 적용하고 y를 적용
x.compose(y) // == y.andThen(x)

컬렉셤 프레임워크와 함수형 인터페이스

Collection

removeIf() : 조건에 맞는 요소 삭제

List

replaceAll() : 모든 요소 변환하여 대체

Iterable

forEach() : 모든 요소에 작업 수행

Map

compute() : 지정된 키의 값에 작업 수행

computeIfAbsent() : 키가 없으면 작업 수행 후 추가

computeIfPresent() : 지정된 키가 있을 때 작업 수행

merge() : 모든 요소에 병합작업을 수행

forEach() : 모든 요소에 작업을 수행

replaceAll() : 모든 요소에 치환작업을 수행

메소드 참조

하나의 메소드만 호출하는 람다식을 메소드 참조로 간단히 만들 수 있음

// static 메소드 참조
(x) -> 클래스명.메소드(x) >> 클래스명::메소드명

// 인스턴스 메소드 참조
(obj, x) -> obj.method(x) >> 클래스명::메소드명

생성자의 메소드 참조

// 생성자와 메소드 참조
Supplier<MyClass> s = () -> new MyClass(); // 전
Supplier<MyClass> s = MyClass::new; // 후

Function<Integer, MyClass> s = (i) -> new MyClass(i); // 전
Function<Integer, MyClass> s = MyClass::new; // 후

// 배열과 메소드 참조
Function<Integer, int[]> f = x -> new int[x]; // 전
Function<Integer, int[]> f = int[]::new; // 후, 배열 길이도 생략가능

 

'Java > Notion' 카테고리의 다른 글

Optional<T>  (0) 2023.05.03
Stream  (1) 2023.05.03
Thread  (0) 2023.05.02
애너테이션  (0) 2023.05.02
열거형(Enum)  (0) 2023.05.01
728x90

프로세스

실행 중인 프로그램을 의미하며, 자원(메모리, CPU등)과 쓰레드로 구성

쓰레드

프로세스 내에서 실제 작업을 수행하는 역할

모든 프로세스는 최소 한 개 이상의 쓰레드를 가지고 있음

멀티 쓰레드의 장점

  • 시스템 자원의 효율적인 사용
  • 사용자에 대한 응답성 향상
  • 작업이 분리되어 코드가 간결해짐

멀티 쓰레드의 단점

  • 동기화에 주의해야 함
  • 교착상태가 발생하지 않도록 주의
  • 각 쓰레드가 효율적으로 고르게 실행되게 고려해야 함
  • 즉, 효율은 좋으나 개발을 하는데 있어서 쉽지 않음

쓰레드의 구현 및 실행

// Thread 클래스를 상속 받아 구현하는 방법
class MyThread extends Thread {
	public void run() {
    	//Thread 클래스의 run 메소드를 오버라이딩 하여 사용
    }
}

// 쓰레드 사용
MyThread mt = new MyThread(); // 쓰레드 생성
mt.start(); // 쓰레드 실행

// Runnable 인터페이스를 구현하는 방법
class MyThread implements Runnable {
	public void run() {
    	//run 메소드를 구현하여 사용
    }
}

// 쓰레드 사용
Runnable r = new MyThread();
Thread t = new Thread(r); // Thread t = new Thread(new MyThread()) 과 같음
t.start();

자바는 단일 상속만 가능하기 때문에 Thread 클래스를 상속 받아 구현하는 방법보다는

Runnable 인터페이스를 구현해서 사용하는 것이 더 효과적

start()

호출 스택을 하나 추가한 후에 스택에 run 메소드를 올리고 삭제되는 메소드로

start 메소드를 사용했다고 쓰레드가 바로 실행되는 것이 아니라

시작대기상태에 들어간 후에 운영체제의 스케줄러가 쓰레드를 동작시킴

main 쓰레드

main 메소드의 코드를 수행하는 쓰레드로 사용자 쓰레드에 속함

프로그램은 사용자 쓰레드가 하나도 없을 때 종료되므로

기존에는 메인 쓰레드만 사용하여 메인 쓰레드의 작업이 끝나면 종료됫지만

start 메소드를 통해 사용자 쓰레드를 추가로 실행하면

메인 쓰레드가 끝나도 프로그램이 종료되지 않음

싱글 쓰레드와 멀티 쓰레드의 실행속도 차이

멀티 쓰레드는 동시에 여러 작업을 수행할 수 있지만 싱글 쓰레드보다 실행속도 차이가 조금 더 걸림

멀티 쓰레드는 컨텍스트 스위칭에 걸리는 시간이 있기 때문

쓰레드의 I/O 블락킹

싱글 쓰레드에서는 입출력시 작업이 중단되기 때문에 다른 작업들이 진행되지 않지만

멀티 쓰레드는 입출력이 진행되는 한쪽 쓰레드가 멈춰 있어도 진행되기 때문에 효율적임

쓰레드의 우선순위

쓰레드는 작업의 중요도에 따라 우선순위를 다르게 지정하여 특정 쓰레드가 더 많은 작업시간을 갖게 할 수 있음

하지만, 운영체제 스케줄러에서 정하는 우선순위가 우선이기 때문에 큰 영향이 있지는 않음

// 쓰레드의 우선순위 지정 (1 ~ 10으로만 지정 가능)
// 기본 우선순위는 5로 지정되어 있음
void setPriority(int newPriority)

// 우선순위 확인
getPriority()

쓰레드 그룹

  • 서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것
  • 모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되야 함
  • 그룹을 정하지 않고 생성한 쓰레드는 기본적으로 main 쓰레드 그룹에 속함
  • 자신을 생성한 쓰레드의 그룹과 우선순위를 상속 받음
// 생성자
ThreadGroup(String name) // 새로운 쓰레드 그룹 생성
ThreadGroup(ThreadGroup parent, String name) // 부모 쓰레드 그룹에 포함되는 새로운 그룹 생성
Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)

// 쓰레드 그룹 확인
getThreadGroup()

// 쓰레드 그룹의 메소드
activeCount() // 그룹에 포함된 활성상태의 쓰레드 수 반환
activeGroupCount() // 그룹에 포함된 활성상태의 쓰레드 그룹 수 반환
chcekAccess() // 현재 실행중인 쓰레드가 쓰레드 그룹을 변경할 권한이 있는지 확인
destroy() // 비어있는 경우에만 쓰레드 그룹과 하위 그룹까지 모두 삭제
enumerate() //
getMaxPriority()
getName()
getParent()
interrupt()
isDestroyed()
list()
parentOf()
setMaxPriority()

데몬 쓰레드

  • 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 데몬 쓰레드
  • 일반 쓰레드가 종료된다면 자동적으로 데몬 쓰레드는 모두 종료됨
  • 가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용
// 데몬 쓰레드 지정
// 해당 메소드는 반드시 start 메소드를 호출하기 전에 실행해야 함
setDaemon(true)
// 데몬 쓰레드인지 확인
isDaemon()

// 무한루프와 조건문을 이용해 실행 후 대기하다 특정조건 만족시
// 작업을 수행하고 수행 후 다시 대기하도록 작성
public void run() {
	while(true) {
        try {
            Thread.sleep(3 * 1000);
        } catch(InterruptedException e) { }

        if(autoSave) {
            autoSave();
        }
    }
}

쓰레드의 상태

NEW : 쓰레드가 생성되고 아직 start 메소드가 호출되지 않은 상태

RUNNABLE : 실행 중 또는 가능한 상태

BLOCKED : 동기화블럭에 의해 일시정지된 상태 또는 LOCK이 풀릴 때까지 기다리는 상태

WAITING, TIMED_WAITING : 쓰레드가 종료 상태는 아니지만 실행가능하지 않은 상태

TERMINATED : 쓰레드의 작업이 종료된 상태

쓰레드의 실행제어

쓰레드의 실행을 제어할 수 있는 메소드를 활용해 효율적인 프로그램 작성 가능

// 지정 시간만큼 쓰레드를 일시정지 시키고 자동적으로 다시 실행대기상태 진입
// Exception 클래스의 자손이라 예외처리를 통해 사용해야 함
// static 메소드라 자기 자신만 멈추게 하는 것이 가능
try {
	sleep() 
} catch (InterruptedException e) {} // 예외가 발생하면 깨어남

// 지정된 시간동안 다른 쓰레드가 작업하는 것을 기다리게함
// 시간 미지정시 작업이 모두 끝날 때까지 기다림
// sleep과 마찬가지로 예외처리 해야 함
try {
	join() 
} catch (InterruptedException e) {}

// sleep이나 join을 깨워서 실행대기상태로 진입
interrupt() // 쓰레드의 interrupted 상태를 true로 변경
isInterrupted() //  쓰레드의 interrupted 상태를 반환
interrupted() // 쓰레드의 상태를 알려주고 false로 초기화

@deprecated
// 아래의 3개는 교착상태(dead-lock)가 생길 수 있어 사용을 권장하지 않음
// 사용해야한다면 오버라이딩해서 사용하는 것을 권장
// intrrupt, notify, wait 메소드들도 대체해서 사용하는 것이 가장 좋음
stop() // 쓰레드를 즉시 종료
suspend() // 쓰레드를 일시정지
resume() // suspend에 의해 일시정지 상태인 쓰레드를 실행대기상태로 진입

// 자신에게 주어진 실행시간을 다른 쓰레드에게 양보 후 실행대기상태 진입
// static 메소드라 자기 자신의 쓰레드에만 적용가능
// yield와 interrupt 메소드를 잘 활용하면 응답성과 효율을 높일 수 있음
yield()

쓰레드의 동기화

  • 멀티 쓰레드는 메모리를 공유하기 때문에 다른 쓰레드의 작업에 영향을 미칠 수 있기 때문에 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭하지 못하게 막는 동기화를 해줘야 함
  • 동기화를 하기 위해선 간섭받지 말아야 하는 문장들을 임계 영역으로 설정
  • 임계 영역은 락을 얻은 단 하나의 쓰레드만 출입가능(객체마다 락 1개만 가짐)
  • 임계 영역은 프로그램의 성능에 영향을 미치기 때문에 가능한 최소화 하는 것이 좋음 
// synchronized를 이용한 동기화
자바제어자 synchronized 반환타입 메소드명() { // 해당 메소드 전체를 임계 영역으로 지정
	메소드내용
}

자바제어자 synchronized 반환타입 메소드명() {
	synchronized(객체의 참조변수) { // 영역의 일부만 임계 영역을 지정
		코드작성
	}
}

wait / notify

동기화의 효율을 높이기 위해 사용하는 메소드

Object 클래스에 정의되어 있으며, 동기화 블록 내에서만 사용가능

여러 쓰레드가 공유하는 부분은 동기화해주는 것이 좋음

// 객체의 락을 풀고 쓰레드를 해당 객체의 waiting pool에 넣음
wait()

// waiting pool에서 대기중인 쓰레드 중의 하나를 랜덤으로(순서X) 깨움
notify()

// waiting pool에서 대기중인 모든 쓰레드를 깨움(일반적으로 많이 사용)
notifyAll()

Lock / Condition

나중에 찾아보기

'Java > Notion' 카테고리의 다른 글

Stream  (1) 2023.05.03
Lambda  (0) 2023.05.03
애너테이션  (0) 2023.05.02
열거형(Enum)  (0) 2023.05.01
Generics  (0) 2023.05.01
728x90

프로그래밍 언어에 영향을 미치지 않고 유용한 정보를 제공하는 기능

표준 애너테이션

// 오버라이딩을 올바르게 했는지 컴파일러가 체크하게 함
@Override

// 앞으로 사용하지 않을 것을 권장하는 필드나 메서드를 정할 때
@Deprecated

// 함수형 인터페이스가 컴파일러가 올바르게 작성했는지 체크하게 함
// 함수형 인터페이스가 하나의 추상메소드만 가져야 하는 제약을 지킨지 확인
@FunctionalInterface

// 컴파일러의 경고메시지가 나타나지 않게 억제
// 이미 확인한 경고를 다시 확인하지 않기 위해
@SuppressWarinings(억제하고자 하는 경고의 종류를 문자열로 지정)
@SuppressWarinings({경고1,경고2,경고3})

메타 애너테이션

애너테이션을 만들 때 사용하는 애너테이션

// 애너테이션을 정의할 때, 애너테이션을 어느 곳에 적용할 수 있는지 지정할 때
@Target

// 애너테이션이 언제까지 유지되는지 기간을 정할 때 사용
@Retention

// javadoc으로 작성한 문서에 포함 시킬 때
@Documented

// 애너테이션을 자손 클래스에 상속하고자 할 때
@Inherited

// 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용
@Repeatable

애너테이션 정의하기

// 애너테이션을 직접 생성할 수 있음
@interface 애너테이션명 {
	타입 요소명();
    추상 메소드 // 애니테이션의 메소드는 추상메소드임
}

// 적용할 때 값을 지정해서 사용
@interface 애너테이션명 {
	타입 요소명 = 값;
    추상 메소드
}

// 적용시 값을 지정하지 않으면 null을 제외한 기본값 지정 가능
// 요소가 하나만 존재하고 요소명이 value인 경우 요소명 생략가능
// 요소의 타입이 배열인 경우는 중괄호를 사용하고 값이 없을 때도 빈중괄호를 써야함

애너테이션의 조상

Annotation은 모든 애너테이션의 조상이지만 클래스가 아닌 인터페이스임

마커 애너테이션

요소가 하나도 정의되지 않은 애너테이션

애너테이션 요소의 규칙

  • 요소의 타입은 상수, 기본형, String, enum, 애너테이션, Class만 허용
  • 괄호 안에 매개변수 선언 불가능
  • 예외 선언 불가능
  • 요소를 <T>(타입 매개변수)로 정의할 수 없음

 

'Java > Notion' 카테고리의 다른 글

Lambda  (0) 2023.05.03
Thread  (0) 2023.05.02
열거형(Enum)  (0) 2023.05.01
Generics  (0) 2023.05.01
컬렉션 프레임워크 - Collections 클래스  (0) 2023.05.01
728x90
  • 관련된 상수들을 같이 묶어 놓은 것
  • 비교연산자는 사용 불가
  • ==, compareTo() 메소드는 사용가능
  • 상수 하나하나가 객체라 비교형을 사용할 수 없고 equals 메소드는 사용 가능
// 기본적으로 값은 0부터 순서대로 주어짐
enum 열거형명 {상수명1, 상수명2, 상수명3, ...}

// 열거형 상수를 이용하는 법
열거형명.상수명
열거형명.valueOf(상수명);
Enum.valueOf(열거형명.class, 상수명);

Enum 클래스

모든 열거형의 조상 클래스로 열거형에서 해당 클래스의 메소드들을 모두 사용할 수 있음

메소드

getDeclaringClass()

열거형의 클래스 객체를 반환

name()

열거형 상수의 이름을 문자열로 반환

ordinal()

열거형 상수가 정의된 순서를 반환 (0부터 시작)

valueOf()

지정된 열거형에서 name과 일치하는 열거형 상수를 반환

values()

열거형 상수가 가지고 있는 모든 상수를 배열로 반환

열거형에 멤버 추가

// 열거형의 생성자는 항상 private으로 지정되어 외부에서 호출 불가

// 불연속적인 열거형 상수인 경우 괄호를 사용해서 값을 넣을 수 있음
// 인스턴스 변수와 생성자를 새로 추가한 후에
enum Direction { 
	EAST(1), SOUTH(5), WEST(-1), NORTH(10);
    private final int value; // 정수를 저장할 필드 추가
    Direction(int value) { this.value = value; } // 생성자 추가
    prublic int getValue() { return value; }
}

 

'Java > Notion' 카테고리의 다른 글

Thread  (0) 2023.05.02
애너테이션  (0) 2023.05.02
Generics  (0) 2023.05.01
컬렉션 프레임워크 - Collections 클래스  (0) 2023.05.01
Map - HashMap / Hashtable  (0) 2023.05.01
728x90

컴파일시 타입을 체크해 주는 기능

객체의 타입 안정성을 높이고 형변환의 번거로움(형변환 생략가능)을 줄여줌

ArrayList<타입> list = new ArrayList<타입>();

타입 변수와 제네릭 클래스

클래스를 작성할 때 Object 타입이 아닌 제네릭 클래스(타입 변수)를 선언해서 사용

// 제네릭 클래스
MyClass<E> { // <E>,<X>,<XXX> 뭘 사용하든 상관은 없음
	//모든 타입을 지정가능
    private E 변수명;
    public boolean add(E o) {
    
    }
}

// 객체를 생성 시 실제 타입을 대입하여 사용
MyClass<Tv> myTv = new MyClass<Tv>();
//참조변수와 생성자의 타입은 항상 일치해야 함
// 실제 타입을 대입하면 기존의 E로 지정된 타입들이 다 실제타입으로 바뀜

제네릭 타입과 다형성

참조변수와 생성자의 대입된 타입은 항상 일치해야 함

제네릭 클래스 간의 다형성은 성립

매개변수의 다형성도 성립

// 참조변수와 생성자의 대입된 타입은 항상 일치해야 함
List<Tv> list = new ArrayList<Tv>();

// 제네릭 클래스 간의 다형성은 성립
List<Tv> list = new ArrayList<Tv>(); // List 타입을 모두 조상으로 가지기 때문에
List<Tv> list = new LinkedList<Tv>(); // 제네릭 타입만 일치한다면 다형성 성립

// 매개변수의 다형성도 성립
ArrayList<Product> list = new ArrayList<Product>();
list.add(new Product()); // 부모 클래스
list.add(new Tv()); // 자식 클래스
list.add(new Audio()); // 자식 클래스

Iterator<E> / HashMap<K,V>

이터레이터와 해쉬맵도 마찬가지로 타입 변수를 사용할 수 있음

// 이터레이터의 타입변수 사용
ArrayList<Student> list - new ArrayList<Student>();
Iterator<Student> it = list.iterator();
System.out.println(it.next().name); // 형변환을 할 필요가 없어짐

// 해쉬맵의 타입변수 사용
HashMap<String, Student> map = new HashMap<String, Student>();
map.put(String, new Student(Element));

제한된 제네릭 클레스

extends(상속)로 대입할 수 있는 타입을 제한

class FruitBox<T extends Fruit> { // Fruit의 자손만 타입으로 지정가능하다는 뜻
	ArrayList<T> list = new ArrayList<T>();
}

class FruitBox<T extends Fruit & Eatable> { // 인터페이스는 &로 추가
	ArrayList<T> list = new ArrayList<T>();
}

제네릭스의 제약

  • 타입 변수에 대입은 인스턴스 별로 다르게 가능
  • 정적 멤버에 타입 변수 사용 불가
  • 배열 생성할 때 타입 변수 사용불가 (T는 확정된 타입이 아니기 때문에 new 연산자 뒤에 올 수 없기 때문)
  • 타입 변수로 배열 선언 하는 경우는 가능

와일드 카드 <?>

  • 하나의 참조 변수로 대입된 타입이 다른 객체를 참조 가능
  • 메서드의 매개 변수에도 사용 가능
<? extends T> // 와일드 카드의 상한 제한. T와 그 자손들만 가능
<? super T> // 와일드 카드의 하한 제한. T와 그 조상들만 가능
<?> // 제한 없이 모든 타입이 가능 <? extends Object>와 동일

(매개변수 타입<와일드카드> 매개변수명) // 와일드카드에 해당하는 객체들을 매개변수로 받을 수 있음

제네릭 메소드

  • 제네릭 타입이 선언된 메소드로 타입 변수는 메소드 내에서만 유효함
  • 클래스의 타입 매개변수와 메소드의 타입 매개변수는 별개로 취급
  • 메소드를 호출 할 때마다 타입을 대입해야 하지만 대부분 생략이 가능함
  • 타입을 생략하지 않을 때는 클래스 이름을 반드시 적어줘야 함
static <T> void sort(List<T> list, Comparator <? super T> c) {
	// 메소드의 타입 변수는 메소드 내에서만 유효
}

제네릭 타입의 형변환

제네릭 타입과 원시 타입 간의 형변환은 가능하지만 바람직하지 않음

와일드 카드가 사용된 제네릭 타입으로는 형변환 가능

제네릭 타입의 제거

제네릭 타입은 컴파일 단계에서 컴파일러에 의해 제거되고 필요한 곳에 형변환으로 넣어짐

제네릭 타입 제거 후에 타입이 불일치하면 형변환을 추가

와일드 카드가 포함된 경우에도 적절한 타입으로 형변환을 자동으로 추가

JDK의 이전 버전들에는 제네릭 타입이 없기 때문에 이전 버전들과의 호환을 위해 제거

 

'Java > Notion' 카테고리의 다른 글

애너테이션  (0) 2023.05.02
열거형(Enum)  (0) 2023.05.01
컬렉션 프레임워크 - Collections 클래스  (0) 2023.05.01
Map - HashMap / Hashtable  (0) 2023.05.01
Set - TreeSet  (0) 2023.04.30
728x90

컬렉션을 편하게 다루기 위한 스태틱 메소드들을 제공

메소드

fill(), copy(), sort(), binarySearch()

컬렉션 채우기, 복사, 정렬, 검색

synchronizedXXX()

컬렉션의 동기화

unmodifiable()

컬렉션을 읽기전용인 변경불가 상태로 만들어줌

singletonXXX()

객체를 하나만 저장하는 싱글톤 컬렉션을 만들어줌

checkedXXX()

한 종류의 객체만 저장하는 컬렉션을 만들어줌 (지네릭스로 대체가능)

rotate()

지정 칸만큼 요소들을 이동

swap()

지정 요소들끼리 위치를 교환

shuffle()

저장된 요소의 위치를 임의로 변경

sort(reverseOrder())

역순 정렬

nCopies()

리스트를 지정 요소로 채운 결과를 반환. 변경불가

Enumerarion

Iterator와 같음

'Java > Notion' 카테고리의 다른 글

열거형(Enum)  (0) 2023.05.01
Generics  (0) 2023.05.01
Map - HashMap / Hashtable  (0) 2023.05.01
Set - TreeSet  (0) 2023.04.30
Set - HashSet  (0) 2023.04.30
728x90
  • 데이터를 키와 값의 쌍으로 저장
  • 순서를 유지하지 않음
  • 키는 중복을 허용하지 않고 값은 중복을 허용함
  • 두 클래스의 차이는 동기화 유무
  • 순서를 유지하려면 LinkedHashMap 클래스를 사용
  • Hashing 기법으로 데이터를 저장하여 많은 데이터도 빠르게 검색이 가능
  • ID/PW, 카운팅, 빈도수 체크 등에 사용

Hashing

Hash 함수를 이용하여 HashTable에 데이터를 저장하고 읽어오는 기법

같은 Key를 넣으면 항상 같은 Hash Code(배열의 인덱스)가 나오는 구조

서로 다른 키에서도 같은 값의 해시코드를 반활할 수도 있음

  1. 키로 해시함수를 호출해서 해시코드를 읽음
  2. 해시코드에 대응하는 연결리스트를 배열에서 찾음
  3. 연결리스트에서 키와 일치하는 데이터를 찾음

생성자

HashMap();
HashMap(int initialCapacity);
HashMap(int initialCapacity, float loatFacotor);
HashMap(Map m);

메소드

put(), putAll()

지정 키와 값을 저장하거나 Map전체를 저장

remove()

키에 해당하는 쌍을 제거

replace()

키에 해당하는 값을 변경

entrySet()

키와 값 쌍을 Set 타입으로 읽어옴

keySet()

키만 Set 타입으로 읽어옴

values(0

값만 컬렉션 타입으로 읽어옴

get()

키에 해당하는 값을 반환

getOrDefault(key, defaultValue)

지정한 키에 해당하는 값이 없을 경우 기본값을 반환

containsKey(), containsValue()

지정한 키나 값이 존재하는지 여부를 반환

clone()

Map을 복제

 

'Java > Notion' 카테고리의 다른 글

Generics  (0) 2023.05.01
컬렉션 프레임워크 - Collections 클래스  (0) 2023.05.01
Set - TreeSet  (0) 2023.04.30
Set - HashSet  (0) 2023.04.30
Comparator / Comparable  (0) 2023.04.30
728x90
  • 이진 탐색 트리로 구현
  • 범위 검색과 정렬에 유리한 컬렉션 클래스
  • 이진 트리는 모든 노드(요소)가 최대 2개의 하위 노드까지만 가질 수 있음
  • in-order(중위순회) 방식을 가짐

이진 탐색 트리

자식을 최대 2개까지만 갖고 부모보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장하는 트리

데이터가 많을 수록 값의 크기 비교에 필요한 횟수가 늘어나 추가 및 삭제에 시간이 많이 걸림

트리 순회

pre-order(전위순회) : 부모를 읽고 자식을 읽는 순회

post-order(후위순회) : 자식을 읽고 부모를 읽는 순회

in-order(중위순회) : 왼쪽자식-부모-오른쪽자식 노드 순으로 읽는 순회. 오름차순으로 정렬됨

level-order : 위에서부터 왼쪽에서 오른쪽으로 읽는 순회

생성자

TreeSet();
TreeSet(Collection c); // 주어진 컬렉션 저장하는 트리 생성
TreeSet(Comparator comp); // 주어진 정렬기준으로 정렬하는 트리 생성

메소드

first(), last()

정렬된 순서에서 처음이나 마지막 객체를 반환

ceiling()

올림. 지정된 객체와 같은 객체를 반환하고 없으면 큰 값을 가직 객체 중 가장 까가운 객체를 반환 (없으면 null)

floor()

버림. 지정된 객체와 같은 객체를 반환하고 없으면 작은 값을 가직 객체 중 가장 까가운 객체를 반환 (없으면 null)

higher(), lower()

지정된 객체보다 큰 값/작은 값을 가진 객체 중 제일 가까운 값의 객체를 반환하고 없으면 null 반환

subSet(시작범위, 끝범위)

범위 검색의 결과를 반환하고 끝 범위는 포함되지 않음

headSet()

지정된 객체보다 작은 값의 객체들을 반환

tailSet()

지정된 객체보다 큰 값의 객체들을 반환

주의

TreeSet은 추가하려는 객체가 정렬기준을 가지고 있던가 따로 비교 기준을 생성자에 매개변수로 줘야 함

 

'Java > Notion' 카테고리의 다른 글

컬렉션 프레임워크 - Collections 클래스  (0) 2023.05.01
Map - HashMap / Hashtable  (0) 2023.05.01
Set - HashSet  (0) 2023.04.30
Comparator / Comparable  (0) 2023.04.30
Arrays  (0) 2023.04.30

+ Recent posts