230308 굿모닝세션

허크·2023년 3월 8일
0

애너테이션

소스 코드가 컴파일되거나 실행될 때에 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해주는 문법 요소

  • 표준 애너테이션 : JDK에 내장 되어있는 애너테이션 ( @Override )
  • 메타 에너테이션 : 애너테이션의 부가정보를 설정하는데 사용하는 애너테이션
  • 사용자 정의 애너테이션

익명 객체

식별자가 없는 일회용 객체

  • 익명 자식 객체 : 상위 클래스를 상속 받아서 생성
    • 보통 중괄호 블록 내에 상위 클래스의 메서드를 오버라이딩하는 코드가 작성됨


public class IJ2 {
	public static void main(String[] args) {
    	
        Person hurk = new Person() {
        	
            private void work() {
            	System.out.println("근무 시작!");
            }
            
            @Override
            public void live() {
            	super.wake();
            	super.eat();
                work();
                super.sleep();
            }
        }
    }
}


class Person {

	public void wake() {
    	System.out.println("기상!");
    }
    public void eat() {
    	System.out.println("냠냠");
    }
    public void sleep() {
    	System.out.println("쿨쿨");
    }
    
    public void live() {
    	this.wake();
        this.eat();
        this.sleep();
    }
}

  • 익명 구현 객체 : 인터페이스를 구현해서 생성
    • 보통 중괄호 블록 내에 인터페이스의 추상 메서드를 구현하는 코드가 작성됨

public class IG2 {
	public static void main(String[] args) {
    	
        Workable hurk = new work() {
        	@Override
            public void work() {
            	System.out.println("수업중....")
            }
        }
        
        hurk.work();
    }
}


interface Workable {
	void work();
}





람다

메서드를 하나의 식(expression) 으로 표현한 것

  • 식, 문, 값
    • 식 : 값을 만들어내는 코드
    • 문 : ;으로 끝나는 코드
    • 값 : 말 그대로 값


public class LambdaExample {
	public static void main(String[] args) {
        Hello hello = () -> System.out.println("hello!");
        
        hello.sayHello();
	}
}

@FunctionalInterface
interface Hello {
	void sayHello();
}

// 출력값
// hello!
  • 내부적으로 익명 구현 객체의 메서드로 컴파일 된다
    • 익명구현 객체의 멤버로서 인터페이스의 참조변수에 할당할 수 있다

  • 함수형 인터페이스 : 람다식을 할당할 때 참조변수로 사용되는 인터페이스
    • 오로지 하나의 추상메서드만 있을 경우에만 함수형 인터페이스로 동작 가능
    • 반환타입과 추상메서드가 타입이 일치해야 사용할 수 있음


  • 이때 @FunctionalInterface 라는 표준애너테이션을 붙일 수 있다
    • 해당 인터페이스에 두개 이상의 추상메서드를 입력할 경우 에러를 띄워서 알려줄 수 있다

public class LambdaCaculator {
	public static void main(String[] args) {

		Caculable add       = (a, b) -> a + b;
        Caculable substract = (a, b) -> a - b;
        Caculable multiply  = (a, b) -> a * b;
        Caculable devide    = (a, b) -> a / b;
        
        operate(add, 10, 2);
        operate(substract, 10, 2);
        operate(multiply, 10, 2);
        operate(devide, 10, 2);
	}
    
    private static void operate(Caculable caculable, int a, int b) {
    	System.out.println(caculable.calculate(a, b));
    }
}

@FunctionalInterface
interface Calculable {
	int calculate(int a, int b);
}

// 출력값
// 12
// 8
// 20
// 5

  • 람다식에는 변수의 타입을 알아서 추론해주는 기능이 있으므로 괄호 안에 타입을 입력할 필요 x

  • 이런 기법을 함수형 프로그래밍 이라고 한다

    • 람다는 함수형 프로그래밍을 객체형 프로그래밍 언어인 자바에서 지원하기 위해 만듬
profile
codestates seb 44th // 다크모드로 보는걸 추천드립니다

0개의 댓글