배열
동일한 타입의 값을 정해진 개수만큼 나란히 이어 붙여 놓은 구조
# 배열 특징
- 배열array은 객체object
- 배열 생성시 각 원소는 기본값으로 초기화
# 사례 학습 - 놀이 카드
해당 사례학습은.. 구조화되지 않은 설계로 인해
패스하도록 하겠다.. - 설계를 제대로 하지않으면, 개발을 할 때 막막하다~
2차원 배열
2차원 배열은 1차원 배열에 또다른 1차원 배열을 합쳐서 생성된 "배열 객체"이다.
다음과 같이 2차원 배열 객체를 생성할 수 있다.
int [][] a = new int[3][4];
그러면, 아래와 같이 "배열 객체"가 존재하게 되는 것이다
가로줄의 수는 1차원 배열 형태로 찾으면 되고,
세로줄의 수는 2차원 배열 형태로 한 행을 기준으로 세로줄 의 수를 찾는다.
들쭉날쭉 배열 Ragged Arrays
Ragged Array 는 유동적인 2차원 배열이다.
다음과 같이 들쭉날쭉한 Ragged Array (배열 객체)를 생성할 수 있다.
double [][] ragged = new double[4][];
행을 고정해두고, 각 행마다의 열의 갯수를 달리 지정해줄 수 있다.
그렇기에, 들쭉날쭉한 배열 객체를 생성할 수 있다.
다음과 같이 앞서 생성한 들쭉날쭉한 Ragged Array에 각 행에 대한 열의 갯수를 지정한다.
double[0] = new double[2];
double[2] = new double[1];
double[3] = new double[0];
그러면, 다음과 같이 들쭉날쭉한 배열이 완성된다~
들쭉날쭉한 배열 객체는 2차원 배열을 활용할 때 더 다양하게 사용할 수 있게
도와주는 배열 객체이다.
어떤 배열 객체가 개발에 답이 있는게 아니라,
상황에 따라 적합한 배열 객체를 사용하는 것이다.
실습1. 슬라이드 퍼즐 게임 구현 - Java Application
배열 객체를 생성해서, 4X4 슬라이드 퍼즐 게임을 만들어보자!
우선 슬라이드 퍼즐 게임을 설계해보자
슬라이드 게임 설계
슬라이드 게임을 실행하면, 4x4의 보드게임 판이 생성된다.
Java GUI를 통해 사용자의 이동할 퍼즐의 숫자를 입력받는다.
- 사용자가 입력한 숫자가 이동할 수 있는 퍼즐이면,
퍼즐을 이동시키고 업데이트 한 보드판을 출력한다. - 사용자가 입력한 숫자가 이동할 수 없는 퍼즐이면,
퍼즐을 이동시킬 수 없는 예외메시지를 띄운다.
이제, 설계를 마쳤으니,
구현을 위한 MVC 아키텍처를 설계해보자!
(개발을 위한 규칙을 선정하는 것~
답이 있는게 아니라, 상황에 적합한 것을 선정하는 것!)
슬라이드 게임 아키텍처 설계
아키텍처는 다음과 같이 구성했다.
구성된 아키텍처는 정답이 아니고, 좋은 방법 중 하나이다.
# Model 클래스
우선, 퍼즐의 위치를 받아오는 Piece Model 클래스를 구성했다.
사용자로부터 받아온 퍼즐의 위치가 움직일 수 있는지 판단하고,
움직일 수 있다면, 퍼즐의 위치를 업데이트 하고,
슬라이드 퍼즐 게임의 보드 판을 생성한다.
# ViewOut 클래스
슬라이드 퍼즐 게임 보드판을 Java GUI로 그린다.
Model에서 만든 퍼즐을 Java GUI 로 출력한다.
Model에서 변동된 퍼즐 위치들을 업데이터해서 Java GUI로 출력한다.
# Controller 클래스
사용자로부터 퍼즐 위치를 입력받고,
받아진 퍼즐 위치를 Model 클래스에 보내
퍼즐 위치를 옮긴다.
옮겨진 보드판을 업데이트 받아
ViewOut 클래스에 보내 업데이트 된 보드판을 Java GUI로 출력하도록
통제한다.
# Starter 클래스
슬라이드 퍼즐 게임 Java Application을 실행하기 위한
모든 클래스 파일을 통제한다.
메인 통제역할인 Controller 클래스에 APP 실행을 위한 "객체"를 잘 통제해서 넘겨준다~~
이제, 코드를 구현하기 위한 준비는 끝났다고 보면 되겠다.
구성한 MVC 아키텍처 토대로 개발을 진행한다.
코드 구현
코드 구현된 사항은 구현한 순서대로 포스팅하도록 하겠다.
# PieceModel 클래스
public class SlidingPuzzlePieceModel {
private int face;
public SlidingPuzzlePieceModel(int n) {
face = n;
}
public int puzzleFace(){
return face;
}
}
슬라이드 퍼즐 게임의 퍼즐의 위치를 가져오는 Model 클래스이다.
# BoardModel 클래스
public class SlidingPuzzleBoardModel {
// 2차원 배열객체 생성
public SlidingPuzzlePieceModel[][] board;
// 보드판에서 빈공간 생성
private int empty_row;
private int empty_col;
// 생성 메소드
public SlidingPuzzleBoardModel() {
board = new SlidingPuzzlePieceModel[4][4];
int number = 15;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
board[i][j] = new SlidingPuzzlePieceModel(number);
number -= 1;
}
}
board[3][3] = null;
empty_row = 3;
empty_col = 3;
}
public boolean move(int n) {
// 이동할 칸에 대한 위치 기억변수
int row, col;
if(found(n, empty_row - 1, empty_col)) {
row = empty_row-1;
col = empty_col;
}
else if(found(n, empty_row + 1, empty_col)) {
row = empty_row+1;
col = empty_col;
}
else if(found(n, empty_row, empty_col - 1)) {
row = empty_row;
col = empty_col-1;
}
else if(found(n, empty_row, empty_col + 1)) {
row = empty_row;
col = empty_col+1;
}
// 사용자가 입력한 보드의 좌표가 움직이지 못할 때의 예외
else {
return false;
}
board[empty_row][empty_col] = board[row][col];
board[row][col] = null;
empty_row = row;
empty_col = col;
return true;
}
private boolean found(int n, int r, int c) {
if (r >= 0 && r <= 3 && c >= 0 && c <= 3) {
// 사용자가 null에 해당하는 보드판의 값을 요구할 때의 예외처리
if (board[r][c] != null) {
return board[r][c].puzzleFace() == n;
}
else {
return false;
}
}
else {
return false;
}
}
}
슬라이드 퍼즐 게임의 보드판을 생성하고,
사용자로부터 입력받아진 퍼즐 위치를 옮긴다.
# ViewOut 클래스
import java.awt.*;
import javax.swing.*;
public class SlidingPuzzleViewOut extends JPanel {
private SlidingPuzzleBoardModel puzzle;
private final int SIZE; // the size of a puzzle piece in pixel
// 생성 메소드
public SlidingPuzzleViewOut(SlidingPuzzleBoardModel p) {
puzzle = p;
SIZE = 30;
JFrame f = new JFrame();
f.getContentPane().add(this);
f.setLocation(550,100);
f.setTitle("Slide Puzzle");
f.setSize(SIZE*6, SIZE*6+28);
f.setVisible(true);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public void paintComponent(Graphics g) {
g.setColor(Color.YELLOW);
g.fillRect(0, 0, SIZE*6, SIZE*6);
SlidingPuzzlePieceModel[][] r = puzzle.board;
for (int i = 0; i < 4; i = i + 1) {
for (int j = 0; j < 4; j = j + 1) {
paintPiece(g, r[i][j], i, j);
}
}
}
private void paintPiece(Graphics g, SlidingPuzzlePieceModel p, int i, int j) {
int x = SIZE + (SIZE * j);
int y = SIZE + (SIZE * i);
if (p != null) {
g.setColor(Color.WHITE);
g.fillRect(x, y, SIZE, SIZE);
g.setColor(Color.BLACK);
g.drawRect(x, y, SIZE, SIZE);
int face_value = p.puzzleFace();
if (face_value < 10)
g.drawString(face_value + "", x+11, y+20);
else
g.drawString(face_value + "", x+7, y+20);
}
else {
g.setColor(Color.BLACK);
g.fillRect(x, y, SIZE, SIZE);
}
}
public void displayPuzzleBoard() {
this.repaint();
}
public void showNoMove(String s) {
JOptionPane.showMessageDialog(null, "Error: " + s );
}
}
Java GUI 창을 구성한다.
슬라이드 퍼즐 게임의 보드판을 그린다.
Java GUI로 퍼즐 게임의 보드판을 그린다.
# Controller 클래스
import javax.swing.JOptionPane;
public class SlidingPuzzleController {
private SlidingPuzzleBoardModel board;
private SlidingPuzzleViewOut viewOut;
// 생성 메소드
public SlidingPuzzleController(SlidingPuzzleBoardModel b, SlidingPuzzleViewOut v) {
board = b;
viewOut = v;
}
public void play() {
while(true) {
viewOut.displayPuzzleBoard();
String input = JOptionPane.showInputDialog("주세요");
int n = Integer.parseInt(input);
// 사용자가 입력한 보드의 좌표에 대한 예외처리
if (! board.move(n)) {
viewOut.showNoMove("안돼");
}
}
}
}
Model 클래스로부터 보드판에 대한 정보와
사용자로부터 입력받은 데이터를 받고,
ViewOut 클래스에게 넘겨줘서 슬라이드 퍼즐 게임이 구현되도록 해준다.
Controller 하는 역할~
# Starter 클래스
public class SlidingPuzzleStarter {
public static void main(String[] args) {
SlidingPuzzleBoardModel b = new SlidingPuzzleBoardModel();
SlidingPuzzleViewOut v = new SlidingPuzzleViewOut(b);
new SlidingPuzzleController(b,v).play();
}
}
Java Application 을 실행하기 위해 필요한 객체를 생성하고,
이를 통제하는 클래스이다.
메인 통제 클래스인 Controller에게 필요한 객체를 생성해서 보낸다.
그럼, 이제 슬라이드 퍼즐 게임의 코드 구현은 끝이다.
실행 결과를 보자!
첫 실행 시
올바른 퍼즐에 대한 값 입력 시
올바르지 않은 퍼즐에 대한 값 입력 시
정상적으로 작동하는 모습을 볼 수 있다!
마치며..
해당 Java Application은 단순하지만,
MVC 아키텍처를 활용한 프로젝트이다.
처음에, 만들 App에 대한 설계를 진행하고,
이를 토대로 MVC 아키텍처를 구성했다.
그리고, MVC 아키텍처 구성을 완료하고 코드로 구현했다.
MVC 아키텍처 설계는 프로젝트 개발에 있어서 중요하고,
좋은 방법 중 하나라고 생각한다.
MVC 아키텍처를 토대로 개발을 위한 규칙이 확립되어
체계적인 프로젝트 관리를 할 수 있기 때문이다.
그렇기에, MVC 아키텍처를 구성을 토대로 개발을 진행할 때는,
구성한 MVC 아키텍처에 대해 이해를 한 후 개발을 진행하면,
체계적인 개발을 진행할 수 있다.
MVC 아키텍처 구성이 완벽한 답은 아니지만, 좋은 개발방법 중에 하나라고 생각한다.
(협업 프로젝트하게되면, 아키텍처 구성이 왜 중요한지 더 많이 깨닫게 될 것이다 ㅎㅎ)
'CS 대학강의' 카테고리의 다른 글
[CS 1-2 | 프로그램 설계 방법론] Java로 병원 입원 관리 서비스 제작 (0) | 2022.10.20 |
---|---|
[CS 1-2 | 프로그램 설계 방법론] Java로 스도쿠 프로그램 제작 (0) | 2022.10.18 |
[CS 1-2 | 오픈소스 SW 기초] 네트워크 통신 | 소켓 통신 5주차 (0) | 2022.10.13 |
[CS 1-2 | 이산수학] 행렬의 연산 10주차 (0) | 2022.10.12 |
[CS 1-2 | 시스템 프로그래밍 기초] 디버깅과 소프트웨어 설계 10주차 (0) | 2022.10.11 |