2022.04.24 - [자바학점을 자바줘] - [자바] 인터페이스
인터페이스에 이어서 람다식과 패키지에 대해 알아보자.
뭐 이리 개념이 많은지 원래 게시글 하나로 적을 거 나눠 쓰고 있다.
바로 시작하겠다.
람다식 : 나중에 실행될 목적으로 다른 곳에 전달될 수 있는 함수이다.
몇가지 특징을 정리해보면
다른 곳에 전달될 수 있는 코드 블록
메소드가 필요한 곳에 메소드 보낼 수 있음
메소드가 독립된 단위로 취급될 수 있음
람다식의 형식은
(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.*;
여기까지가 중간고사 범위이다.
얼레벌레 정리를 끝냈지만
아직 머리속으로 흡수가 하나도 안됐다.
'자바학점을 자바줘 (JAVA)' 카테고리의 다른 글
[코딩테스트] 최빈값 구하기 (0) | 2023.04.30 |
---|---|
[코딩테스트] 대소문자 바꿔서 출력하기 (0) | 2023.04.27 |
[자바] 인터페이스 (0) | 2022.04.24 |
[자바] 상속 (0) | 2022.04.21 |
[자바] 클래스와 메소드 심화 개념 (1) | 2022.04.21 |