(프로그램) 기획을 생략하고 진행한 설계는 불안정하다.
프로그램 설계 방법론 중간 시험의 개발 시간은 1시간 45분으로 주어졌다.
그래서, 1시간 45분안에 교수님이 지정해준,
"자바 Application 서비스"를 구현했어야 됐다.
한마디로, 타임어택으로 "내가 정해준 자바 서비스"를 구현해라 인셈이다 ㅋㅋㅋ..
대학교 학점이 사람을 나타낼 수 없는 이유 ㅎ...
주어진 시간안에 처음보는 "서비스"를 구현해야 되기에, 허겁지겁 만들어야할 서비스의 설명이 적여있는 문제지를 읽었다.
그리고, 읽은 다음 이해되는 족족, 프로그램 설계를 진행했다.
이때 구성했던 프로그램 설계는 다음과 같다.
참으로, 난잡하다 ㅎㅎ..
시험 당시에는 빨리 프로그램을 구현해야된다는 압박때문에,
문제지를 읽으면서 구현해야 될
자바 "서비스"를 바로 노트에 프로그램 설계를 진행했었다.
# 중간시험에서 구성한 프로그램 설계고찰 - 기능간의 설계 용어 불일치
그래서, 노트에 적혀진 프로그램 설계를 보면,
기능간의 용어 일치가 안되어있는 걸 볼 수 있다.
예를 들면, 노트에 (보드판 이전 보드 출력) 과 (보드판 색칠 고정 출력)은 똑같이
보드판을 출력하는 기능인데, 용어가 다르게 정의해둔 걸 볼 수 있다 ㅎㅋㅎㅋ
이렇게 시험에서 설계한 이유는 아마, 프로그램 기획과정을 생략해서
내가 구현해야 될 프로그램의 기능들이 무엇인지 정확하게 몰랐기에,
위와 같이 동일한 기능들에 대한 설계 용어들을 일치시키지 못했다고 생각한다.
원래, 실패를 하면서 성장하는 법 ㅎㅎ... 나름 나의 프로그램 설계 방법에 대해 다시 돌아볼 수 있는 뜻깊은 경험이었다 !
# 중간시험에서 구성한 프로그램 설계고찰 - 프로그램 논리 설계오류..ㅎㅎ
부끄럽지만, 중간 시험에서 노트에 구성한 프로그램 설계에서 논리 설계오류가 있었다.
위의 사진을 보면, 번호를 입력받은 후
프로그램 구현횟수가 짝수인지, 홀수인지 검증을 해야된다고 설계를 했었다...ㅋㅋ
실제로, 구현을 해보면 입력횟수에 따라 자바 "서비스"가 구현되는게 아니라,
보드판의 2칸 값에 대해 입력을 받고, 2칸의 색깔이 일치하면,
보드판을 업데이트해서 보드판을 출력한다.
2칸의 색깔이 일치하지 않으면, 보드판을 업데이트하지 않고, 보드판을 출력한다.
정리해서, 내가 중간시험에서 구성한 프로그램 설계는
시험에서 구현할 자바 "서비스"에서 불필요한 비효율적인 설계였다.
위와같이 구성해도 되지만, 시험에서 구성할 자바 "서비스"에선 필요없는 이벤트이기에 좋은 설계는 아님을 이해하자.
프로그램 설계에서 필요한 이벤트 작업을 제대로 설계하지 못했던 것이
중간시험에서 겪은 두번째 설계오류이다 ㅎㅎ..
필요한 이벤트 작업을 제대로 설계하지 못했던 이유는 아마 프로그램 기획을 생략해
주어진 프로그램에 대한 논리를 이해하지 않고 설계를 진행했기 때문이라고 생각한다.
전체를 이해하고, 설계를 해야지만 필요한 이벤트를 설계할 수 있다라는 걸 깨닫게 해주는 좋은 경험이었다. ㅎㅎ
# 정리
프로그램 기획을 하면서, 프로그램에 대한 전반적인 이해를 하고 구현되어질 기능들을
리스트 형태로 나타내어질 수 있는데,
그 과정을 생략하고, 프로그램 설계를 진행해서,
설계 용어 불일치, 프로그램 논리 설계오류를 범했던 것 같다.
코드 구현
해당 사항은 자바에 대한 전반적인 이해를 요구하고,
객체에 대한 새로운 앎이기에, 모든 시험이 끝나고
객체에 대해 정리하면서 구현했던 걸 포스팅하도록 하겠다.
지금은, 구현완료한 코드를 올려두겠다. (중간 시험 당시에 받았던 미완성 코드도 함께 올렸다.)
Model 클래스
# Cell - Model 클래스
import java.awt.Color;
public class Cell {
private Color color;
private boolean revealed;
public Cell(Color c) {
color = c;
}
public Color color() {
return color;
}
public boolean revealed() {
return revealed;
}
public void reveal() {
revealed = true;
}
public void hide() {
revealed = false;
}
public boolean isATwinWith(Cell c) {
return true; // true to be replaced with a proper expression
}
}
# GameBoard - Model 클래스
import java.awt.Color;
import java.util.Random;
public class GameBoard {
private Cell[][] square;
private int point;
public Cell[][] square() {
return square;
}
public int point() {
return point;
}
public void upgrade() {
point += 2;
}
public GameBoard() {
square = new Cell[4][4];
Color[] colors = {Color.BLUE, Color.CYAN, Color.PINK, Color.RED,
Color.GRAY, Color.GREEN, Color.MAGENTA, Color.ORANGE};
Cell[] twins = createTwinCells(colors);
makeSquare(shuffle(twins));
}
private void makeSquare(Cell[] cells) {
// to be filled...
}
private Cell[] createTwinCells(Color[] cs) {
// to be filled...
}
private Cell[] shuffle(Cell[] twins) {
int index;
Cell temp;
Random random = new Random();
for (int i = twins.length - 1; i > 0; i--) {
index = random.nextInt(i+1);
temp = twins[index];
twins[index] = twins[i];
twins[i] = temp;
}
return twins;
}
}
View 클래스
# Reader - ViewIn 클래스
import javax.swing.JOptionPane;
public class Reader {
public int readInput() {
String input = JOptionPane.showInputDialog("번호를 선택하세요.");
int number = Integer.parseInt(input);
while (number < 1 || number > 16) {
input = JOptionPane.showInputDialog("번호를 선택하세요.");
number = Integer.parseInt(input);
}
return number;
}
}
# BoardWriter - ViewOut 클래스
import javax.swing.*;
import java.awt.*;
public class BoardWriter extends JPanel {
private GameBoard board;
private final int SIZE = 30;
public BoardWriter(GameBoard b) {
board = b;
JFrame f = new JFrame();
f.getContentPane().add(this);
f.setLocation(550,80);
f.setTitle("Matching Game");
f.setSize(SIZE*6, SIZE*7+28);
f.setVisible(true);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, SIZE*6, SIZE*7);
paintCellNumbers(g);
paintRevealedCells(g);
}
private void paintCellNumbers(Graphics g) {
int number = 1;
for (int i = 0; i < 4; i = i + 1)
for (int j = 0; j < 4; j = j + 1) {
int x = SIZE + (SIZE * j);
int y = SIZE + (SIZE * i);
g.setColor(Color.BLACK);
g.drawRect(x, y, SIZE, SIZE);
if (number < 10)
g.drawString(number + "", x+11, y+20);
else
g.drawString(number + "", x+7, y+20);
number += 1;
}
}
private void paintRevealedCells(Graphics g) {
Cell[][] square = board.square();
for (int i = 0; i < 4; i = i + 1)
for (int j = 0; j < 4; j = j + 1) {
Cell cell = square[i][j];
if (cell.revealed()) {
int x = SIZE + (SIZE * j);
int y = SIZE + (SIZE * i);
g.setColor(cell.color());
g.fillOval(x+3, y+3, SIZE-6, SIZE-6);
}
}
}
}
Controller 클래스
# GameController - Controller 클래스
public class GameController {
private GameBoard board;
private BoardWriter writer;
private Reader reader;
public GameController(GameBoard b, BoardWriter w, Reader r) {
board = b;
writer = w;
reader = r;
}
public void play() {
Cell[][] square = board.square();
// to be filled...
}
/** delay - how_long millisecond 동안 실행 정지 */
private void delay(int how_long) {
try { Thread.sleep(how_long); }
catch (InterruptedException e) { }
}
}
Starter 클래스
# MatchingGame - Starter 클래스
public class MatchingGame {
public static void main(String[] args) {
GameBoard board = new GameBoard();
BoardWriter writer = new BoardWriter(board);
Reader reader = new Reader();
new GameController(board,writer,reader).play();
}
}
구현완료한 코드 & 트러블 슈팅
1. repaint() 안됨.
- delay(2000) = 2초
delay()의 내부인자는 ms로 시간단위를 지님.
2. While(true)에서 if 처리의 의미
소스코드는 시간될 때 업로드 예정이다.
'💭 경험&생각' 카테고리의 다른 글
[생각] 11월을 시작하며.. 나홀로 한강공원 (0) | 2022.11.04 |
---|---|
[경험] 구글 애드센스 통과하기... - 구글 애드센스 통과하는 법 (0) | 2022.10.23 |
[생각] 창업 동아리의 목적을 찾아서 - 책임감 있는 구성원 되기 (0) | 2022.08.22 |
[경험] 월디페 혼자 공연 보러가기 - 살면서 겪어보지 못한 새로운 경험과 즐거움 (0) | 2022.08.16 |
[경험] 서울, 혼자서 여행 - 잊지 못할 좋은 경험 (0) | 2022.07.17 |