BackEnd🧡

2023.05.06 TIL - μ—λ„ˆν…Œμ΄μ…˜ / λžŒλ‹€

hae02y 2023. 5. 6. 22:14
λ°˜μ‘ν˜•

 

πŸ‘€Today...


 

μ–΄μ œλŠ” μ–΄λ¦°μ΄λ‚ μ΄μ—¬μ„œ 곡뢀λ₯Ό 잠깐 μ‰¬μ—ˆμ§€λ§Œ μ˜€λŠ˜λΆ€ν„° λ‹€μ‹œ 또 λ‹¬λ €λ³΄μž!

 

β˜•μ˜€λŠ˜μ˜ TIL(Today I Learn)


μ• λ„ˆν…Œμ΄μ…˜(annotation)

μ• λ„ˆν…Œμ΄μ…˜μ€ μ†ŒμŠ€μ½”λ“œκ°€ μ»΄νŒŒμΌλ˜κ±°λ‚˜ μ‹€ν–‰λ λ•Œ 컴파일러 및 λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—κ²Œ ν•„μš”ν•œ 정보λ₯Ό 전달해 μ£ΌλŠ” λ¬Έλ²•μš”μ†Œμ΄λ‹€. 주석은 κ°œλ°œμžμ—κ²Œ 정보λ₯Ό μ „λ‹¬ν•œλ‹€λ©΄ μ• λ„ˆν…Œμ΄μ…˜μ€ μ»΄νŒŒμΌλŸ¬μ—κ²Œ 정보λ₯Ό μ „λ‹¬ν•œλ‹€κ³  μƒκ°ν•˜λ©΄ 될것같닀.

 

# @Override

class SuperClass {
    public void example() {
        System.out.println("example() of SuperClass");
    }
}

class SubClass extends SuperClass {

    @Override
    public void example() {
        System.out.println("example() of SubClass");
    }
}

λ©”μ„œλ“œ μ•žμ—λ§Œ λΆ™μΌμˆ˜μžˆλŠ” μ—λ„ˆν…Œμ΄μ…˜μœΌλ‘œ, μ„ μ–Έν•œ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”© ν•˜κ±°λ‚˜, 좔상 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” λ©”μ„œλ“œλΌλŠ” 것을 μ»΄νŒŒμΌλŸ¬μ—κ²Œ μ•Œλ €μ£ΌλŠ” μ—­ν• μ„ν•œλ‹€. μƒμœ„ν΄λž˜μŠ€μ—μ„œ @Overrideκ°€ λΆ™μ–΄μžˆλŠ” λ©”μ„œλ“œλͺ…κ³Ό 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μ°Ύμ„μˆ˜ μ—†λ‹€λ©΄, μ»΄νŒŒμΌλŸ¬κ°€ 컴파일 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

 

# @Deprecated

class OldClass {
	@Deprecated
	private int oldField;

	@Deprecated
	int getOldField() { return oldField; }
}

기쑴에 μ‚¬μš©ν•˜λ˜ 기술이 λ‹€λ₯Έ 기술둜 λŒ€μ²΄λ˜μ–΄ κΈ°μ‘΄ κΈ°μˆ μ— μ μš©ν•œ μ½”λ“œλ₯Ό 더이상 μ‚¬μš©ν•˜μ§€ μ•Šλ„λ‘ μœ λ„ν•˜λŠ” κ²½μš°μ— μ‚¬μš©ν•œλ‹€. ν˜Έν™˜μ„± 문제 λ“±μœΌλ‘œ μ‚­μ œν•˜κΈ° κ³€λž€ν•΄ 남겨두어야 ν•˜μ§€λ§Œ 더이상 μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•˜μ§€ μ•Šμ„λ•Œ μ‚¬μš©ν•œλ‹€.

 

# @SuppressWarnings

λ‹€μŒκ³Ό 같이 κ²½κ³ μœ ν˜•μ— λ”°λΌμ„œ κ²½κ³  메세지λ₯Ό μ„ νƒμ μœΌλ‘œ μ–΅μ œν• μˆ˜μžˆλ‹€.

 

# @FuntionalInterface

@FunctionalInterface
public interface ExampleInterface {
	public abstract void example(); // 단 ν•˜λ‚˜μ˜ 좔상 λ©”μ„œλ“œ
}

ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν• λ•Œ, μ»΄νŒŒμΌλŸ¬κ°€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€ 선언이 λ°”λ₯΄κ²Œ μ„ μ–Έ λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜λ„λ‘ ν•œλ‹€. λ°”λ₯΄κ²Œ μ„ μ–Έλ˜μ§€ μ•Šμ€ 경우 μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€. (ν•¨μˆ˜ν˜•μΈν„°νŽ˜μ΄μŠ€λŠ” λ‹¨ν•˜λ‚˜μ˜ μΆ”μƒλ©”μ„œλ“œλ₯Ό 가진닀.)

 

 

# μ‚¬μš©μž μ •μ˜ μ• λ„ˆν…Œμ΄μ…˜

@interface μ• λ„ˆν…Œμ΄μ…˜λͺ… { // μΈν„°νŽ˜μ΄μŠ€ μ•žμ— @기호만 뢙이면 μ• λ„ˆν…Œμ΄μ…˜μ„ μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 
	νƒ€μž… μš”μ†Œλͺ…(); // μ• λ„ˆν…Œμ΄μ…˜ μš”μ†Œλ₯Ό μ„ μ–Έ
}

μ• λ„ˆν…Œμ΄μ…˜μ€ java.lang.annotation을 상속받기 λ•Œλ¬Έμ— λ‹€λ₯Έ ν΄λž˜μŠ€λ‚˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ†λ°›μ„μˆ˜ μ—†λ‹€.

 

 

λžŒλ‹€μ‹(Lambda Expression)

λžŒλ‹€μ‹μ€ ν•¨μˆ˜λ₯Ό 쒀더 κ°„λ‹¨ν•˜κ³  νŽΈλ¦¬ν•˜κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ κ³ μ•ˆλœ λ¬Έλ²•μš”μ†Œμ΄λ‹€. 이름이 μ—†κΈ° 떄문에 읡λͺ…객체라고 ν• μˆ˜μžˆκ³  μ΄λŸ¬ν•œ 읡λͺ…κ°μ²΄λŠ” 읡λͺ…ν΄λž˜μŠ€λ₯Ό ν†΅ν•΄μ„œ λ§Œλ“€μ–΄μ§„λ‹€. 읡λͺ…ν΄λž˜μŠ€λŠ” 객체의 μ„ μ–Έκ³Ό 생성을 λ™μ‹œμ— ν•˜μ—¬ μ˜€μ§ν•˜λ‚˜μ˜ 객체λ₯Ό μƒμ„±ν•˜κ³  λ‹¨ν•œλ²ˆλ§Œ μ‚¬μš©λ˜λŠ” 일회용 ν΄λž˜μŠ€μ΄λ‹€.

// sum λ©”μ„œλ“œ λžŒλ‹€μ‹
(num1, num2) -> num1 + num2

// λžŒλ‹€μ‹μ„ 객체둜 ν‘œν˜„
new Object() {
	int sum(int num1, int num2) {
		return num1 + num1;
	}
}

// 선언은 κ°€λŠ₯ν• μˆ˜μžˆμ§€λ§Œ Object 내뢀에 sum 이없닀. 즉 μœ„μ˜ μ„ μ–Έλœ sum은 1회만 μ‚¬μš©λ˜κ³  버렀진닀.
// κ·ΈλŸ¬λ―€λ‘œ μ €μƒνƒœμ—μ„œ Objectν΄λž˜μŠ€μ—λŠ” sumλ©”μ„œλ“œκ°€ μ—†μ–΄μ„œ Objectνƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜μ— λ‹΄λŠ”λ‹€κ³  해도
// sumλ©”μ„œλ“œλ₯Ό μ‚¬μš©ν• μˆ˜κ°€ μ—†λ‹€.

이것을 ν•΄κ²°ν•˜κΈ° μœ„ν•œκ²Œ λ°”λ‘œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€(Funtional Interface)이닀. μžλ°”μ˜ μΈν„°νŽ˜μ΄μŠ€ 문법을 ν™œμš©ν•΄μ„œ λžŒλ‹€μ‹μ„ λ‹€λ£¨λŠ” λ°©λ²•μœΌλ‘œ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ—λŠ” λ‹¨ν•˜λ‚˜μ˜ μΆ”μƒλ©”μ„œλ“œλ§Œ μ„ μ–Έλ˜κ³ , μ΄λŠ” λžŒλ‹€μ‹κ³Ό μΈν„°νŽ˜μ΄μŠ€κ°€ 1:1둜 맀칭 λ˜λŠ” 것이닀. 

 

@FunctionalInterface
public interface MyFunctionalInterface {
    void accept(int x);
}
//μš”λŸ° μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆλ‹€λ©΄,,,
public class MyFunctionalInterfaceExample {

    public static void main(String[] args) throws Exception {

        MyFunctionalInterface example;
        example = (x) -> {
            int result = x * 5;
            System.out.println(result);
        };
        example.accept(2);

        example = (x) -> System.out.println(x * 5);
        example.accept(2);
    }
}

// 좜λ ₯κ°’
10
10

[ν•¨μˆ˜ν˜•μΈν„°νŽ˜μ΄μŠ€] - https://codechacha.com/ko/java8-functional-interface/

 

# λ©”μ„œλ“œ μ°Έμ‘°

λ©”μ„œλ“œ μ°Έμ‘°λŠ” λžŒλ‹€μ‹μ—μ„œ λΆˆν•„μš”ν•œ 맀개 λ³€μˆ˜λ₯Ό μ œκ±°ν• λ•Œ μ‚¬μš©ν•œλ‹€.

//λ§€κ°œλ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜λŠ” λžŒλ‹€μ‹
(left, right) -> Math.max(left, right)  //μš”λ ‡κ²Œ μž…λ ₯κ°’κ³Ό 좜λ ₯값을 κ·ΈλŒ€λ‘œ λŒ€μž…ν•˜λŠ”κ²½μš°μ— μ‚¬μš©

// ν΄λž˜μŠ€μ΄λ¦„::λ©”μ„œλ“œμ΄λ¦„
Math :: max // λ©”μ„œλ“œ μ°Έμ‘°	//μΈν„°νŽ˜μ΄μŠ€μ˜ μΆ”μƒλ©”μ„œλ“œκ°€ μ–΄λ–€ λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§€λŠ”μ§€,
                             //λ¦¬ν„΄νƒ€μž…μ€ 무엇인지에 λ”°λΌμ„œ 달라짐

 

# μ •μ λ©”μ„œλ“œ / μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œ μ°Έμ‘°

 

//정적 λ©”μ„œλ“œλ₯Ό μ°Έμ‘°ν•  λ•ŒλŠ” 클래슀 이름 뒀에 :: 기호λ₯Ό 뢙이고 정적 λ©”μ„œλ“œ 이름을 기술
클래슀 :: λ©”μ„œλ“œ

//μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ˜ κ²½μš°μ—λŠ” λ¨Όμ € 객체λ₯Ό μƒμ„±ν•œ λ‹€μŒ 
//μ°Έμ‘° λ³€μˆ˜ 뒀에 ::기호λ₯Ό 뢙이고 μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 이름을 기술
μ°Έμ‘° λ³€μˆ˜ :: λ©”μ„œλ“œ

 

# μƒμ„±μž μ°Έμ‘°

μƒμ„±μžλ₯Ό μ°Έμ‘°ν•œλ‹€λŠ”κ²ƒμ€ 객체생성을 μ˜λ―Έν•œλ‹€. 즉 λ‹¨μˆœνžˆ 객체λ₯Ό μƒμ„±ν•˜κ³  λ¦¬ν„΄ν•˜λ„λ‘ κ΅¬μ„±λœ λžŒλ‹€μ‹μ€ μƒμ„±μž 참쑰둜 λŒ€μΉ˜κ°€ κ°€λŠ₯ν•˜λ‹€.

(a,b) -> new 클래슀(a,b)

//μƒμ„±μž μ°Έμ‘° 문법
클래슀 :: new

 

 

읡λͺ… 객체

[읡λͺ…객체 ref] - https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B5%EB%AA%85-%ED%81%B4%EB%9E%98%EC%8A%A4Anonymous-Class-%EC%82%AC%EC%9A%A9%EB%B2%95-%EB%A7%88%EC%8A%A4%ED%84%B0%ED%95%98%EA%B8%B0

 

 


πŸ‘Šν˜Όμžμ„œ ν•΄κ²°ν•˜κΈ°


 

μƒμ„±μž 참쑰에 λŒ€ν•œμ΄ν•΄

import java.util.function.BiFunction;
import java.util.function.Function;

 class ConstructorRef {
    public static void main(String[] args) throws Exception {
        Function<String, Member> function1 = a -> new Member(a); //μš”κ±°λŠ” Member::new 둜 λ³€ν™˜κ°€λŠ₯
        Member member1 = function1.apply("kimcoding");	//μš”κΈ°μ„œ λ“€μ–΄κ°€λŠ” κ°œμˆ˜μ— 따라 정해진닀.

        BiFunction<String, String, Member> function2 = Member::new; //μš”κ±°λŠ” (a,b) -> new Member(a,b) 인거닀
        Member member2 = function2.apply("kimcoding", "κΉ€μ½”λ”©");
    }
}

class Member {
    private String name;
    private String id;

    public Member() {
        System.out.println("Member() μ‹€ν–‰");
    }

    public Member(String id) {
        System.out.println("Member(String id) μ‹€ν–‰");
        this.id = id;
    }

    public Member(String name, String id) {
        System.out.println("Member(String name, String id) μ‹€ν–‰");
        this.id = id;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public String getId() {
        return id;
    }
}

μƒμ„±μžκ°€ μ˜€λ²„λ‘œλ”©λ˜μ–΄ μ—¬λŸ¬κ°œκ°€ 있으면 μ»΄νŒŒμΌλŸ¬λŠ” ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ„œλ“œμ™€ λ™μΌν•œ λ§€κ°œλ³€μˆ˜ νƒ€μž…κ³Ό κ°œμˆ˜κ°€ μžˆλŠ” μƒμ„±μžλ₯Ό μ°Ύμ•„μ„œ μ‹€ν–‰ν•œλ‹€.

 

λ°˜μ‘ν˜•