| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 클래스 class
- 국비지원교육
- View
- #패스트캠퍼스 #국비지원교육 #메가바이트스쿨 #MegabyteSchool #개발자취업부트캠프 #내일배움카드
- MVC 패턴
- 패스트캠퍼스
- tomcat
- #javaStudy
- MVC
- Algorism study
- 게시판 리뷰 만들기
- 클래스 상속
- 게시판 만들기
- Sts
- github
- side project
- crud
- Interface
- GIT
- Entity
- 메가바이트스쿨
- array
- 내일배움카드
- spring boot
- 개발자취업부트캠프
- MegabyteSchool
- Java
- Spring
- group study
- AWS
- Today
- Total
tuter77
Java : 인터페이스(2) 본문
● 인터페이스
▷ 실습
책 선반 클래스 만들어서 책넣기, 빼기 기능 구현.
먼저 Shelf라는 상위 클래스를 만들어 필요한 객체와 기능을 구현한다.
package ch15;
import java.util.ArrayList;
public class Shelf {
protected ArrayList<String> shelf;
// 위에서 생성자를 써도 되지만 public인 아래의 멤버변수로 생성자를 써주는게 낫다.
public Shelf() {
shelf = new ArrayList<>(); //string 안써도됨.
}
public ArrayList<String> getShelf(){
return shelf;
}
public int getCount() {
return shelf.size();
}
}
이 클래스는 상속받아야하기에 protected로 String을 매개로 받는 ArrayList > shelf객체를 생성하고 해당 객체는 아래에 pubic 생성자로 초기화한다.
생성된 객체는 아래의 getShelf로 저장된 값을 가져올 수 있고, getCount 메서드로 들어있는 책이 몇권인지 확인할 수 있다.
getCount() 메서드에서는 ArrayList의 size() 메서드로 저장된 값의 크기를 반환한다.
다음 Queue라는 인터페이스를 생성해 필요한 메서드를 정의한다.
package ch15;
public interface Queue {
void enQueue(String title);
String deQueue();
int getSize();
}
이 인터페이스에서 제목을 매개변수로 받아 책을 저장하는 enQueue()와 책을 빼내는 deQueue(), 그리고 책이 몇권들었는지 int값을 반환해주는 getSize()를 명시해놓는다.
이후 BookShelf 클래스를 만들어 이미 만들어둔 Shelf클래스를 상속하고, 인터페이스를 implements한다.
package ch15;
public class BookShelf extends Shelf implements Queue{
@Override
public void enQueue(String title) {
shelf.add(title);
}
@Override
public String deQueue() {
return shelf.remove(0);
}
@Override
public int getSize() {
return getCount(); //getCount가 상위클래스에 구현되어있기때문에
}
}
이때 인터페이스에서 정의된 메서드들을 오버라이딩하는데, enQueue()는 ArrayList의 add기능을 활용하여 책 제목을 저장하는 기능을 가진다.
다음 deQueue()는 ArrayList의 remove기능을 활용해 인덱스값이 0번째인 데이터(책제목)를 반환하고 해당 데이터를 삭제한다.
마지막으로 getSize()는 상위클래스에서 정의해놓은 getCount() 메서드를 반환해 책이 몇권들었는지 알려준다.
테스트클래스.
package ch15;
public class BookShelfTest {
public static void main(String[] args) {
Queue bookQueue = new BookShelf();
bookQueue.enQueue("토지1");
bookQueue.enQueue("토지2");
bookQueue.enQueue("토지3");
bookQueue.enQueue("토지4");
bookQueue.enQueue("토지5");
System.out.println(bookQueue.getSize());
System.out.println(bookQueue.deQueue());//호출될때마다 한권씩 제거됨.
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.deQueue());
System.out.println(bookQueue.getSize());
}
}
테스트클래스에서 인스턴스를 생성하고, 해당 인스턴스에 5권의 책제목을 저장한다.
이후 몇권이 들어있는지 확인한 뒤, 책을 한권한권 꺼내며 인스턴스에서 지워준다.
결과창.

5권의 책을 모두 꺼내서 0권이 된 것을 볼 수 있다.
● 실습.
▷ gameLevel
Player가 있고, Player는 GameLevel속성을 가진다.각 GameLevel 단계마다 run(), jump(), turn() 세가지 기능이 업그레이드 된다.초보자 레벨 : 천천히 달립니다.(run() 만 가능)
중급자 레벨 : 빠르게 달리고, 점프할 수 있습니다.(run(), jump() 가능)
고급자 레벨 : 매우 빠르게 달리고, 높게 점프하며, 턴 할 수 있습니다.(run(), jump(), turn() 가능)
player는 한번에 하나의 레벨 상태만을 가질 수 있다.player가 play()중에 레벨에 있는 go(int count)라는 메서드를 호출하면 run()하고 count횟수만큼 jump()하며, turn()한다.아래 클래스 다이어그램을 참고해 각 레벨에서 go()가 호출될 때 아래와 같이 출력되도록 해야한다.


먼저 중심이되는 PlayerLevel클래스를 추상클래스로 구현한다.
package ch16.gameLevel;
public abstract class PlayerLevel {
public abstract void run();
public abstract void jump();
public abstract void turn();
public abstract void showLevelMessage();
final public void go(int count) {
run();
for(int i=0; i<count; i++) {
jump();
}
turn();
}
}
run(), jump(), turn(), showLevelMessage() 메서드를 정의하고 아래에 시나리오를 담고있는 go()메서드를 정의한다.
jump()메서드는 count의 숫자만큼 반복하기때문에 for문을 이용한다.
각 메서드는 여기서 불리는 것이아니라, Player클래스에서 다른 메서드로 호출할 것이다.
다음은 객체 생성의 중심이 될 Player 클래스를 만든다.
package ch16.gameLevel;
public class Player{
private PlayerLevel level;
public Player() {
level = new BeginnerLevel();
level.showLevelMessage();
}
public PlayerLevel getLevel() {
return level;
}
public void upgradeLevel(PlayerLevel level) {
this.level = level;
level.showLevelMessage();
}
public void play(int count) {
level.go(count);
}
}
여기서 좀 헤맸는데, 인터페이스나 추상클래스로 선언을 해야할지 그냥 클래스로 만들어야할지 몰라서 다 시도해보다 일반클래스로 만들었다.
결국에 기능구현이 되어있어야하기 때문에 일반 클래스로 만들게 되었다.
PlayerLevel 클래스의 객체를 하나 생성하여 각 메서드 내에서 PlayerLevel의 메서드들을 호출할 수 있도록했다.
Player() 메서드에서 level객체를 PlayerLevel을 상속하는 BegunnerLevel()의 인스턴스로 지정한다. (시작할때는 무조건 비기너)
그리고 PlayerLevel의 showLevelMessage()메서드를 이용해 레벨을 한번 출력해준다.
getLevel은 현재의 레벨을 반환해준다.
upgradeLevel()은 파라미터로 PlayerLevel 타입의 level 변수를 매개변수로 받는다. 해당 매개변수의 showLevelMessage()메서드를 호출한다.
이는 level 변수를 바꿀 때마다 호출할 것이다.
play()는 메인 기능으로 level변수의 go기능을 호출하게 된다.
test에서 Player안의 기능만 사용하여 PlayerLevel의 기능들을 호출하게끔 구성했다.
다음으로 각 레벨의 클래스를 정의한다.
package ch16.gameLevel;
public class BeginnerLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("천천히 달립니다.");
}
@Override
public void jump() {
System.out.println("jump 못하지롱");
}
@Override
public void turn() {
System.out.println("turn 못하지롱");
}
@Override
public void showLevelMessage() {
System.out.println("****** 초급자 레벨입니다. ******");
}
}
package ch16.gameLevel;
public class AdvancedLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("빨리 달립니다.");
}
@Override
public void jump() {
System.out.println("높이 jump 합니다.");
}
@Override
public void turn() {
System.out.println("turn 못하지롱");
}
@Override
public void showLevelMessage() {
System.out.println("****** 중급자 레벨입니다. ******");
}
}
package ch16.gameLevel;
public class SuperLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("엄청 빠르게 달립니다.");
}
@Override
public void jump() {
System.out.println("아주 높이 jump 합니다.");
}
@Override
public void turn() {
System.out.println("turn 합니다.");
}
@Override
public void showLevelMessage() {
System.out.println("****** 고급자 레벨입니다. ******");
}
}
위의 세 코드를 보면, 모두 extends 키워드로 PlayerLevel 추상 클래스를 상속하고 있고 해당 메서드들을 각 타입에 맞게 재정의하고 있다.
이제 테스트 해보면 된다.
package ch16.gameLevel;
public class LevelTest {
public static void main(String[] args) {
Player player1 = new Player();
player1.play(1);
AdvancedLevel aLevel = new AdvancedLevel();
player1.upgradeLevel(aLevel);
player1.play(2);
SuperLevel sLevel = new SuperLevel();
player1.upgradeLevel(sLevel);
player1.play(3);
}
}
생성자를 만들어 Player타입의 Player 클래스의 player1이라는 인스턴스를 생성하는데 아무것도 없이 이렇게 생성하면 기초값은 BeginnerLevel로 지정되어 있기때문에 이는 비기너 레벨을 가진 플레이어가 된다.
play메서드를 호출해서 파라미터에 1만큼 count를 주었기에 jump메서드가 1회 반복될 것이다.
이후 AdvancedLevel 타입으로 aLevel이라는 인스턴스를 생성해 upgradeLevel에 넣어주면 player1 인스턴스는 AdvancedLevel 타입의 메서드들을 호출하게된다.
같은 방식으로 SuperLevel까지 작성한뒤 결과를 돌려주면 아래와 같다.

위의 결과창을 보면 count 만큼 jump가 반복되었고 각 타입에 맞게 메서드가 호출되었음을 확인할 수 있다.
위 내용은 2023.01.16에 공부한 내용입니다.
'JavaStudy' 카테고리의 다른 글
| Java : java의 여러 클래스 (0) | 2023.01.29 |
|---|---|
| Java : 인터페이스 요소, 상속 (0) | 2023.01.29 |
| Java : 다형성 구현(DAO) (0) | 2023.01.29 |
| Java : 예외 처리 (0) | 2023.01.29 |
| Java : 다운 캐스팅, instanceOf (0) | 2023.01.29 |