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.객체지향 개념과 자바 ¶
가.객체지향개념
상태:객체가 가지고 있는 속성 또는 특성
행동:객체가 가지고 있는 기능 또는 할 수 있는 행동
예) 자동차 - 객체
상태 -> 변수
행동 -> 메소드(함수)
상태:객체가 가지고 있는 속성 또는 특성
행동:객체가 가지고 있는 기능 또는 할 수 있는 행동
예) 자동차 - 객체
색,바퀴,핸들,배기량,속도,기어 - 상태
달린다,기어를 바꾼다,속도를 높이거나 낮춘다, 경적을 울린다 - 행동
실세계 객체 -> 소프트웨어 객체달린다,기어를 바꾼다,속도를 높이거나 낮춘다, 경적을 울린다 - 행동
상태 -> 변수
행동 -> 메소드(함수)
객체지향방법의 특징
클래스 정의
public:같은 클래스, 하위클래스, 같은 패키지내에 있는 클래스에서 접근가능
private:같은 클래스에서만 접근가능
protected:같은 클래스, 하위클래스, 같은 패키지내에 있는 클래스에서 접근가능
friendly(생략):같은 클래스, 같은 패키지내에 있는 클래스에서 접근 가능
캡슐화(Encapsulation):
변수와 메소드를 하나의 소프트웨어 묶음으로 만든다.
캡슐화는 모듈성(modularity)과 정보은닉(information hiding)을 제공한다.
모듈성은 각각의 객체를 위한 소스코드가 서로 무관하게 유지될 수 있다는 것이다.
정보은닉은 객체가 가지는 정보에 접근 권한을 주어 다른 객체로 부터의 접근을 제한할 수 있다.
메시지(Message):
객체와 객체가 통신을 하는데 이용된다.
메시지를 받을 객체, 수행을 요청한 메소드의 이름, 메소드에 의해 필요한 매개변수 등 세가지 구성요소를 가진다.
클래스(Class):(벽돌틀)
특정 종류의 객체들에 대해 일반적으로 적용할 수 있는 변수와 메소드를 정의하고 있다.
인스턴스(Instance):(찍어낸 벽돌)
클래스를 실제로 사용할 수 있도록 선언하는 것
객체(Object)
상속(Inheritance)
상위클래스가 가지고 있는 특성들을 하위클래스에서 사용할 수 있다.
다형성(Polymorphism)
여러개의 클래스가 같은 메시지에 대해서 각자의 방법으로 작용할 수 있는 능력이다.
연산자 다중 정의(overloading),함수 다중 정의,함수 재정의(overriding)등이 있다.
나.클래스정의 및 인스턴스(객체) 생성변수와 메소드를 하나의 소프트웨어 묶음으로 만든다.
캡슐화는 모듈성(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페이지 이내로 줄어보세요.