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페�지 �내로 줄어보세요.










