자바로 PC방 프로그램만들기

4.5 초식 필살!? 리팩토링!!

과감하게 리팩토링을 합니다. 리팩토링이란게 정답이 없습니다만, 뭔가 그래도 사고의 깊이는 느낄 수가 있기 때문에 상당히 조심스럽습니다ㅠ.ㅠ.. (잘 하시는 분이 보시면 답답한 곳도 분명 있을 수 있겠지요...)

이번에 그래도 리팩토링하며 느낀 것은 리팩토링을 하면서 정말 프로그래밍의 재미를 느낄 수가 있었고,

설령 아무도 보지 않을지라도 , 이 강좌 영상을 만들게 된 것을 잘했다고 느꼈습니다...영상을 안 만들었다면 제 스스로 이렇게 다시 한번 생각해볼 기회는 없었고, 기존의 방식대로 코딩을 했을 지도 모를 일이죠.

영상은 다 찍어놨는데..ㅠ. 하아.. ㅠㅋㅋ 마지막 하이라이트 부분을 자꾸 다시 찍게 되네요;;
준비좀 하겠습니다 .
 

시간 좀 흘렀습니다.
늦었습니다...ㅎㅎㅎ
다시 시작해보겠습니다.

이번부터 깃허브 주소를 공유합니다. 깃허브에서 소스코드를 강좌에 맞춰 받아보실 수 있습니다. 

하단에 깃허브 공개주소와 사용법이 있습니다.

리플렉션으로도 하는.. 리팩토링이 있는데..사실 리팩토링에서 업로딩을 멈췄었거든요 ㅠㅠ음

어떻게 할지 고려해보겠습니다. 일단 이정도로 업로드합니다 ! ㅎ

 

했던 일들

여기, 리팩토링에서 주로 했던 일은 다음과 같습니다.

중복의 제거, 향후 유지보수가 편이하도록 성격이 다른 설정정보는 따로 관리.. 를 주로 했었습니다.

동영상을 참조해주시면 될 것같구요^^;

(동영상 링크)

 

소스코드

ManageView 소스 

package view;

import java.awt.Component;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

import view.panel.ClockMessage;
import view.panel.ImgClock;
import view.panel.MyStarPanel;
import view.panel.PanImgload;
import asset.Setting;

@SuppressWarnings("serial")
public class ManageView extends JFrame {

    private JLayeredPane layeredPane = new JLayeredPane();
	//JPanels
	private JPanel backGround = new PanImgload("img/mainHud_back.png");
	private ImgClock imgClock = new ImgClock();
	private ClockMessage clockMessage = new ClockMessage();
	private MyStarPanel myStarPanel = new MyStarPanel();
	
	public ManageView() {
		//Configure this Frame
		setLayout(null);
		setVisible(true);
		setTitle("ManageView");
		setSize(Setting.bDimen);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setLocation(Setting.locationX, Setting.locationY);
		
		//LayerdPanel and Component Setting , Finally add To this Frame
		setPanel(layeredPane).setBounds(Setting.bRectangle);
		setPanel(backGround).setBounds(Setting.bpanRectangle);
		setPanel(imgClock).setBounds(Setting.imgClockRectangle);
		setPanel(clockMessage).setBounds(Setting.clockRectangle);
		setPanel(myStarPanel).setBounds(Setting.bpanRectangle);
		add(setJLayered(backGround, myStarPanel, imgClock, clockMessage));
		
		//Action Events
		threadStart(imgClock, clockMessage, myStarPanel); 
	}

	public static void main(String[] args) {
		new ManageView();
	}

	// Setting inner Methods
	private JComponent setPanel(JComponent panel) {
		panel.setLayout(null);
		panel.setOpaque(false);
		return panel;
	}
	private JLayeredPane setJLayered(Component...components) {
		int i = 0;
		for (Component component : components)
			layeredPane.add(component, new Integer(i++));
		return layeredPane;
	}
	private void threadStart(Runnable...target) {
		for (Runnable runnable : target)
			new Thread(runnable).start();
	}

	// TODO 계속 들어감

}

기타 뷰쪽 파일들 소스..

package view.panel;

import java.awt.BorderLayout;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;

import asset.Setting;

@SuppressWarnings("serial")
public class ClockMessage extends JPanel implements Runnable {
    int i = Calendar.getInstance().get(Calendar.AM_PM);
	String[] ampm = { "AM", "PM" };
	SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
	String time = sdf.format(new Date());
	JLabel timeLabel, ampmLabel;

	public ClockMessage() {
		setLayout(null);

		timeLabel = new JLabel(time);
		setLable(timeLabel).setBounds(Setting.timeLabel);
		ampmLabel = new JLabel(ampm[i]);
		setLable(ampmLabel).setBounds(Setting.ampmLabel);

		add(timeLabel, BorderLayout.NORTH);
		add(ampmLabel, BorderLayout.CENTER);
	}

	@Override
	public void run() {
		do {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			timeLabel.setText(sdf.format(new Date()));
		} while (true);
	}
	//Setting Methods
	private JComponent setLable(JComponent component){
		component.setForeground(Setting.bColor);
		component.setFont(Setting.bFont);
		return component;
	}
}
package view.panel;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class ImgClock extends JPanel implements Runnable {
    Image img[] = new Image[4];
	int i = 2;
	public ImgClock() {
		img[1] = Toolkit.getDefaultToolkit().createImage("img/cl1.png");
		img[2] = Toolkit.getDefaultToolkit().createImage("img/cl2.png");
		img[3] = Toolkit.getDefaultToolkit().createImage("img/cl3.png");
		img[0] = img[1];
	}
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(img[0], 0, 0, this);
	}
	@Override
	public void run() {
		while (true) {
			try {
				Thread.sleep(10000);
				i = (i==3) ? 1 : ++i;
				img[0] = img[i];	
				repaint();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
package view.panel;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MyStarPanel extends JPanel implements Runnable {
    Image img;
	int i = 1;
	int sleep = 25;
	int sx = 77, sy=0;

	public MyStarPanel() {
		img = Toolkit.getDefaultToolkit().createImage("img/starDdong.png");
	}
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		if(img!=null) g.drawImage(img, sx, sy, this);
	}

	@Override
	public void run() {
		try {
			do {
				Thread.sleep(sleep);
				switch (i) {
				case 1: sy+=2; if(sy>791) i=2; break;
				case 2: sx+=2; if(sx>1507) i=3; break;
				case 3: sy-=2; if(sy<53) i=4; break;
				case 4: sx-=2; if(sx<77) i=1; break;
				}
				repaint();
			} while (true);
		} catch (Exception e) {
			System.out.println("무슨 에런지참. ");
		}
	}
}
package view.panel;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class PanImgload extends JPanel {
    Image image;
	
	public PanImgload(String path){
		image = Toolkit.getDefaultToolkit().createImage(path);
	}
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(image, 0, 0, this);
	}
}

깃허브 링크

앞으로는 깃허브 링크를 제공합니다. 깃허브에서 매 강좌마다 릴리즈 포인트를 제공하오니, 깃허브에서 다운받으시면 될 것같습니다.^^

여기 링크 https://github.com/arahansa/pcbang 를 눌르시고,

여기에 release 로 들어가셔서 강좌명에 맞는 것들 받아주셔도 됩니다^^

 

다운로드 링크

댓글

댓글 본문
  1. 0초식부터 잘보고있습니다! 보시는분 있을지 모르겠지만 이라고 강의에서 그래서 ㅎㅎ; 강의좋네요
  2. 아라한사
    먼저 관심 감사드리구요. 저 리팩토링도 마음에 안 드는 부분이 지금보니 좀 있습니다-_-...
    먼저 정보만을 가지고 있는 클래스에서 접근자를 잘 줘야 하는데...저도 공부중인 부분이라
    어떤 방법이 여기선 베스트프랙티스인지 감이 잘 오는 상태구요 ㅎ

    5초식 이후에 내장DB + 메이븐 전환이란 부분이 있습니다. 거기서 db 프로그램 어떻게 다루는 지 나옵니다.
    이 강좌는 DB를 많이 필요로 하지 않기 때문에, 주로 다루지는 않고

    따로 JPA 란 강좌를 만들고 있습니다. 거기서 많이 다룹니다^^
    대화보기
    • 대학생
      감사합니다 처음부터 쭈욱 들었는대요~ 정말 괜찮네요 ㅎ
      근대
      제가 데이터베이스쪽은 공부한적이 없어서 데이터베이스 프로그램을 어떻게
      다운받아야 할지 모르겠에요 ㅜㅜ 힌트좀 주시면안될까요??
    • 아라한사
      예. 알겠습니다 ! ㅠㅠ
      내일 이 시간까지 꼭 올리겠습니다. ㅠ
      대화보기
      • 노과
        계속 보구있는데욥 ^^

        지방서 늙은 아자씨가 공부하는중요~ 더올려주세효~
      • 아라한사
        더 있는데 컴퓨터 새로 사면서 하드디스크가 날라갔어요.ㅠㅠ 일주일내로 꼭 다시 찍어 올리겠습니다 :)
        대화보기
        • Minkook Cho
          강의 잘 보고있습니다.!!!! ^^

          근데 리펙토링 뒷부분 강의는 더 없는건가요?
        • 아라한사
          으앜 ㅠ 영상 찍어놓은게 날라갔네요..포맷을 해서..한두편 있었는데... 다시 찍고 업로드하겠습니당 ㅠ
          대화보기
          • 김단우
            잘보고있습니다.^^
          • 아라한사
            헉.. 여기까지 보신분이 계신가요;; 공동공부에 아무것도 댓글이 없어서 혼자찍는줄알았거든요;;
            음...조만간 올릴게요;
            대화보기
            • 이진석
              넵 강의 잘보고 있습니다!!
            버전 관리
            아라한사
            현재 버전
            선택 버전
            graphittie 자세히 보기