안녕하세요! 드디어 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(1, 1); list[1].move(2, 3); } } | 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 개념서만큼은 어떻게든 끝낼 수 있게 좀 더 열심히 해야겠습니다!!~~
'It Study > POWER JAVA(기본서)' 카테고리의 다른 글
POWER JAVA 8장 프로그래밍 1번 문제 ~ 5번 문제 (0) | 2022.10.29 |
---|---|
POWER JAVA 8장 mini project 글자 추측 게임(행맨 게임) (2) | 2022.10.27 |
POWER JAVA 7장 mini project 큐(queue) 구현하기 (0) | 2022.10.23 |
POWER JAVA 5장 프로그래밍 1번 문제 ~ 8번 문제 (0) | 2022.10.14 |
POWER JAVA 5장 LAB 책 정보 저장(응용) (0) | 2022.10.12 |