java 람다식(+다형성 추가 설명)

메타플랫폼대표
|2024. 5. 8. 10:21
반응형

▶람다식 : 내가 일일이 써야할 메서드를 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