callback_ex 복습 순서 |
메모 | |
ch01> CallbackBtnAction ch02> (01의 내용 잘라서 클론코딩하기) CallBackBtn2 MainActivityEx1 MainTest1 SubActivityEx1 |
ch03> CalendarMainTest1 HackerNews MainTest1 MbcNews MyArticle SbsNews WriteArticle ch04> Activity1 Activity2 CallbackCheckPosition MainTest |
1.구조파악 //+그때 그때 헷갈리는 개념이나 기능 찾아서 써보기 2.순서기억 순서암기 3.손코딩해보기 //클론코딩은 내가 2가지 일 동시에 못하니, 어느 정도 지식이 내 것이 되었을 때 해보자. 우선순위 : 이해>암기>손코딩>클론코딩 |
Callback이란
package ch01;
//콜백메서드를 직접 만들 줄 알아야 한다.
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
//인터페이스를 선언한다.
interface CallbackBtnAction {
public abstract void clickedAddBtn();
//매개변수로 값 전달 가능
public abstract void passValue(int value);
public void clickedMinusBtn();
public void clickedOneBtn();
public void clickedTwoBtn();
public void clickedThreeBtn();
// 메서드 3개 추가 생성
}// end of interface
//콜백 받는 객체 : CallbackBtnAction 인터페이스를 구현해서 메서드를 정의 한다.
class MainActivity extends JFrame implements CallbackBtnAction {
int count;
JLabel label;
public MainActivity() {
count = 0;
label = new JLabel(count + "");
setSize(300, 300);
setVisible(true);
setLayout(new FlowLayout());
add(label);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void clickedAddBtn() {
// 콜백 되어지는 메서드 :
System.out.println(this.getClass().getName() + "이 콜백 받았습니다.");
count++;
label.setText(count + "");
}
@Override
public void clickedMinusBtn() {
System.out.println("마이너스 콜백 받았습니다.");
count--;
label.setText(count + "");
}
@Override
public void clickedOneBtn() {
System.out.println("+1 콜백 받았습니다.");
count *= 2;
label.setText(count + "");
}
@Override
public void clickedTwoBtn() {
System.out.println("-2 콜백 받았습니다.");
count -= 2;
label.setText(count + "");
}
@Override
public void clickedThreeBtn() {
System.out.println("+3 콜백 받았습니다.");
count += 3;
label.setText(count + "");
}
@Override
public void passValue(int value) {
System.out.println("value 값 전달 받음 : " + value);
label.setText(count+"");
}
}// end of MainActivity
//콜리(호출자) : 콜백 받는 객체의 주소값을 알고 있어야 메서드가 호출되었다고 알릴 수 있다. !!
class SubActivity extends JFrame implements ActionListener {
JButton btnAdd;
JButton btnMinus;
JButton btnOne;
JButton btnTwo;
JButton btnThree;
// 문제 1 버튼 3개 생성
JButton btnPassValue;
// 1. 멤버변수로 선언을 해준다.
CallbackBtnAction callbackBtnAction;
public SubActivity(CallbackBtnAction callbackBtnAction) {
// 중요!!
this.callbackBtnAction = callbackBtnAction;
setSize(300, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
btnAdd = new JButton("더하기 버튼");
btnMinus = new JButton("뺴기 버튼");
btnOne = new JButton("2씩 곱하기 버튼");
btnTwo = new JButton("2씩 뺴기 버튼");
btnThree = new JButton("3씩 더하기 버튼");
btnPassValue = new JButton("값 전달버튼");
setVisible(true);
setLayout(new FlowLayout(FlowLayout.CENTER, 50, 50));
add(btnAdd);
add(btnMinus);
add(btnOne);
add(btnTwo);
add(btnThree);
add(btnPassValue);
btnAdd.addActionListener(this);
btnMinus.addActionListener(this);
btnOne.addActionListener(this);
btnTwo.addActionListener(this);
btnThree.addActionListener(this);
btnPassValue.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
// System.out.println("더하기 버튼이 클릭 되었습니다.");
// 1. 버튼 구분
JButton targetBtn = (JButton) e.getSource();
if (targetBtn == btnAdd) {
// 더하기 버튼
callbackBtnAction.clickedAddBtn();
} else if (targetBtn == btnMinus){
// 빼기 버튼
callbackBtnAction.clickedMinusBtn();
}else if (targetBtn == btnOne){
// 빼기 버튼
callbackBtnAction.clickedOneBtn();
}else if (targetBtn == btnTwo){
// 빼기 버튼
callbackBtnAction.clickedTwoBtn();
}else if (targetBtn == btnThree){
callbackBtnAction.clickedThreeBtn();
}else if (targetBtn == btnPassValue){
// 빼기 버튼
callbackBtnAction.passValue(100);
//alt shift R -> 메서드 이름 바꾸기
//!중복되는 경우가 없을 경우에만
}
}
}
public class CallbackTest {
public static void main(String[] args) {
MainActivity mainactivity = new MainActivity();
new SubActivity(mainactivity);
}
}
콜백 연습2 : 뉴스 정보 출력
날짜 인스턴스
package ch03;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class CalendarMainTest1 {
public static void main(String[] args) {
//Calendar 란 날짜 관련 인스턴스 입니다.
//달력이나 시간 계산들을 사용할 때 많이 사용하는 객체
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTimeInMillis());
//현재시간을 천분의 1로 나눔
//보기 편하기 때문에 형식을 만들어서 사용할 수 있다. 포매터 formater?
//날짜로 변환 방법 지정
DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
//현재 시간을 내가 정한 format 형식으로 변환
String date = dateFormat.format(calendar.getTimeInMillis());
System.out.println(date);
}
}
콜백
1.해커뉴스
package ch03;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
//콜백
public class HackerNews implements WriteArticle{
// 있는 사이트
private String printDate() {
//
DateFormat formater = new SimpleDateFormat("yyyy.MM.dd");
return formater.format(Calendar.getInstance().getTime());
}//end of printDate
@Override
public void printArticle(String article) {
System.out.println("***HackerNews***");
System.out.println();
System.out.println(article);
System.out.println();
System.out.println("기사 작성일 : " + printDate());
}
}
2. Sbs뉴스 3.Mbc뉴스
콜리(호출자)
package ch03;
import java.util.Scanner;
//콜리 (호출자)
public class MyArticle {
String article;
WriteArticle hackers;
WriteArticle sbsNews;
WriteArticle mbsNews;
//주소값 연결
public MyArticle( WriteArticle mbsNews, WriteArticle hackers, WriteArticle sbsNews) {
this.mbsNews = mbsNews;
this.hackers = hackers;
this.sbsNews = sbsNews;
}
public void complete() {
//Scanner를 사용해서 사용자 입력 값을 받고 콜백메서드를 실행 시켜주세요
//nextLine
//1.스캐너 선언하기
//2.사용자 입력값 받기
//3.입력값을 멤버 변수 article에 담기
Scanner scanner = new Scanner(System.in);
article = scanner.nextLine();
hackers.printArticle(article);
sbsNews.printArticle(article);
mbsNews.printArticle(article);
}
}
인터페이스 WriteArticle
package ch03;
public interface WriteArticle {
public void printArticle(String article);
}//end of WriteArt~
결과
package ch03;
public class MainTest1 {
public static void main(String[] args) {
//해커 뉴스 객체 생성
WriteArticle hackerNews = new HackerNews();
WriteArticle sbsNews = new SbsNews();
WriteArticle mbsNews = new MbcNews();
//기사작성
// MyArticle article = new MyArticle("오늘 날씨가 15도 입니다.", hackerNews);
MyArticle article = new MyArticle(hackerNews, sbsNews, mbsNews);
article.complete();
}
}
콜백 연습3 : 위치값 받기
콜백
package ch04;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Activity1 extends JFrame {
String name;
JPanel panel;
//인터페이스를 익명 구현 객체 문법으로 사용할 수 있다.
CallbackCheckPosition callbackCheckPosition = new CallbackCheckPosition() {
@Override
public void checkPosition(int x, int y) {
System.out.println(name + "콜백 받은 값 x : " + x);
System.out.println(name + "콜백 받은 값 y : " + y);
}
};
public Activity1(String name) {
this.name = name;
setTitle(name);
setSize(500 ,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
setVisible(true);
add(panel);
panel.setBackground(Color.blue);
}
}
콜리 (호출자)
package ch04;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Activity2 extends JFrame{
String name;
JPanel panel;
CallbackCheckPosition checkPosition;
public Activity2(String name) {
this.name = name;
setSize(500, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel = new JPanel();
setVisible(true);
add(panel);
panel.setBackground(Color.yellow);
//마우스 리스너 생성
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
//방어적 코드
if(checkPosition != null) {
checkPosition.checkPosition(x, y);
}
}
});
}
//메서드를 통해서 연결하기
public void setCallbackCheckPosition(CallbackCheckPosition callbackcheckPosition) {
this.checkPosition = callbackcheckPosition;
}
}
인터페이스 CallbackCheckPosition
package ch04;
public interface CallbackCheckPosition {
public abstract void checkPosition(int x, int y);
}
결과
노란화면 마우스 클릭하면 메인화면 콜백 받은 값 나옴
package ch04;
public class MainTest {
public static void main(String[] args) {
Activity1 activity1 = new Activity1("메인화면");
Activity2 activity2 = new Activity2("서브화면");
activity2.setCallbackCheckPosition(activity1.callbackCheckPosition);
}
}
'코리아 IT아카데미 > Java' 카테고리의 다른 글
20일차 | 문자 단위 입출력 스트림 (0) | 2021.11.12 |
---|---|
19일차 | 자바에서 제공되는 자료구조 구현 클래스들 - 컬레션 프레임워크 (0) | 2021.11.11 |
17일차 | Git 관리, 래퍼 클래스 (0) | 2021.11.09 |
13일차 | (0) | 2021.11.09 |
14일차 | swing (0) | 2021.11.09 |