2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

Delegation event model 예제

[ 문제정의 ]
다음과 같은 Applet이 있다.
위의 ScrollBean의 Prev와 Next를 누르면, 밑의 ContentBean의 월과 일의 숫자가 바뀐다.
하지만, ContentBean에 있는 월의 숫자가 바뀌어도, ScrollBean에 있는 월은 바뀌지 않는다.
이를 연동시켜서, ContentBean의 월 숫자가 바뀌면 ScrollBean의 월 숫자도 변하게 만들어라.

[ 현재상태 ]
Prev와 Next에 대한 액션은 ForwardEvent, 그리고 액션리스너는 ForwardListener로 구현되어 있다.
Adapter에는 이에 관한 액션이 정의되어 있고, 액션 타겟으로는 ContentBean이 정의되어 있다.

[ 어쩌라고?? ]
우선, 우리가 적용시켜야 할 내용을 정의하면 이렇다.
'ContentBean에서 월이 변경되는 순간을 이벤트로 정의하고, 이 이벤트에 반응할 타겟은 ScrollBean으로 한다.
이벤트가 발생하면 이벤트리스너가 이를 감지한 후, ScrollBean에 있는 액션을 실행한다'
즉, 새로운 어뎁터가 하나 필요하다..왜??
기존 어뎁터에 추가해도 되지만, 깔끔하게 ScrollBean을 타겟으로 하는 새로운 어뎁터를 만들자.
일부러 눈에 띄이게 하기 위해서 노란색 박스 모양으로 띄워주도록 하자.
그리고 ChangeEvent와 ChangeListener를 각각 구현한다.
ChangeListener는 Interface이며, ChangeAdapter는 이를 implement 한다.

[ 소스코드 ]
1. newAdapter.java
// lovelydai : new Adapter
public class newAdapter extends Canvas implements ChangeListener {
private final Font fontnew Font("Serif", Font.PLAIN, 12);
private ScrollBean target ;
public void setTarget(ScrollBean t) { target = t; } // 타겟을 정의
public void doChange(ChangeEvent e, Graphics g) {
target.reFreshMonth(e.getDelta(),this.getGraphics()); // 이벤트액션
}
// add to new Adapter
public newAdapter(){
setSize(200,30);
setBackground(Color.green);setFont(font);
}
public void paint(Graphics g) {
g.setColor(Color.black);
g.drawString("new adapter", 80,20);
}
}


2. VacancyApplet.java
// lovelydai : new Adapter Bean
private newAdapter nAdapter;
public VacancyApplet() {
scroll = new ScrollBean();
contents = new ContentsBean();
adapter = new Adapter();
// lovelydai : new instance for newAdapter
nAdapter = new newAdapter(); // 새 어뎁터를 추가
scroll.addForwardListener(adapter);
adapter.setTarget(contents);
// lovelydai : set Target for new adapter
contents.addChangeListener(nAdapter);
nAdapter.setTarget(scroll);

}

3. ChangeEvent.java

public class ChangeEvent extends EventObject {
private int delta;
public int getDelta() { return delta; }
ChangeEvent(Object source, int d) {
super(source);
delta = d;
}
}


4. ChangeListener.java

public interface ChangeListener extends EventListener {
public void doChange(ChangeEvent e, Graphics g);
}


5. ContentBean.java (일부분)

private ArrayList<ChangeListener> listeners =
new ArrayList<ChangeListener>(); // 다수의 리스너를 등록하기 위한 리스트
public synchronized void addChangeListener(ChangeListener l) {
// ChangeListener를 리스너리스트에 추가하기
listeners.add(l);
}
private void fireChangeEvent(int d) {
// ChangeEvent를 발생
ChangeEvent evt = new ChangeEvent(this, d);
for (ChangeListener l:listeners) {
l.doChange(evt, this.getGraphics());
}
}
private String filledRight(int x) {
StringBuffer s = new StringBuffer(" ");
s.append(x);
int l = s.length();
return s.substring(l-2,l);
}
public void increment(int d) {
aDay += d;
if (aDay > 30) { aDay -= 30; aMonth++; }
if (aDay < 1) { aDay += 30; aMonth--; }
if (aMonth > 12) { aMonth -= 12; }
if (aMonth < 1) { aMonth += 12; }
this.fireChangeEvent(aMonth); // aMonth값이 변경되면, 이벤트 발생!!
repaint();
}


6. ScrollBean.java (일부분)

// lovelydai : change Month
public void reFreshMonth(int d, Graphics g)
{
this.setCurrentMonth(d); // 월 부분의 숫자를 다시 그리기
g.drawString(this.filledRight(getCurrentMonth()),80,20);
repaint();
}



[ 결과화면 ]






사실, 어려운 내용도 아니고...복잡한 문제도 아니었다...
문제 내면서 교수 왈...'제대로 이해하면 10분에 해결이 되는 문제입니다' 라면서 헤죽헤죽...했는데..
과제하는 2일간은 정말 때려주고 싶었다.
JAVA도 잘 못하는데다가 Applet과 GUI 프로그래밍을 거의 해본 적 없는데다가, 이벤트 모델 역시 만져본 적
없어서 엄청나게 고생했었다..근데 그게 누구 문제냐...내가 모르는 탓이지 ㅎㅎ
게다가 정말, 이해하고나니 20분만에 해결이 되었으니, 틀린 건 아니었다 ㅋㅋ
이 때도..아 몰라!! 다 때려치우고 처음부터 보자!! 라고 생각하면서..
하나하나 적어보고 분석해서 기초적인 구조와 기존에 있던 내용을 분석하고 나니까 바로 이해가 되었다.
무엇보다도 중요한 그 '기초!!'
그리고 그렇게 쉽고 단순한 것이라도 직접 생각하면서 해봐야 한다!!! '경험' 그리고 '연습' 을 통한 '자기화'!!
마지막으로 자기화 한 것을 확인하고 복습하면서 다른 사람에게 알려주면서 확인하는 '공유' 과정까지.
이것이 공부하는 사람에게 있어서 가장 절실하고 또 중요한 것이 아닐까??

여하턴 작은 버그가 있지만 우선 해결했다는 것에 대만족!!

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법