본문 바로가기
코리아 IT아카데미/Java

18일차 | git call back, 콜백메서드★, git branch 사용

by Sharon kim 2021. 11. 10.
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);

	}

}