▶람다식 : 내가 일일이 써야할 메서드를 JVM이 함축시켜서 초간단하게 입력할 수 있는 방법
▶어느 프로그램이던지 람다식을 다른 이름으로 사용한다.
- 추상 클래스를 사용하는 이유는 표준화이다. (객체를 사용할 때 기준을 잡아주는 것이다)
- 클래스 : 설계도, 인터페이스 : 사용 설명서 (사용자가 필요하다)
▶다형성 : 쉬는 시간 되면 잠깐 쉬었다 하겠습니다.
- 명령을 하면, 다양하게 행동을 하게 되는 것
- 일일이 해야하는 것을 정해주게 되면 너무 시간이 길어진다.
- 상위 명령을 하나 툭 던져주면 각자 그 명령을 받아서 개개인의 행동을 정하고 수행한다.
※ 도형이니까 너 그냥 그려 (draw) 삼각형은 알아서 삼각형으로, 사각형은 알아서 사각형으로 각자 할 행동들을 만들어서 수행한다.
- 전달하는 명령은 동일하지만 (draw) 각각의 상속받은 클래스들에 오버라이딩 되어 있는 (draw) 명령으로 실행이 되는 것
▶캡슐화 : 사용자는 리모콘이 어떤 원리로 작용하고 동작하는지 모르고, 그냥 사용법만 알면 된다.
인터페이스와 클래스의 용도는 분명히 다르다.
추상 클래스 : 제품 생산 (이런 제품들은 이런 기능이 있어야해 하면서 만드는 것)
인터페이스 : 메뉴얼 (사용방법)
-> 클래스는 일일이 인스턴스 멤버와 메서드를 만들어서 그 제품 자체를 만드는데,
인터페이스는 그냥 사용방법만 알고 그 사용방법대로만 쓰면 된다.
★ 추상클래스와 인터페이스는 객체를 생성하지 못한다.
package mymain;
abstract class 학생 {
protected int 학년;
protected int 학번;
학생(int 학년, int 학번) {
this.학년 = 학년;
this.학번 = 학번;
}
abstract void 공부한다 ();
} //학생 end
class 초등학생 extends 학생 {
초등학생(){
super(5, 25);
}
@Override
void 공부한다() {
System.out.printf("%s","나는 초등학생이니까 구구단을 공부하겠습니다.\n");
}
}
class 중학생 extends 학생 {
중학생(){
super(2, 14);
}
@Override
void 공부한다() {
System.out.printf("%s","나는 중학생이니까 방정식을 공부하겠습니다.\n");
}
}
class 고등학생 extends 학생 {
고등학생(){
super(3, 27);
}
@Override
void 공부한다() {
System.out.printf("%s","나는 고등학생이니까 미적분을 공부하겠습니다.");
}
}
public class MyMain_Test2 {
public static void main(String[] args) {
학생 학생1 = new 초등학생();
학생 학생2 = new 중학생();
학생 학생3 = new 고등학생();
학생 [] student_array = {학생1, 학생2, 학생3};
for(학생 student : student_array) {
student.공부한다();
}
//main-end
}
}
package mymain;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class MyMain_ButtonEvent extends JFrame {
// JButton 타입의 참조변수
JButton jbt_kor;
JButton jbt_eng;
JButton jbt_jpn;
JButton jbt_chn;
JButton jbt_ger;
JButton jbt_fra;
// Member로써의 내부클래스
class KorButtonEventObject implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
setTitle("한국어 : 안녕하세요!!!");
}
}
public MyMain_ButtonEvent() {
super("알고 싶은 나라의 인사말");
GridLayout gl = new GridLayout(6, 2); // 6행 1열
this.setLayout(gl);
// 버튼생성
jbt_kor = new JButton("한국어 인사말");
jbt_eng = new JButton("영어 인사말");
jbt_jpn = new JButton("일본어 인사말");
jbt_chn = new JButton("중국어 인사말");
jbt_ger = new JButton("독일어 인사말");
jbt_fra = new JButton("프랑스 인사말");
// 버튼 적재
this.add(jbt_kor);
this.add(jbt_eng);
this.add(jbt_jpn);
this.add(jbt_chn);
this.add(jbt_ger);
this.add(jbt_fra);
// 버튼이벤트 등록
// 이벤트위임모델(Delegation Event Model) 대리자
// EventSource : Event를 발생시킨 컨트롤
// EventSource.addActionListener(처리객체);
jbt_kor.addActionListener(new KorButtonEventObject());
// Local 내부클래스(메소드내에 선언된 클래스)
class EngButtonEventObject implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
setTitle("영어 : Hi~ Everyone!!!");
}
}
// 영어인사말 버튼 클릭시 EngButtonEventObject에게 위임하겠다.
jbt_eng.addActionListener(new EngButtonEventObject());
// 위치 x y
super.setLocation(500, 200);
// 크기
super.setSize(400, 500);
// 보여줘라
super.setVisible(true);
// 종료
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new MyMain_ButtonEvent();
//main-end
}
}
▶어차피, 메서드 내부에서 제작된 클래스는 1회용이기 때문에, 일일이 만들기가 상당히 번거롭다.
- 그래서, 익명 내부 클래스를 사용해서 1회성으로 사용하기 적합하다.
▶이 참조변수 조차도, 생성하면 1회용인데 아깝지 않은가?
- 그래서, 익명 객체로 사용한다.
▶ JVM이 똑똑해서 일까 인자값 e를 뭘 쓰려고 하는지 얘는 알고 있다.
- 람다식은 그 자체만으로 실행이 되는게 아니라, JVM이 추가적으로 복원시켜서 값으로 만들어준다.
- for문을 쓰게 되면, 성능저하가 일어나는데 이 람다식은 익명 '객체'를 생성하는 것이기 때문에, 객체가 내부적으로 만들어지기 때문에 성능저하가 일어난다. (반복문 쓰면 완전 메모리 아까움)
- 1회용으로 사용되는 객체들을 람다식을 통해서 간단하게 사용하고, 간단하게 코드 입력이 가능하다.
기존 Interface 사용법 -> 람다식
@FunctionalInterface을 통해 람다식을 사용하려면, 메서드는 단 한개만 존재해야 한다.
JVM이 읽을 때 혼동옴. 뭘 사용하란거니?
▶람다식을 ArrayList에서 개선 loop(향상된 for문)와 함께 사용하는 방법
▶람다식을 Array에서 개선 loop(향상된 for문)와 함께 사용하는 방법
▶람다식을 Map에서 개선 loop(향상된 for문)와 함께 사용하는 방법
package mymain;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;
public class _07_MyMain_MoveWin extends JFrame {
// 첫 번째 줄
JButton jbt_lt; // t : top
JButton jbt_ct;
JButton jbt_rt;
// 두 번째 줄
JButton jbt_lc; // c : center
JButton jbt_cc;
JButton jbt_rc;
// 세 번째 줄
JButton jbt_lb; // b : bottom
JButton jbt_cb;
JButton jbt_rb;
// 화면해상도
int screen_w;
int screen_h;
// 생성자 -> 초기화
public _07_MyMain_MoveWin() {
super("윈도우 움직이기");
// 화면크기구하기 (폭과 높이를 구하게 되는 클래스)
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
screen_w = d.width;
screen_h = d.height;
System.out.printf("w:%d h:%d", screen_w, screen_h);
GridLayout gl = new GridLayout(3, 3);
this.setLayout(gl);
jbt_lt = new JButton("↖");
jbt_ct = new JButton("↑");
jbt_rt = new JButton("↗");
jbt_lc = new JButton("←");
jbt_cc = new JButton("★");
jbt_rc = new JButton("→");
jbt_lb = new JButton("↙");
jbt_cb = new JButton("↓");
jbt_rb = new JButton("↘");
this.add(jbt_lt);
this.add(jbt_ct);
this.add(jbt_rt);
this.add(jbt_lc);
this.add(jbt_cc);
this.add(jbt_rc);
this.add(jbt_lb);
this.add(jbt_cb);
this.add(jbt_rb);
jbt_lt.addActionListener((e) -> {setTitle("↖");});
jbt_ct.addActionListener((e) -> {setTitle("↑");});
jbt_rt.addActionListener((e) -> {setTitle("↗");});
jbt_lc.addActionListener((e) -> {setTitle("←");});
jbt_cc.addActionListener((e) -> {setTitle("★");});
jbt_rc.addActionListener((e) -> {setTitle("→");});
jbt_lb.addActionListener((e) -> {setTitle("↙");});
jbt_cb.addActionListener((e) -> {setTitle("↓");});
jbt_rb.addActionListener((e) -> {setTitle("↘");});
// 우측버튼 클릭시
jbt_lt.addActionListener((e) -> { on_button_lt(); });
jbt_ct.addActionListener((e) -> { on_button_ct(); });
jbt_rt.addActionListener((e) -> { on_button_rt(); });
jbt_lc.addActionListener((e) -> { on_button_lc(); });
jbt_cc.addActionListener((e) -> { on_button_cc(); });
jbt_rc.addActionListener((e) -> { on_button_rc(); });
jbt_lb.addActionListener((e) -> { on_button_lb(); });
jbt_cb.addActionListener((e) -> { on_button_cb(); });
jbt_rb.addActionListener((e) -> { on_button_rb(); });
// 위치 x y
super.setLocation(300, 300);
// 크기
super.setSize(300, 300);
// 보여줘라
super.setVisible(true);
// 종료
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void on_button_lt() {
// 현재위치 구하기
Point pt = this.getLocation();
// 오른쪽 이동시킬 좌표값 수정
pt.x -= 10;
pt.y -= 10;
// 좌표로 이동
this.setLocation(pt);
}
private void on_button_ct() {
// 현재위치 구하기
Point pt = this.getLocation();
pt.y -= 10;
// 좌표로 이동
this.setLocation(pt);
}
private void on_button_rt() {
// 현재위치 구하기
Point pt = this.getLocation();
pt.x += 10;
pt.y -= 10;
// 좌표로 이동
this.setLocation(pt);
}
private void on_button_lc() {
// 현재위치 구하기
Point pt = this.getLocation();
pt.x -= 10;
// 좌표로 이동
this.setLocation(pt);
}
private void on_button_cc() {
// 현재 윈도우 크기
Dimension d = this.getSize();
int x = (screen_w / 2) - (d.width/2);
int y = (screen_h / 2) - (d.height/2);
// 좌표로 이동
this.setLocation(x, y);
}
private void on_button_rc() {
// 현재위치 구하기
Point pt = this.getLocation();
pt.x += 10;
// 좌표로 이동
this.setLocation(pt);
}
private void on_button_lb() {
// 현재위치 구하기
Point pt = this.getLocation();
pt.x -= 10;
pt.y += 10;
// 좌표로 이동
this.setLocation(pt);
}
private void on_button_cb() {
// 현재위치 구하기
Point pt = this.getLocation();
pt.y += 10;
// 좌표로 이동
this.setLocation(pt);
}
private void on_button_rb() {
// 현재위치 구하기
Point pt = this.getLocation();
pt.x += 10;
pt.y += 10;
// 좌표로 이동
this.setLocation(pt);
}
public static void main(String[] args) {
new _07_MyMain_MoveWin();
//main-end
}
}
'java(2)↗' 카테고리의 다른 글
java IO패키지 (0) | 2024.05.09 |
---|---|
java 이클립스 템플릿 Template (0) | 2024.05.08 |
java 요약노트 (0) | 2024.05.08 |
java 보충수업 (0) | 2024.05.07 |
java 컬렉션 프레임워크 (Set, Map) (0) | 2024.05.03 |