2016년 4월 4일 월요일

Java 4/5 - 5장 상속(계속)

5장 상속(계속)

이전 시간 실습

http://jylecture.blogspot.kr/2016/04/java-44-5.html

누군가의 실습 내용:

https://github.com/amdjd/JavaExercise/blob/110d54c2e5d0ccbe184ee9a57bef1ddcf4b11e41/src/classes/Lake.java

moveFish() 함수

    public void moveFish() {
        for (int i = 0; i < fish.length; i += 2) {
            fish[i].move(width, height);
        }
        for (int i = 1; i < fish.length; i += 2) {
            fish[i].move2(width, height);
        }
    }

상속을 이용해서 바꿔보기

https://github.com/jyheo/JavaExercise/blob/master/src/classes/Lake10.java

class FoolFish extends Fish { // 상속
    FoolFish(String name, String shape) {
        super(name, shape); // 부모 클래스의 생성자를 부름, super는 부모 클래스를 가리킴
    }

    public void move(int width, int height) { // 메소드 오버라이딩(overriding), 원래 메소드는?
        x++; // Fish의 x, y가 private int였다고 지금은 protected int로 바뀌어 있음. 왜?
        y++;
        if (x >= width)
            x = 0;
        if (y >= height)
            y = 0;
    }
}

public class Lake10 {
    private int width;
    private int height;
    private Fish[] fishes;

    public Lake10(int width, int height) {
        this.width = width;
        this.height = height;
        fishes = new Fish[10];
        for (int i = 0; i < fishes.length; i++) {
            if (i % 2 == 0)
                fishes[i] = new Fish("Even", "<#--<");
            else
                fishes[i] = new FoolFish("Odd", "<$--<"); // Fish 레퍼런스가 FoolFish를 가리킨다?
                                                          // 업 캐스팅(upcasting)
        }
    }

    public void moveFish() {
        for (Fish f : fishes)         //  f가 Fish 객체일 때도 있고, FoolFish일 때도 있는데,
            f.move(width, height);    //  move()는 누구의 move()가 불리는가?
    }                                 //  동적 바인딩(dynamic binding)