본문 바로가기
It Study/POWER JAVA(기본서)

POWER JAVA 7장 프로그래밍 1번 문제 ~ 8번 문제

by prlkt5200 2022. 10. 23.
반응형

안녕하세요! 드디어 7장 프로그래밍 문제까지 오게 되었습니다. 아직도 갈 길은 멀지만 차근차근히 해나갈 예정입니다!

6장 프로그래밍 문제는 개인적으로 풀기는 했지만 기록으로 남기면 시간이 오래 걸릴 것 같기에 그냥 스킵하고 넘어가겠습니다. 혹시라도 궁금하신 분은 구글에 코딩못하는컴공님 블로그 있으니 참고하셔도 괜찮을 것 같습니다.

 

그럼 바로 문제 들어가겠습니다. (7장 프로그래밍 문제는 더욱 구체적이고 세밀하게 짤 수 있지만, 그저 핵심 기능만 테스트 해본다는 생각으로 간단히 했습니다. 이것을 수정해서 문제를 풀어보실 분들은 참고하시면 되겠습니다.)

 


 

1번 문제

 

perimeter가 둘레를 의미하는 것이기에 이 메소드를 원둘레를 구하는 메소드로 오버라이드 한 뒤,

area를 통해 그 값을 반환하는 메소드를 간단하게 짜봤습니다.

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
package test;
 
interface getInfo {
    public double perimeter();
 
    public double area();
}
 
public class Circle implements getInfo {
    double radius;
    double perimeter;
 
    Circle(double radius) {
        this.radius = radius;
    }
 
    @Override
    // 원 둘레 공식을 적용해서 구했다.
    public double perimeter() {
        perimeter = 2 * 3.14 * this.radius;
        return perimeter;
    }
 
    @Override
    public double area() {
        double area = perimeter;
        return area;
    }
 
}
cs

 

2번 문제

 

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
32
33
34
35
36
package test;
 
interface Animal{
    void walk();
    void fly();
    void sing();
}
 
 
public class Bird implements Animal  {
    @Override
    public void walk() {
        System.out.println("걸을 수 있음");
    }
    @Override
    public void fly() {
        System.out.println("날 수 있음");
    }
    @Override
    public void sing() {
        System.out.println("노래 할 수 있음");
    }
    
    
    public static void main(String[] args) {
 
    Bird bird = new Bird();
    System.out.println("bird는 ");
    bird.walk();
    bird.fly();
    bird.sing();
        
    }
 
}
 
cs

 

3번 문제

 

이 문제는 인터페이스의 다중 상속을 지원하는 것이기에, 2번 문제를 재활용 하였다.

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
32
33
34
35
36
37
38
39
40
41
42
package test;
 
interface Animal{
    void walk();
    void fly();
    void sing();
}
 
interface Drawable{
    void draw();
}
 
public class Duck implements Animal, Drawable {
    @Override
    public void walk() {
        System.out.println("걸을 수 있음");
    }
    @Override
    public void fly() {
        System.out.println("날 수 있음");
    }
    @Override
    public void sing() {
        System.out.println("노래 할 수 있음");
    }
    @Override
    public void draw() {
        System.out.println("그릴 수 있음");
    }
    
    
    public static void main(String[] args) {
 
    Duck duck = new Duck();
    System.out.println("bird는 ");
    duck.walk();
    duck.fly();
    duck.sing();
        
    }
 
}
cs

 

 

4번 문제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package test;
 
public interface Controllable {
    boolean play();
 
    boolean stop();
 
    class VideoPlayer implements Controllable {
 
        boolean answer;
 
        public boolean play() {
            return this.answer = true;
        }
 
        public boolean stop() {
            return this.answer = false;
        }
 
        public void display() {
            System.out.println("현재 플레이어는 비디오 플레이 중입니까?? " + answer);
        }
    }
 
cs

 

5번 문제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package test;
 
interface Animal {
    void bark();
}
 
public class Test1 {
    public static void main(String[] args) {
        Animal dog = new Animal() {
            public void bark() {
                System.out.println("멍멍");
            }
        };
        dog.bark();
        
    }
 
}
 
cs

 

6번 문제

 

인터페이스와 클래스를 먼저 구현하고, 다른 Test 클래스에 메인 메소드에서 실험을 마저 하였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package test;
 
public interface Movable {
    void move(int dx, int dy);
}
 
class Circle implements Movable {
    public void move(int dx, int dy) {
        System.out.println("(" + dx + "," + dy + ")");
    }
}
 
class Rectangle implements Movable {
    public void move(int dx, int dy) {
        System.out.println("(" + dx + "," + dy + ")");
    }
}
 
cs

동작은 잘되었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package test;
 
public class Test {
 
    public static void main(String[] args) {
        Movable[] list = new Movable[2];
        list[0= new Circle();
        list[1= new Rectangle();
        list[0].move(11);
        list[1].move(23);
 
    }
 
}
 
cs

 

7번 문제

 

이 문제를 시작하기에 앞서 간단하게 iterator를 설명하는 게 좋을 것 같아 간략히 설명하고 넘어가겠습니다.

iterator는 ArrayList, Queue 같은 컬렉션 프레임워크(데이터를 효율적으로 다루기 자료구조 or 방법이 있는 클래스)에서

값을 가져오거나 할 때 사용하는 java에서 제공하는 인터페이스라고 생각하시면 됩니다.

 

사용방법은 컬렉션 프레임 워크 생성 후, iterator<타입> 변수명 = 컬렉션 프레임워크 변수명.iterator(); 을 입력한 뒤에

3개의 메소드인 hasNext(), next(), remove()를 사용하는 것입니다. 

 

이것의 장점은 3가지가 있는데, 컬렉션 프레임워크라면 공통적으로 사용할 수 있다는 것입니다.

자세한 사용방법에 관련된 예제는 문제에 관련된 코드를 통해 확인하겠습니다.

(마지막에 주석을 하나씩 제거하시면서 실험해보시면 이해가 쉬우실 것입니다.)

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package test;
 
import java.util.ArrayList;
import java.util.Iterator;
 
public class CardDeck {
 
    public static void main(String[] args) {
        //카드를 저장하기 위한 배열리스트이다.
        ArrayList<String> card = new ArrayList<String>();
        card.add("2");
        card.add("3");
        card.add("4");
        card.add("5");
        card.add("6");
        card.add("7");
        card.add("8");
        card.add("9");
        card.add("J");
        card.add("Q");
        card.add("K");
        card.add("A");
        Iterator<String> iterator = card.iterator();
        //컬렉션 프레임 워크의 iterator()를 사용하여 값을 호출할 수 있고
        // 그 값은 iterator란 참조변수를 통해 그 값들에 접근할 수 있다고 간편하게 이해하자
 
        /*
         * 반복의 다음요소를 반환한다. 이것만 실행하면 2가 나온다. 
         * System.out.println(iterator.next());
         */
 
        
        
        
        
        /*실행하면 while 내부는 hasNext()로 인해 
         * 반환할 값이 있으므로 true가 되고 내부에 next()를 통해서 컬렉션 프레임워크에 있는 
         * 데이터를 다 토해낼 때까지 반복수행한다. 따라서 2부터 A까지 값이 출력될 것이다.
         * 
         * while(iterator.hasNext()) { System.out.println(iterator.next()); }
         */
        
        
        
        
        
        /*
         * 이 코드를 수행하게 되면 반복의 다음요소를 반환하고 여기서는 2를 반환.
         * 다음 remove()를 통해 마지막으로 반환한 요소인 2를 삭제한다 
         * 그 다음 컬렉션 프레임워크에 제일 첫번째 인덱스인 0을 호출하면 2가 아니라 3이 출력된다
         * 왜냐하면 2는 삭제되었기 때문이다.
         * 
         * System.out.println(iterator.next());
         *  iterator.remove();
         * System.out.println("삭제되었나요?");
         * 
         * while(iterator.hasNext()) { System.out.println(card.get(0)); break; }
         */
 
    }
 
}
cs

 

8번 문제

 

8번 문제는 (http://users.cis.fiu.edu/~shawg/3337/NewMeasurable/Measurable.java 의 글을 참조하였으며, 굳이 사이트 들어갈 필요없게 코드블럭에 사이트에서 참고한 내용을 올리겠습니다.

참고로 이 사이트는 보안상 주의요함 사이트라 하니 굳이 안들어가셔도 될 것 같습니다. 저도 뒤늦게 확인했습니다;;)

 

// Newer version of the Measurable interface now includes a static method
// and a default method - requires Java 8 or newer

/**
 *   Describes any class whose objects can be measured
 */
public interface Measurable
{
   /**
    * Computes the measure of the object.
    * @return the measure
    */
   double getMeasure();       // abstract method
   
   /**
    * Computes and returns the average measure for an array of Measurables
    * @param list an array of Measurables
    * @return the average measure for the objects in the array
    */
   static double getAverage(Measurable [] list)
   {
      // note to students: a static method, called just like static methods 
      // in classes, using the interface name as the "handle"
      
      if (list.length == 0)            // if list is empty...
         return 0.0 ;                  // ...ain't no average
      
      // here if list is not empty
      
      double sum = 0.0 ;               // accumulates sum of measures
      
      for (Measurable object : list)   // for each Measurable object in list...
      {
         sum += object.getMeasure() ;  // ...get the measure and add to sum
      }
      return sum / list.length ;       // compute and return average
   }
   
   /**
    * Is the measure of this object greater than the measure of another?
    * @param other the Measurable to which this object is compared
    * @return true if the measure of this object > the measure of other; else
    * returns false
    */
   default boolean isGreaterThan(Measurable other)
   // Note to students: a default method.  If not overridden in an implementing
   // class, that class "inherits" this version       
   {
      return this.getMeasure() > other.getMeasure() ;
   }   
}
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package test;
 
import java.util.Scanner;
 
interface GetInfo {
    //추상 메소드이다.
    double getValue();
}
 
public class Student implements GetInfo {
    static Scanner sc = new Scanner(System.in);
 
    //성적 값을 받기위한 변수이다.
    public double grade;
 
    //이 생성자를 통해 바로 grade 값을 초기화 가능하다.
    Student(double grade) {
        this.grade = grade;
 
    }
 
    //Student 클래스 타입의 객체를 만들기 위한 메소드이며, 성적을 입력하면
    //입력한 그 값이 매개변수 생성자를 통해 값을 초기화 하고, 객체를 생성한다.
    public static Student getStudent() {
        System.out.println("성적을 입력하세요");
        double g = sc.nextDouble();
        return new Student(g);
    }
 
    //해당 객체에 성적 값을 반환받기 위한 메소드이다.
    public double getValue() {
        return this.grade;
    }
 
    //Student[] 배열 타입의 list를 매개변수로 하는 메소드이다.
    public static double getAverage(Student[] list) {
        if (list.length == 0)
            return 0.0;
        //배열의 길이가 0이라는 것은 성적값을 가지고 있는 객체(학생)이 없다는 의미이므로
        //따라서 평균값도 없다.
 
        double sum = 0.0;
        //평균값을 위한 변수이다.
 
        //Student[] 배열 타입인 list의 각 인덱스를(인덱스를 가르키고 있으니 그 내부 값도 가르킨다.) 
        //Student 타입의 참조변수 object가 가르킨다.
        //즉, 다시말해서 Student object는 Student 배열 객체의 인덱스 내부에 있는 객체를 가르키고
        //그 객체의 getValue();를 통해서 그 객체의 성적값을 가져와 sum에 계속 합산해준다.
        //list 값이 object로 순차적으로 입력 다할 때까지.
        for (Student object : list) {
            sum += object.getValue();
        }
        //sum은 객체 배열의 크기(객체의 수)만큼 객체의 성적을 더한 값이고, 
        //그것을 다시 배열의 크기(객체의 수)로 나누는 것은 평균을 구하는 것과 같다.
        return sum / list.length;
    }
 
    public static void main(String[] args) {
        //객체를 저장할 객체 배열을 지정한다.
        Student[] studentArray = new Student[4];
 
        
        //객체 배열의 각 인덱스에 Student 클래스의 정적 메소드인 getStudent();를 통해 
        //객체 생성 후 바인딩을 한다.
        //그러므로 각 객체 배열의 인덱스에는 각 객체가 연결되었다.
        for (int i = 0; i < 4; i++) {
            studentArray[i] =Student.getStudent();
        }
        
        //평균을 구하는 정적메소드인 Student.getAverage();에 입력할 객체 배열의 참조변수를 입력한다.
        System.out.println(Student.getAverage(studentArray));
    }
}
 
cs

 

 

이것으로 7장 문제도 끝났습니다! 조금만 쉬었다가...바로 8장 돌입해야겠네요.

이번 달에 java 개념서만큼은 어떻게든 끝낼 수 있게 좀 더 열심히 해야겠습니다!!~~

반응형