편집 기록

편집 기록
  • 프로필 편집요청빌런님의 편집
    날짜2020.02.10

    자바, 인터페이스, 다형성, Casting 도와주세요...ㅠㅠ


    이미지

    이미지

    이미지

    package w3;
    
    public interface Measurable {
        double getMeasure();
    }
    
    package w3;
    
    public class Rectangle implements Measurable {
        private double width;
        private double height;
    
        public Rectangle(double width, double height) {
            this.width = width;
            this.height = height;
        }
    
        // 사각형의 크기를 설정
        public void setDimension(double width, double height) {
            this.width = width;
            this.height = height;
    
        }
    
        @Override
        public double getMeasure() {
            return (width * height);
        }
    
        public String toString() {
            return String.format("Rectangle[width=%.1f, height=%.1f]", width, height);
        }
    
    
    }
    
    package w3;
    
    //계좌
    public class BankAccount implements Measurable{
        private double balance; // 인스턴스 필드!
    
        /**
         * 주어진 balance를 가지는 계좌를 개설
         */
        public BankAccount(double initialBalance) {
            balance = initialBalance;
        }
    
        /**
         * 계좌로 돈을 입금함
         */
        public void deposit(double amount) {
            balance += amount;
        }
    
        /**
         * 계좌로 부터 돈을 인출 함
         */
        public void withdraw(double amount) {
            balance -= amount;
        }
    
        /**
         * 현재 잔액을 리턴
         */
        public double getBalance() {
            return balance;
        }
    
        public String toString() {
            return String.format("BankAccount[balance = %.1f]", balance);
        }
    
        @Override
        public double getMeasure() {
            return balance;
        }
    }
    
    package w3;
    
    /**
     * Computers the average of a set of data values.
     */
    public class Dataset {
        private double sum; // 지금까지 측정한 값들의 합.
        private Measurable maximum; // 지금까지 측정한 것들 중 가장 큰 놈.
        private int count; // 지금까지 측정한 갯수.
        private Measurable minimum;
    
        public Dataset() {
            sum = 0;
            count = 0;
            maximum = null;
            minimum = null;
        }
    
        /**
         * 데이터 셋에 데이터 하나를 추가한다.
         * 
         * @param x 데이터 값.
         */
        public void add(Measurable x) {
            sum = sum + x.getMeasure();
            if (count == 0 || maximum.getMeasure() < x.getMeasure())
                maximum = x;
            if (count == 0 || minimum.getMeasure() > x.getMeasure())
                minimum = x;
            count++;
        }
    
        /**
         * Gets the average of the added data.
         * 
         * @return the average or 0 if no data has been added
         */
        public double getAverage() {
            if (count == 0)
                return 0;
            return sum / count;
        }
    
        /**
         * Gets the largest of the added data.
         * 
         * @return the maximum or 0 if no data has been added
         */
        public Measurable getMaximum() {
            return maximum;
        }
    
        public Measurable getMinimum() {
            return minimum;
        }
    }
    
    package w3;
    
    import java.util.*;
    
    public class DataSetTester {
        public static void main(String[] args) {
            DataSetTester dataSetTester = new DataSetTester();
            dataSetTester.test();
        }
        public void test() {
            Random random = new Random();
    
            Dataset dataSet = new Dataset();
    
            for (int i = 0; i < 100; i++) {
                double x = random.nextDouble() * 100;
                double y = random.nextDouble() * 100;
                Rectangle rectangle = new Rectangle(x, y);
                dataSet.add(rectangle);
            }
            Rectangle max = (Rectangle) dataSet.getMaximum();
            System.out.println("면적이 가장 큰 Rectangle: "+max.toString());
            System.out.println(String.format("면적이 가장 큰 Rectangle의 면적: %,.1f", max.getMeasure()));
            System.out.println(dataSet.getMaximum());
            System.out.println(String.format("면적의 평균: %,.1f", dataSet.getAverage()));
            System.out.println();
    
            dataSet= new Dataset();
            for (int i = 0; i < 100; i++) {
                double initBalance = random.nextDouble() * 10000;
                BankAccount bankAccount = new BankAccount(initBalance);
                dataSet.add(bankAccount);
            }
    
            System.out.println("가장 잔액이 많은 계좌: "+dataSet.getMaximum());
    
            System.out.println("가장 잔액이 적은 계좌: "+dataSet.getMinimum());
            System.out.println(String.format("잔액의 평균: %,.1f", dataSet.getAverage()));
        }
    
    }
    
  • 프로필 이정수님의 편집
    날짜2020.02.10

    자바, 인터페이스, 다형성, Casting 도와주세요...ㅠㅠ


    이미지

    이미지

    이미지

    public interface Measurable {
        double getMeasure();
    }
    
    public class Rectangle implements Measurable {
        private double width;
        private double height;
    
        public Rectangle(double width, double height) {
            this.width = width;
            this.height = height;
        }
    
        // 사각형의 크기를 설정
        public void setDimension(double width, double height) {
            this.width = width;
            this.height = height;
    
        }
    
        @Override
        public double getMeasure() {
            return (width * height);
        }
    
        public String toString() {
            return String.format("Rectangle[width=%.1f, height=%.1f]", width, height);
        }
    
    
    }
    
    public class BankAccount implements Measurable{
        private double balance; 
    
        /**
         * 주어진 balance를 가지는 계좌를 개설
         */
        public BankAccount(double initialBalance) {
            balance = initialBalance;
        }
    
        /**
         * 계좌로 돈을 입금함
         */
        public void deposit(double amount) {
            balance += amount;
        }
    
        /**
         * 계좌로 부터 돈을 인출 함
         */
        public void withdraw(double amount) {
            balance -= amount;
        }
    
        /**
         * 현재 잔액을 리턴
         */
        public double getBalance() {
            return balance;
        }
    
        public String toString() {
            return String.format("BankAccount[balance = %.1f]", balance);
        }
    
        @Override
        public double getMeasure() {
            return balance;
        }
    }
    
    
    package w3;
    
    /**
     * Computers the average of a set of data values.
     */
    public class Dataset {
        private double sum; // 지금까지 측정한 값들의 합.
        private Measurable maximum; // 지금까지 측정한 것들 중 가장 큰 놈.
        private int count; // 지금까지 측정한 갯수.
        private Measurable minimum;
    
        public Dataset() {
            sum = 0;
            count = 0;
            maximum = null;
            minimum = null;
        }
    
        /**
         * 데이터 셋에 데이터 하나를 추가한다.
         * 
         * @param x 데이터 값.
         */
        public void add(Measurable x) {
            sum = sum + x.getMeasure();
            if (count == 0 || maximum.getMeasure() < x.getMeasure())
                maximum = x;
            if (count == 0 || minimum.getMeasure() > x.getMeasure())
                minimum = x;
            count++;
        }
    
        /**
         * Gets the average of the added data.
         * 
         * @return the average or 0 if no data has been added
         */
        public double getAverage() {
            if (count == 0)
                return 0;
            return sum / count;
        }
    
        /**
         * Gets the largest of the added data.
         * 
         * @return the maximum or 0 if no data has been added
         */
        public Measurable getMaximum() {
            return maximum;
        }
    
        public Measurable getMinimum() {
            return minimum;
        }
    }
    
    
    package w3;
    
    import java.util.*;
    
    public class DataSetTester {
        public static void main(String[] args) {
            DataSetTester dataSetTester = new DataSetTester();
            dataSetTester.test();
        }
        public void test() {
            Random random = new Random();
    
            Dataset dataSet = new Dataset();
    
            for (int i = 0; i < 100; i++) {
                double x = random.nextDouble() * 100;
                double y = random.nextDouble() * 100;
                Rectangle rectangle = new Rectangle(x, y);
                dataSet.add(rectangle);
            }
            Rectangle max = (Rectangle) dataSet.getMaximum();
            System.out.println("면적이 가장 큰 Rectangle: "+max.toString());
            System.out.println(String.format("면적이 가장 큰 Rectangle의 면적: %,.1f", max.getMeasure()));
            System.out.println(String.format("면적의 평균: %,.1f", dataSet.getAverage()));
            System.out.println();
    
            dataSet= new Dataset();
            for (int i = 0; i < 100; i++) {
                double initBalance = random.nextDouble() * 10000;
                BankAccount bankAccount = new BankAccount(initBalance);
                dataSet.add(bankAccount);
            }
    
            System.out.println("가장 잔액이 많은 계좌: "+dataSet.getMaximum());
    
            System.out.println("가장 잔액이 적은 계좌: "+dataSet.getMinimum());
            System.out.println(String.format("잔액의 평균: %,.1f", dataSet.getAverage()));
        }
    
    }
    
    

    위에 마크업한 부분을 보시면 Measurable 인터페이스 1개, 구현 클래스 2개(Rectangle, BankAccount), 일반적인 클래스1개(DataSet), 실행클래스1개(DataSetTester) 총 5개가 있습니다.

    질문1. 맨위 이미지 2.3번문제 하단을 보시면 컴파일 한 결과값이 나와있습니다. 면적이 가장 큰 Rectnagle을 제외한, 면적이 가장 큰 Rectangle의 면적, 면적의 평균은 DataSetTester실행클래스에서 보시면

    Rectangle max = (Rectangle) dataSet.getMaximum();
    

    와 같이 강제 형변환 시켜준 후

     System.out.println(String.format("면적이 가장 큰 Rectangle의 면적: %,.1f", max.getMeasure()));
     System.out.println(String.format("면적의 평균: %,.1f", dataSet.getAverage()));
    

    이렇게 가 아닌 형변환 없이

     System.out.println(dataSet.getMaximum());
    

    하면 DataSet클래스의 getMaximum()메소드 리턴값의 타입이 Measurable 인데 Rectangle 클래스가 구현해주고 있으므로 getMeasurable 메소드 리턴값이 widht*height값이 리턴될줄 알았는데 호출하지도 않은 toString메소드

    Rectangle[width=88.4, height=85.8]
    

    값이 나와 버립니다. 여기서 제 뇌피셜로 toString메소드가 Object클래스의 메소드인데 모든 클래스의 근원은 Object클래스이므로 인터페이스의 추상메소드보다 우선순위가 높아서 먼저 실행된게 아닌가 하는데 맞나요?

    질문2. 위 이미지를 보시면 3번 문제가 2번 문제의 연장선임을 알 수 있습니다. 그런데 BankAccount 클래스는 Rectangle클래스와 다르게 형변환없이 바로 dataSet.getMaximum(), dataSet.getMinimum() 과 같이 호출해 버립니다. 그래서 둘의 차이점의 뭔지 알고 싶습니다.