U E D R , A S I H C RSS

Java Study2003/두번째과제/곽세환

ToyProblems 를 자바로

Board.java

~cpp 
import javax.swing.JOptionPane;

public class Board {
	private int array[][]; //판의 배열
	private int max_x;	   //판의 가로크기
	private int max_y;	   //판의 세로크기
	
	//판을 생성
	public Board(int x, int y) {
		max_x = x;
		max_y = y;
		array = new int[max_y][max_x];
		for (int i = 0; i < max_y; i++)
			for (int j = 0; j < max_x; j++)
				array[i][j] = 0;
	}
	
	//발자국이 가득 채워졌니?
	public boolean IsStepFull() {
		for (int i = 0; i < max_y; i++)
			for (int j = 0; j < max_x; j++)
				if (array[i][j] == 0)
					return false;
		return true;
	}
	
	//주어진 위치가 벽이니?
	public boolean IsPostionWall(int x, int y) {
		if (x == -1 || x == max_x || y == -1 || y == max_y)
			return true;
		else
			return false;
		
	}
	
	//발자국을 찍는다
	public void PutStep(int x, int y) {
		array[y][x]++;
		
		//아래주석표시를 지우면 발자국을 찍을때마다 보여줌
		//ShowStep();
	}
	
	//발자국을 보여준다
	public void ShowStep() {
		String output = "";
		for (int i = 0; i < max_y; i++)
		{
			for (int j = 0; j < max_x; j++)
				output += array[i][j] + "    ";
			output += '\n';
		}
		JOptionPane.showMessageDialog(null, output);
	}
}

Roach.java

~cpp 
public class Roach {
	private int p_x; // 바퀴의 현재 x 위치
	private int p_y; // 바퀴의 현재 y 위치

	//바퀴의 이동
	public void Move(Board bo, int x, int y) {
		p_x = x;
		p_y = y;
		bo.PutStep(p_x, p_y);		

		while (!bo.IsStepFull()) {
			int c_x; // 바퀴가 이동할 x 위치	
			int c_y; // 바퀴가 이동할 y 위치
			do
			{
				c_x = p_x; 
				c_y = p_y; 			 
				int dir = (int)(Math.random() * 8);
				switch (dir)
				{
					case 0: 
							c_y--; 
							break; 
					case 1: 
							c_x++; 
							c_y--; 
							break; 
					case 2: 
							c_x++; 
							break; 
					case 3: 
							c_x++; 
							c_y++; 
							break; 						
					case 4: 
							c_y++; 
							break; 
					case 5: 
							c_x--; 
							c_y++; 
							break; 						
					case 6: 
							c_x--; 
							break; 						
					case 7: 
							c_x--; 
							c_y--; 
							break; 
				}
			} while (!SeeNextPos(bo, c_x, c_y));
			p_x = c_x;
			p_y = c_y;
			bo.PutStep(p_x, p_y);
		}
	}
	
	//이동할 자리를 살핀다
	//벽이면 false 벽이 아니면 true
	public boolean SeeNextPos(Board bo, int x, int y) {
		if (bo.IsPostionWall(x, y))
			return false;
		else
			return true;
	}
}

Human.java

~cpp 
import javax.swing.JOptionPane;

public class Human {
	// 바퀴를 놓는다
	public void PutRoach (Roach ro, Board bo, int x, int y) {
		ro.Move(bo, x, y);
	}
	
	// KillRoach를 어떻게 사용할까???
	public void KillRoach (Roach ro) {
		//생명을 보호합시다 ^^
	}
	
	// 판을 본다
	public void SeeBoard (Board bo) {
		bo.ShowStep();
	}
	
	public static void main(String[] args) {
		int start_x, start_y; // 바퀴의 시작위치 받을 변
		int board_x, board_y; // 판의 크기 받을 변
		Human sehwan = new Human();
		Roach roach = new Roach();
		
		board_x = Integer.parseInt(JOptionPane.showInputDialog(null, "격자의 가로크기"));
		board_y = Integer.parseInt(JOptionPane.showInputDialog(null, "격자의 세로크기"));
		start_x = Integer.parseInt(JOptionPane.showInputDialog(null, "바퀴의 가로위치"));
		start_y = Integer.parseInt(JOptionPane.showInputDialog(null, "바퀴의 세로위치"));
		// 시작위치 맨왼쪽위가 (0,0)
								
		Board board = new Board(board_x, board_y);
		
		sehwan.PutRoach(roach, board, start_x, start_y); // 바퀴를 놓는다
		sehwan.SeeBoard(board); 						 // 다 돌면 판을 본다

	}
}

내용요약

1.객체지향 개념과 자바

가.객체지향개념
상태:객체가 가지고 있는 속성 또는 특성
행동:객체가 가지고 있는 기능 또는 할 있는 행동
예) 자동차 - 객체
색,바퀴,핸들,배기량,속도,기어 - 상태
달린다,기어를 바꾼다,속도를 높이거나 낮춘다, 경적을 울린다 - 행동

실세계 객체 -> 소프트웨어 객체
상태 -> 변
행동 -> 메소드(함)

객체지향방법의 특징
캡슐화(Encapsulation):
와 메소드를 하나의 소프트웨어 묶음으로 만든다.
캡슐화는 모듈성(modularity)과 정보은닉(information hiding)을 제공한다.
모듈성은 각각의 객체를 위한 소스코드가 서로 무관하게 유지될 있다는 것이다.
정보은닉은 객체가 가지는 정보에 접근 권한을 주어 다른 객체로 부터의 접근을 제한할 있다.
메시지(Message):
객체와 객체가 통신을 하는데 이용된다.
메시지를 받을 객체, 행을 요청한 메소드의 이름, 메소드에 의해 필요한 매개변 등 세가지 구성요소를 가진다.
클래스(Class):(벽돌틀)
특정 종류의 객체들에 대해 일반적으로 적용할 있는 변와 메소드를 정의하고 있다.
인스턴스(Instance):(찍어낸 벽돌)
클래스를 실제로 사용할 있도록 선언하는 것
객체(Object)
상속(Inheritance)
상위클래스가 가지고 있는 특성들을 하위클래스에서 사용할 있다.
다형성(Polymorphism)
여러개의 클래스가 같은 메시지에 대해서 각자의 방법으로 작용할 있는 능력이다.
연산자 다중 정의(overloading),함 다중 정의,함 재정의(overriding)등이 있다.

나.클래스정의 및 인스턴스(객체) 생성
클래스 정의
~cpp 
class 클래스이름 {

   // 변 선언부

      …

   // 메소드 선언부

      …

}
인스턴스 생성
~cpp 
클래스이름 클래스인스턴스이름 = new 클래스이름();

또는

클래스이름 클래스인스턴스이름;

클래스인스턴스이름 = new 클래스이름();
다.변 및 메소드의 접근제어
public:같은 클래스, 하위클래스, 같은 패키지내에 있는 클래스에서 접근가능
private:같은 클래스에서만 접근가능
protected:같은 클래스, 하위클래스, 같은 패키지내에 있는 클래스에서 접근가능
friendly(생략):같은 클래스, 같은 패키지내에 있는 클래스에서 접근 가능

라.메소드의 다중정의
다중정의:같은 이름의 함가 여러개 존재하는 것
연산자다중정의:같은 이름의 연산자가 클래스에 따라 다른 연산을 행할 있도록 하는 것
->자바에서 제공하지 않음

2.객체 생성자와 객체 생성 과정

가.객체생성자
~cpp 
클래스이름(형식매개변 리스트) { … }

클래스이름(형식매개변 리스트) {

다른 객체 생성자 호출; // 반드시 첫번째 줄에서 이루어져야 함.

 …

}

클래스이름 변이름 = new 클래스이름(실매개변 리스트);
나.this
다.클래스멤버와 인스턴스 멤버
클래스 변와 클래스 메소드의 선언)
~cpp 
[접근권한] static 변 선언;

[접근권한] static 메소드 선언;

클래스 변와 클래스 메소드의 접근)

클래스이름.클래스메소드()

클래스메소드()

객체참조값.클래스메소드()

라. 클래스 초기화 및 객체의 생성 과정
클래스 변의 초기화 및 초기화 블록
~cpp 
static 변선언=초기값;

또는

static 배열형변선언=new 배열형;

static {

여러 개의 변들의 초기화

또는

배열의 초기화;

}

3.상속

... 계속 읽는중 ...

OOP의 특성

캡슐화, 메시지, 클래스, 인스턴스, 객체, 상속, 다형성
위에 간단하게 설명이 있습니다

질문

  • 인스턴스와 객체가 비슷한 의미인것 같은데 차이는?
    차이는 없습니다. 같은 의미입니다^^;
  • public과 protected의 차이는?
    아직 상속을 읽고 있는 중이기 때문에 모르는 것이지요^^. private 과 protected 는 상속이 이루어지지 않으면 똑같이 사용이 됩니다. 하지만 상속이 이루어진다면 의미는 틀려지죠. 만약 자동차 라는 객체가 있다고 봅시다. 그런데 이것은 굉장히 추상적인 개념이지요. 이 자동차 의 하위 개념인 트럭버스승용차자동차에서 상속받아 만들었다고 합시다. 그랬을 때 자동차 가 가지는 어떠한 상태는 트럭버스승용차도 역시 가지고 있을 도 있습니다. 이런 경우 protected 로 선언해 주면 그 상태를 상속받을 있다는 것이지요. 하지만 외부에서 접근은 불가능하다는 사실은 변함이 없습니다. 하지만 public 은 외부에서 접근이 가능하게 되는 것이지요. 한번 직접 코드로 만들어보세요. 어떻게 다른지 채험하는게 가장 이해가 쉬울겁니다.

과제 추가 내용

  • 와우~ 벌써 저정도로 설계가 가능하다니 놀라운데요? ^^; 정말 실력이 뛰어난거 아님 어디서 참고를 했을 가능성이 있겠군요. 직접 하셨나요? 아니면 다른 소스를 참고하셨나요?
  • 이 소스를 이렇게 바꿔보세요. 가는 방향을 입력받아 움직임 -> 바퀴벌래 두마리를 올려놓음 -> 바퀴벌래를 장기에서 차가 가는 방법으로 바꿈.
  • 자바에서 메소드는 처음 시작할 때 소문자입니다. 대문자로 시작하는 것은 클래스이지요.
  • 내용을 1페이지 이내로 줄어보세요.


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:31
Processing time 0.0170 sec