다운로드
Eclipse Downloads
Becker
여기서 Select Another Mirror
KaKao Corp을 선택하면 비교적 빠른 속도로 다운로드가 된다.
워크스페이스(앞으로 프로젝트 폴더 보관할 곳) 지정해주고 실행
프로젝트 이름은 PlayRobot, JRE 버전은 1.8로 설정
Libraries -> Add External JARs -> becker.jar 선택. becker.jar은 becker.zip 압축풀면 나온다.
왼쪽의 Package Explorer에서 PlayRobot 오른쪽 클릭 -> New -> Class
이름은 RobotAction으로 하자.
RobotAction.java 파일이 만들어지면 이렇게 기본 코드가 자동으로 작성된다.
PlayRobot 오른쪽 클릭 -> Build Path -> Configure Build Path
Library -> Add Library -> JRE System Library
Workspace default JRE -> finish
그 이후 (unbound)라고 써져있는 기존의 JRE를 Remove를 통해 지워주자.
이제 Order and Export 섹션으로 들어가, 오른쪽의 Up, Down를 비롯한 버튼을 적절히 활용해 다음과 같은 순서로 바꿔준다음, Select All를 누르고 Apply and Close 해준다.
이후 첫 번째 줄에 다음과 같은 코드를 넣어주자.
import becker.robots.*;
import는 C언어에서의 #include와 같은 역할을 한다. 외부 라이브러리(미리 정의된 기능들의 집합)인 becker를 불러오는데, 그 중 하위 폴더인 robots 안의 모든 기능(*로 표현한다.)을 불러온다는 의미이다.
이제 main메소드 안에 다음과 같은 코드를 입력해보자.
City mountain = new City();
new Wall(mountain, 3, 2, Direction.WEST);
new Wall(mountain, 2, 3, Direction.WEST);
new Wall(mountain, 1, 3, Direction.WEST);
new Wall(mountain, 1, 3, Direction.EAST);
new Wall(mountain, 2, 4, Direction.EAST);
new Wall(mountain, 3, 4, Direction.EAST);
new Wall(mountain, 3, 2, Direction.NORTH);
new Wall(mountain, 1, 3, Direction.NORTH);
new Wall(mountain, 2, 4, Direction.NORTH);
new Thing(mountain, 3, 1);
Robot karel = new Robot(mountain, 3, 0, Direction.EAST);
그리고 실행해보자. 처음 실행할 때는 PlayRobot 오른쪽 클릭 -> Run As -> Java Application을 선택하자.
과제를 수행하기 위해서는 이 코드를 이해해야 한다.
import becker.robots.*;
public class RobotAction {
public static void main(String[] args) {
City mountain = new City();
new Wall(mountain, 3, 2, Direction.WEST);
new Wall(mountain, 2, 3, Direction.WEST);
new Wall(mountain, 1, 3, Direction.WEST);
new Wall(mountain, 1, 3, Direction.EAST);
new Wall(mountain, 2, 4, Direction.EAST);
new Wall(mountain, 3, 4, Direction.EAST);
new Wall(mountain, 3, 2, Direction.NORTH);
new Wall(mountain, 1, 3, Direction.NORTH);
new Wall(mountain, 2, 4, Direction.NORTH);
new Thing(mountain, 3, 1);
Robot karel = new Robot(mountain, 3, 0, Direction.EAST);
}
}
여기서는 public과 static, class와 객체에 대한 설명은 하지 않겠습니다. 자바에 대해 배우고 싶다면 FORIF로!
City mountain = new City();
미리 정의된 City 클래스의 새로운 객체를 만드는 과정. 쉽게 말해 City라는 개념을 가진 mountain이라는 변수를 만들어낸다.
새로운 Wall 객체를 생성한다. 이 Wall은 다음과 같은 규칙을 가진다.
Wall(City city, int street, int avenue, Direction orientation)
두 번째 줄:
new Wall(mountain, 3, 2, Direction.WEST);
street(동-서를 잇는 거리)은 3, avenue(남-북을 잇는 거리)은 2, 벽이 바라보는 방향은 동쪽이다.
좌표는 길이 아닌 산(초록색 네모)로 계산되며, 맨 왼쪽 위 산을 기준으로 (1,1)로 시작한다. 좌표를 (street, avenue)로 표현할 시 (3,2)는 위 사진과 같은 위치에 존재하게 된다. 위와 같은 규칙으로 벽들을 모두 만들어보자.
new Wall(mountain, 3, 2, Direction.WEST);
new Wall(mountain, 2, 3, Direction.WEST);
new Wall(mountain, 1, 3, Direction.WEST);
...
new Wall(mountain, 2, 4, Direction.NORTH);
Thing은 로봇에 의해 들릴 수 있고 이동될 수 있는 무언가를 의미한다.
Thing 클래스는 다음과 같은 규칙을 가진다.
Thing(City aCity, int aStreet, int anAvenue)
new Thing(mountain, 3, 1);
mountain시티에 street은 3, avenue는 1인 위치로 새로운 Thing을 만든다. 이때 thing은 wall과 달리 걸어다닐 수 있는 길을 기준으로 좌표를 설정해야 한다.
쉽게 말해 왼쪽과 위쪽 숫자보고 좌표 잡으면 된다. 로봇은 이 Thing(깃발)을 주워 산의 정상에 꽂아야 한다.
Robot karel = new Robot(mountain, 3, 0, Direction.EAST);
karel이라는 로봇 객체를 생성한다. karel은 mountain(City)에 있으며, street은 3, avenue는 0이다. 바라보는 방향은 동쪽이다.
이제 우리는 karel을 움직여 깃발(Thing)을 얻은 후, 산의 정상에 꽂고 다시 내려와야 한다.
공식 홈페이지에서 모든 함수들의 정의를 확인할 수 있다.
현재 바라보고 있는 방향으로 다음 교차로(1칸 앞)로 이동한다. 이때 방향은 바뀌지 않는다.
현재 있는 위치에서 Thing을 주우려고(pick up) 시도한다.
왼쪽으로 90도 꺾는다.
위와 같은 함수들을 사용해 필요한 동작들을 수행할 수 있다.
karel.move();
karel.pickThing();
karel.turnLeft();
+karel.move();
(2,1)까지 오는 데에 성공했지만, 여기서 산을 오르기 위해서는 오른쪽으로 돌아야 하는데 Robot 클래스에는 turnRight()함수가 존재하지 않는다.
우리는 킹왕짱 쎈 SuperRobot 클래스를 새로 만들 것이다.
(클래스, 로봇의 이름은 상관없다. 하지만 파일명과 클래스명은 항상 같아야한다.)
RobotAction 클래스를 만들 때처럼 SuperRobot 클래스를 만들어주자.
SuperRobot.java에 다음과 같은 코드를 입력한다.
import becker.robots.*;
public class SuperRobot extends Robot {
public SuperRobot(City aCity, int aStreet, int anAvenue, Direction aDirection) {
super(aCity,aStreet,anAvenue,aDirection);
}
public void turnRight() {
this.turnLeft();
this.turnLeft();
this.turnLeft();
}
}
public class SuperRobot extends Robot
Robot 클래스를 상속(extends)했기에 move, turnleft와 같은 기능들을 모두 사용할 수 있다.
.
public SuperRobot(City aCity, int aStreet, int anAvenue, Direction aDirection) {
super(aCity,aStreet,anAvenue,aDirection);
}
생성자(Constructor)를 만들어준다. 객체를 초기화시켜주는 역할을 한다.
super는 부모 클래스(Robot)로부터 상속받은 변수나 메소드를 자식 메소드(SuperRobot)에서 참조(사용)하는 데 쓰인다.
public void turnRight() {
this.turnLeft();
this.turnLeft();
this.turnLeft();
}
새로운 메소드인 turnRight()를 만들었다. 이 메소드는 3번 왼쪽으로 돌아 오른쪽으로 1번 돌게 한다.
이제 RobotAction으로 가보자.
// RobotActoin.java
Robot karel = new Robot(mountain, 3, 0,Direction.EAST);
기존의 평범한 로봇을 슈퍼로봇으로 바꾸어주자.
// RobotActoin.java
SuperRobot karel = new SuperRobot(mountain, 3, 0,Direction.EAST);
karel은 이제 오른쪽으로 돌 수 있다.
// RobotActoin.java
karel.move();
karel.pickThing();
karel.turnLeft();
karel.move();
karel.turnRight();
karel.move();
산의 정상까지 쭉쭉 올라가보자.
karel.move();
karel.pickThing();
karel.turnLeft();
karel.move();
karel.turnRight();
...
karel.move();
산 정상에 깃발을 꽂기 위해서, putThing()을 사용하면 된다.
karel.putThing();
다시 내려간다.
karel.move();
//이 정도는 할 수 있잖아 여러분을 믿어요!
...
karel.turnLeft();
karel을 시크한 블랙으로 색깔을 바꾸어주고 싶다면
import java.awt.Color;
색깔을 가져올 수 있는 라이브러리를 불러온다.
karel.setColor(Color.black);
깃발 색깔도 바꾸고 싶다면
Thing flag = new Thing(mountain, 3, 1);
flag.setColor(Color.black);
자바를 더 배우고 싶다면 FORIF로!
import java.awt.Color;
import becker.robots.*;
public class RobotAction {
public static void main(String[] args) {
City mountain = new City();
new Wall(mountain, 3, 2, Direction.WEST);
new Wall(mountain, 2, 3, Direction.WEST);
new Wall(mountain, 1, 3, Direction.WEST);
new Wall(mountain, 1, 3, Direction.EAST);
new Wall(mountain, 2, 4, Direction.EAST);
new Wall(mountain, 3, 4, Direction.EAST);
new Wall(mountain, 3, 2, Direction.NORTH);
new Wall(mountain, 1, 3, Direction.NORTH);
new Wall(mountain, 2, 4, Direction.NORTH);
Thing flag = new Thing(mountain, 3, 1);
flag.setColor(Color.black);
SuperRobot karel = new SuperRobot(mountain, 3, 0,Direction.EAST);
karel.setColor(Color.black);
karel.move();
karel.pickThing();
karel.turnLeft();
karel.move();
karel.turnRight();
karel.move();
karel.turnLeft();
karel.move();
karel.move();
karel.turnRight();
karel.move();
karel.putThing();
karel.move();
karel.turnRight();
karel.move();
karel.turnLeft();
karel.move();
karel.turnRight();
karel.move();
karel.move();
karel.turnLeft();
}
}
초기상태
마지막 상태
이 포스팅 보는 정시템 화이팅! 수고하셨습니다.