람다식(Lambda) 

- JDK 1.8에서 추가된 문법

- FunctionallInterface를 편하게 사용할 수 있는 문법

   > FunctionallInterface : abstract method를 하나만 가진 인터페이스

- interface를 구현한 클래스를 작성하거나, anonymous inner class를 만들지 않고 사용할 수 있는 방법

- 문법)   인터페이스명 객체명 = (매개변수,,,) -> { 코드 } ;

 

* interface위에 @FunctionallInterface라는 annotaion을 설정하면

  해당 인터페이스는 추상 method를 반드시 하나만 가져야 함!

 


# 오늘의 코딩 #

- 람다식을 알아보쟈!

 

1) 매개변수가 없는 인터페이스

@FunctionalInterface  // 추상method를 반드시 하나만 가지는 interface가 작성되어야 함
public interface TestLambda {

	public void method();
//	public void method1(); //error!@FunctionalInterface 가 들어가면 추상메소드가 하나여야함
	
}

2) 매개변수가 있는 인터페이스

@FunctionalInterface  // 추상method를 반드시 하나만 가지는 interface가 작성되어야 함
public interface TestLambda2 {
	//매개변수가 있는 abstract method
	public void method(int i, String str);
	
}

3) 매개변수와 반환형이 있는 인터페이스

@FunctionalInterface  // 추상method를 반드시 하나만 가지는 interface가 작성되어야 함
public interface TestLambda3 {
	//매개변수와 반환형이 있는 abstract method
	public String luckNum(String name);
	
}

4) 1,2,3 인터페이스를 사용할 class!

import java.util.Random;

/**
 * 람다식의 사용
 */
public class UseLambda {

	public static void main(String[] args) {
		/////////// 매개변수가 없는 abstarct method////////////////
		// 1. 매개변수가 없는 abstract method
		TestLambda tl = () -> {
			System.out.println("추상 method를 구현");
		};
		// 2. 호출
		tl.method();

		/////////// 매개변수가 있는 abstarct method////////////////
		// 1. 매개변수가 있는 abstract method
		TestLambda2 tl2 = (int i, String msg) -> {
			System.out.println("매개변수있는 추상 method를 구현");
			System.out.println("i=" + i + ",msg=" + msg);
		};
		// 2.호출
		tl2.method(2021, "오늘은 날이 좋네요!");

		/////////// 반환형이 있는 abstarct method////////////////
		TestLambda3 tl3 = (String name) -> {
			Random random = new Random();
			int num = random.nextInt(101);
			return name + "님의 행운의 번호 : " + num;
		};

		//호출
		String msg = tl3.luckNum("동동"); 
		System.out.println(msg);
	}// main

}// class

 

# 출력 결과 #

 

-- functionallInterface의 경우에는 lambda식이 정말 편한 방법인 것 같다 

오늘은 Java의 꽃,, Interface★

 

 Interface 

- 구현클래스(자식클래스)에서 반드시 구현해야 할(Override) 일(method)의 목록을 정의한 것

 

<구조>

  interface

    상수(Constact) (*final 선언)

    abstract method

    *default method

 

       *default method : JDK1.8에서부터 method body({})가 있는 default method가 추가됨

                             : interface 내에서 업무를 구현하여 제공할 필요가 있을 때 사용

                             : 이 method도 당연히 구현 클래스에서 객체화가 진행된 후 호출할 수 있음

 

<특징>

  - 다중 상속 효과 (여러 개의 인터페이스를 한 클래스에서 구현 가능)

  - 약결합을 구현하여 객체 간의 유연성 향상

  - 인터페이스는 생성자를 가질 수 없음 (객체화 불가)

  - 인터페이스끼리 상속 가능 (여러개 가능)

  - 인터페이스는 인스턴스 변수가 존재하지 않으므로 구현클래스의 *객체 크기에 영향을 주지 않음

       *객체 크기 : heap에 적재되는 인스턴수 변수의 총 크기 

  - FunctionalInterface : interface가 abstract method를 반드시 하나를 가져야 하는 경우

                           : 편하게 사용하기 위해 Lambda식이 JDK1.8에서부터 지원됨

 

<객체다형성>  

  - is a 관계의 객체화 가능 (부모가 자식의 주소를 저장하는 것)

    > 인터페이스는 객체화가 될 수 없지만, 구현한 클래스의 객체주소를 저장할 수 있음

    > 부모클래스, 부모인터페이스의 method를 호출하면 자식이 구현한 method가 최우선적으로 호출

       (부모쪽은 abstract method라서 원래 동작하지 않아야 하지만 객체다형성으로 가능해짐)

  - interface를 매개변수로 받는 method가 있을 때,

    이 인터페이스를 구현한 class들은 모두 interface를 parameter로 하는 곳에 할당 가능함

    > 구현한 클래스의 객체명으로 할당함

    > 어느 클래스를 할당 하냐에 따라 값이 다 다르게 나올 수 있음 (구현 내용이 다 다를 수 있으니까)

    ★ 원 method 생성자의 입장에서는 부모의 기능만 잘 알고 있으면

        그것을 어떻게 구현했는지

        상세 내용을 알지 않고도

        부모의 이름으로 다양한 기능들을 호출할 수 있게 됨

 

<구현 방법>  

  - 인터페이스 생성 문법)

     접근지정자 interface 인터페이스명 [extends 부모인터페이스명,,,] { }

     > 접근지정자 : public – 패키지 외부에서 접근 가능, default(package) – 패키지 내부만 가능

     > 인터페이스명은 낙타체로 작성 (첫 글자 대문자!)

 

  - 인터페이스를 클래스에서 구현할 때)

     접근지정자 class 클래스명 [extends 부모클래스명] [implements 구현인터페이스명,,]

 

  - abstract method 문법) – abstract 생략 가능 / body({}) X

     1) abstract 생략 : 접근지정자 반환형 method명(매개변수,,,);

     2) abstract 명시 : 접근지정자 abstract 반환형 method명(매개변수,,,);

      > 접근지정자 : public, protected, default

 

  - default method 문법) – body O

    접근지정자 default 반환형 method명(매개변수,,,)  { 업무 구현 };

    > 접근지정자 : public, protected, default


# 오늘의 코딩 #

package test;

/**
 * 날기 위한 일의 목록 정의
 * 추진력, 양력이 필요
 * @author user
 */
public interface Fly {

	/**
	 * 추진력
	 * @return
	 */
	public String drivingForce();
	
	/**
	 * 양력
	 * @return
	 */
	public String upwardForce();
	
}//interface

- 날기 위한 간단한 interface를 작성해보았다. 모두 abstract method

 

package test;

/**
 * Fly interface를 구현하고 사용할 class
 * @author user
 */
 
public class Superman implements Fly {
	String name = "";

	public Superman() {
		name = "Clark";
	}// Superman

	/**
	 * interface의 abstract method 구현<br>
	 * 추진력<br>
	 */
	@Override
	public String drivingForce() {
		return "팔을 하늘로 뻗기";
	}// drivingForce

	/**
	 * interface의 abstract method 구현<br>
	 * 양력<br>
	 */
	@Override
	public String upwardForce() {
		return "슈퍼 망토";
	}// upwardForce

	public static void main(String[] args) {
    
		Superman man = new Superman();
		System.out.println(man.name + "의 추진력:" + man.drivingForce());
		System.out.println(man.name + "의 양력:" + man.upwardForce());

	}// main

}// class

- Fly interface를 구현하고 사용할 class 작성!

 

# 출력 결과 #

Clark의 추진력:팔을 하늘로 뻗기
Clark의 양력:슈퍼 망토

 

>> 잘 나오는 거 확인 ㅎㅎ 나중엔 extends까지 더해서 다중 상속해볼 예정!

+ Recent posts