본문 바로가기
자바학점을 자바줘 (JAVA)

[자바] 람다식, 패키지

728x90

2022.04.24 - [자바학점을 자바줘] - [자바] 인터페이스

 

[자바] 인터페이스

제곧내 제목이 곧 내용 바로 들어가겠다. 인터페이스 : 서로 다른 장치들이 연결되어서 상호 데이터를 주고받는 규격(규칙) 인터페이스가 서로 다르면 연결이 불가하다 추상 클래스보다 더 추상

zenstudy.tistory.com

 

인터페이스에 이어서 람다식과 패키지에 대해 알아보자.

뭐 이리 개념이 많은지 원래 게시글 하나로 적을 거 나눠 쓰고 있다.

 

바로 시작하겠다.

 

 


 

 

람다식 : 나중에 실행될 목적으로 다른 곳에 전달될 수 있는 함수이다.

 

 

몇가지 특징을 정리해보면

 

다른 곳에 전달될 수 있는 코드 블록

메소드가 필요한 곳에 메소드 보낼 수 있음

메소드가 독립된 단위로 취급될 수 있음

 

 

 

람다식의 형식은

 

 

 

(argument)[메소드 시그니처] ->[람다연산자] {body}[메소드 구현]

(int a, intb) -> {return a+b}

 

 

 

이렇게 사용된다.

 

 

 

() -> System.out.println("Hello World");
(String s) -> {Ststem.out.println(s)};
() -> 69
() -> {return 3.141592;}

이런식으로 다양한 방법으로 람다식을 사용할 수 있다.

 

 

 


람다식의 필요성

 

button.addActionListener(new ActionListener() {
	@override
    public void actionPerformed(ActionEvent e) {
    	System.out.println("버튼이 클릭되었음");
    }
});

 

button.addActionListener(
	(e) -> {System.out.println("버튼이 클릭되었음");}
);

람다식을 이용하면 이렇게 단축된다.

 

 

 

 

new Thread(new Runnable() {
	@override
    public void run()
    {
    	System.out.println("스레드가 실행되고 있습니다.");
    }
}).start();

 

new Thread(
	() -> System.out.println("스레드가 실행되고 있습니다")
).start();

무명클래스도 짧은줄 알았는데 람다식은 더 짧아졌다.

 

 

 


 

 

전에 인터페이스에서 만들었던 타이머 이벤트를 

람다식으로 다시 만들 수 있다.

 

 

 

[기본 코드]

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

class MyClass implements ActionListener {	//ActionListener 인터페이스를 구현한 클래스 생성
	public void actionPerformed(ActionEvent event) {	//Timer에 의하여 1초에 한번씩 호출
		System.out.println("일어나");
	}
}


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

		ActionListener listener = new MyClass(); //상향 형변환
		Timer t = new Timer(1000, listener);	//actionPerformed()를 호출해달라고 Timer에 등록
		t.start();
		for (int i = 0; i < 1000; i++) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
			}
		}
	}
}

 

 

 

 

[람다식 코드]

import javax.swing.Timer;

public class CallbackTest {

	public static void main(String[] args) {
		Timer t = new Timer(1000, event -> System.out.println("일어나"));
		t.start();

		for (int i = 0; i < 1000; i++) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
			}
		}
	}
}

 

 

 

 


 

 

람다식의 예제를 몇개 가져와서 람다식을 더 자세히 알아보자

 

 

 

@FunctionalInterface
interface MyInterface {
	void sayHello();
}

public class LambdaTest1 {

	public static void main(String[] args) {
		//람다식을 함수 인터페이스에 대입 가능, 매개변수로 전달 가능
		MyInterface hello = () -> System.out.println("Hello Lambda!"); 
		hello.sayHello();
	}
}

 

 

 

 

@FunctionalInterface
interface MyInterface {
	public void calculate(int x, int y);
}

public class LambdaTest2 {

	public static void main(String[] args) {
		//람다식에서 2개의 인수를 받음
		MyInterface hello = (a, b) -> {
			int result = a * b;
			System.out.println("계산 결과는 : " + result);
		};

		hello.calculate(10, 20);
	}
}

 

 

 

 

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

@FunctionalInterface
interface MyInterface {
	public void calculate(int x, int y);
}

public class LambdaTest3 {

	public static void main(String[] args) {

		List<String> list = new ArrayList();
		list.add("AAA");
		list.add("bbb");
		list.add("CCC");
		list.add("ddd");
		list.add("EEE");

		// 대소문자를 구별하는 정렬
		Collections.sort(list);

		System.out.println("대소문자를 구별한 정렬:");
		System.out.println(list);

		// 람다식을 이용하여서 대소문자를 무시하는 비교 메소드를 작성하여 전달한다. 
		Collections.sort(list, (o1, o2) -> o1.compareToIgnoreCase(o2));

		System.out.println("대소문자를 구별하지 않은 정렬:");
		System.out.println(list);
	}

}

 

 

 

 


 

 

 

패키지 : 서로 관련 있는 클래스나 인터페이스를 하나로 묶는 것

패키지가 다르면 이름이 같아도 된다 ( 이름 충돌 방지 )

 

 

형식은

 

 

package 패키지 이름;

 

 

이다.

 

 

 


 

패키지를 사용하는 방법은

1. 경로까지 포함하는 완전한 이름으로 참조

ex) library.Rectangle myRect = new library.Rectangle();

 

2. 원하는 패키지 멤버만을 import

ex) import library.Rectangle;

 

3. 패키지 전체를 import

ex) import library.*;

 


 

 


여기까지가 중간고사 범위이다.

얼레벌레 정리를 끝냈지만

아직 머리속으로 흡수가 하나도 안됐다.

 

728x90