오답노트/Java

클래스 상속 실습문제(1)

개발..너... 2022. 3. 20. 02:58

▶문제 1~2

 

*TV 클래스 

 

1
2
3
4
5
class TV{
   private int size;
   public TV(int size) { this.size = size; }
   protected int getSize() { return size; }
}
cs

 

1.다음 main() 메소드와 실행 결과를 참고하여 TV를 상속받은 ColorTV 클래스를 작성하라.

 

*main메소드

 

1
2
3
4
5
6
public static void main(String[] args) {
   ColorTV myTV = new ColorTV(321024);
   myTV.printProperty();
}
32인치 1024컬러
 
cs

 

[답]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ColorTv extends Tv{
    private int color;
 
    public ColorTv(int size, int color) {
        super(size);
        this.color = color;
 
    }
    
    public void printProperty(){
        System.out.println(getSize()+"인치"+color+"컬러"); 
    }
}
 
cs

 

[풀이]

 

-. 부모에게 상속받은 size라는 메서드와 자식의 고유의 속성 color를 혼합하여 파라미터를 받아 문제를 해결해야한다. 생성자에서 ColorTv로 올려보내는 파라미터가 size, color 동시에 2개의 값을 넘기니 ColorTv의 클래스에도 동시에 이 값을 받아야한다. 그래서 ColorTV생성자에 부모에게 상속받은 메서드, 본인 고유의 메서드 위한 총 2개의 값을 받았고 다음에 super(size)를 통해 부모의 기능을 불러낸다.

-. printProperty()에서도 상속받은 기능과 본인 고유의 기능을 불러내는 방법이 차이가 나는데 상속받은 size는 부모에게 private로 잠겨져있기에 getsize()를 통해 호출해야하고 color는 같은 클래스에서 생성이 되었고 사용되고있으니 일반 color 혹은 this.color로만 입력해도 무관하다. 

 

2. 다음 main() 메소드와 실행 결과를 참고하여 ColorTV를 상속받는 IPTV 클래스를 작성하라.

*Main메서드

 

1
2
3
4
5
public static void main(String[] args) {
   IPTV iptv = new IPTV("192.1.1.2"322048);
   iptv.printProperty();
}
// 나의 IPTV는 192.1.1.2 주소의 32인치 2048컬러
 
cs

 

[답]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class IPTV extends ColorTv{
    private String ip;
 
  
    public IPTV(String ip, int size, int color) {
        super(size, color);
        this.ip = ip;
    }
 
    public void printProperty() {
       System.out.print("나의 IPTV는 " + Ip + "주소의 ");
        super.printProperty();
    }
 
cs

 

 

[풀이]

size와 color는 모두 ColorTV의 기능이다

size는 Tv라는 클래스에서 상속받아온 것으로 ColorTv를 불러오면 size도 함께 불러올 수 있다.

 

 

▶문제 3~4

 

*다음은 단위를 변환하는 추상 클래스 Converter이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Scanner;
abstract class Converter {
   abstract protected double convert(double src); // 추상 메소드
   abstract protected String getSrcString(); // 추상 메소드
   abstract protected String getDestString(); // 추상 메소드
   protected double ratio; // 비율
   public void run() {
      Scanner scanner = new Scanner(System.in);
      System.out.println(getSrcString()+"을 "+getDestString()+"로 바꿉니다.");
      System.out.print(getSrcString()+"을 입력하세요>> ");
      double val = scanner.nextDouble();
      double res = convert(val);
      System.out.println("변환 결과: "+res+getDestString()+"입니다");
      scanner.close();
   }
}
cs

 

3. Converter 클래스를 상속받아 원화를 달러로 변환하는 Won2Dollar 클래스를 작성하라. main() 메소드와 실행 결과는 다음과 같다.

 

*Main메소드

 

1
2
3
4
public static void main(String args[]) {
   Won2Dollar toDollar = new Won2Dollar(1200); // 1달러는 1200원
   toDollar.run();

}
/*원을 달러로 바꿉니다.
원을 입력하세요>>24000
변환결과: 20.0달러입니다.
*/

//Colored by Color Scripter
cs

 

[답]

 

▶문제 5~8

 

*2차원 상의 한 점을 표현하는 Point 클래스

 

1
2
3
4
5
6
7
class Point {
   private int x, y;
   public Point(int x, int y) { this.x = x; this.y = y; }
   public int getX() { return x; }
   public int getY() { return y; }
   protected void move(int x, int y) { this.x =x; this.y = y; }
}
cs

 

5. Point를 상속받아 색을 가진 점을 나타내는 ColorPoint 클래스를 작성하라. 다음 main() 메소드를 포함하고 실행 결과와 같이 출력되게 하라.

 

*Main 클래스

 

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
   ColorPoint cp = new ColorPoint(55"YELLOW");
   cp.setXY(1020);
   cp.setColor("RED");
   String str = cp.toString();
   System.out.println(str+"입니다. ");
}
// RED색의 (10,20)의 점입니다. 
 
cs

 

[답]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Colorpoint extends Point{
    private String color ; 
 
    public Colorpoint(int x, int y, String color) {
        super(x, y);
        this.color = color;
    }
 
    public void setXY(int x, int y){
        move(x, y);
    }
 
    public void setColor(String color){
        this.color = color;
    }
     
    public String toString(){   
        String print = color + "색의" + "(" + getX() + "," +getY() + ")입니다"
s

 

[풀이]

-. Colorpoint의 고유 객체를 만드는 방법이다. cp.setXY는 Colorpoint에만 있는 클래스로 직접 생성해야하는데 역시 파라미터를 2개를 동시에 넘겨주니 데이터를 받는 것도 한 () 안에서 동시에 받아야한다. 이 때, 부모 클래스 Point의 move를 가져와 사용하는데 이 때 super를 사용하지 않는 이유는 생성자가 아닌 메서드라 굳이 super를 사용할 필요가 없다. 

-. setColor에서 get이 필요없는 이유는 Colorpoint가 Point를 상속하면서 get메서드도 모두 상속받아왔기에 toString에서 바로 getX(), getY()를 사용가능하다.

 

6. Point를 상속받아 색을 가진 점을 나타내는 ColorPoint 클래스를 작성하라. 다음 main() 메소드를 포함하고 실행 결과와 같이 출력되게 하라.

 

*Main 클래스

 

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
   ColorPoint zeroPoint = new ColorPoint(); // (0,0) 위치의 BLACK 색 점
   System.out.println(zeroPoint.toString() + "입니다.");
   ColorPoint cp = new ColorPoint(1010); // (10,10) 위치의 BLACK 색 점
   cp.setXY(5,5);
   cp.setColor("RED");
   System.out.println(cp.toString()+"입니다.");
}
BLACK색의 (0,0) 점입니다.
RED색의 (5,5) 점입니다.
cs

 

[답]

 

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
public class ColorPoint extends Point{
    private String color;
 
    public ColorPoint() {
        super(0,0);
        this.color = "Black";
    }
 
    public ColorPoint(int x, int y) {
        super(x,y);
    }
 
    public void setXY(int x, int y){
       move (x,y);
    }
 
    public void setColor(String color){
        this.color = color;
    }
 
    public String toStrung(){
        String print = color + "색의 (" + getX() + "," + getY() + ") 점" ;
        return print;
    }
 
 
}
cs

 

[풀이]

 

-. 첫번째 Colorpoint에는 파라미터값이 없는데 바로 (0,0)과 Black이라는 데이터값을 바로 출력해줘야한다. 이 땐 기본생성자로 생성하고 그 안에서 데이터를 바로 넣어주는 것도 가능하다. 

 

 

7. Point를 상속받아 3차원의 점을 나타내는 Point3D 클래스를 작성하라. 다음 main() 메소드를 포함하고 실행 결과와 같이 출력되게 하라.

 

*Main 클래스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void main(String[] args) {
   Point3D p = new Point3D(1,2,3); // 1,2,3은 각각 x, y, z축의 값.
   System.out.println(p.toString()+"입니다.");
   p.moveUp(); // z 축으로 위쪽 이동
   System.out.println(p.toString()+"입니다.");
   p.moveDown(); // z 축으로 아래쪽 이동
   p.move(1010); // x, y 축으로 이동
   System.out.println(p.toString()+"입니다.");
   p.move(100,  200300); // x, y, z축으로 이동
   System.out.println(p.toString()+"입니다.");
}
(1,2,3) 의 점입니다.
(1,2,4) 의 점입니다.
(10,10,3) 의 점입니다.
(100,200,300) 의 점입니다.
cs

 

[답]

 

 

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
public class Point3D extends Point{
    private int z;
 
    public Point3D(int x, int y, int z) {
        super(x, y);
        this.z = z;
    }
 
    public void moveUp(){
        z++;
    }
 
    public void moveDown(){
       z--;
    }
 
    public void move(int x,int y, int z){
        move(x,y);
        this.z = z;
    }
    
    public String toString(){
        String print = "";
        print = "(" + getX() + getY() + z + ") 의 점";
        return print;
    }
 
 
}
cs

 

[풀이]

 

-. z축으로 위쪽이동(moveUp), z쪽으로 아래쪽이동(moveDown)에 z++와 z--만 있어도 출력이 되는 이유는 x,y는 누적이 되기 때문이다. point3D생성자가 생성될 때 이미 x,y는 10이라는 결과값을 받고 멤버변수에 값을 저장시켜놓았기에 toString의 x와 y에서 10이 출력되는 것이다. 

-. p.move(10,10)을 호출할 때 z가 초기값 3으로 출력되는 이유는 3을 받았을 떄만 this를 넣어줬고 z++와 z--는 this를 넣지 않아 멤버변수에 저장을 시키지 않았기 때문에 z는 처음 저장한 3이 출력이 된다.

 

8.  Point를 상속받아 양수의 공간에서만 점을 나타내는 PositivePoint 클래스를 작성하라. 다음 main() 메소드를 포함하고 실행 결과와 같이 출력되게 하라.
[Hint] Point 클래스의 move()를 PositivePoint 클래스에서 오버라이딩하여 재작성하고 적절히 super.move()를 호출해야 한다. PositivePoint의 2 개의 생성자에서도 적절히 super() 생성자와 super.move()를 호출해야 한다.

 

*Main메서드

 

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
   PositivePoint p = new PositivePoint();
   p.move(1010);
   System.out.println(p.toString()+"입니다.");
   p.move(-5,5); // 객체 p는 음수 공간으로 이동되지 않음
   System.out.println(p.toString()+"입니다.");
   PositivePoint p2 = new PositivePoint(-10-10);
   System.out.println(p2.toString()+"입니다.");
}
/*(10,10)의 점입니다.
(10,10)의 점입니다.
(0,0)의 점입니다.*/
cs

 

[답]

 

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
public class PositivePoint extends Point{
 
    public PositivePoint() {
      super(0,0);
    }
 
    public PositivePoint(int x, int y) {
        super(x,y);
        if(x<0 || y<0){
            super.move(0,0);
        }
      }
 
      protected void move(int x, int y){
          if(x > 0 && y> 0){
              super.move(x,y);
          }
      }
 
      public String toString(){
          String print = "(" + getX() + "," + getY() + ")의점";
          return print;
      }
 
 
}
 
cs

 

[풀이]

-. 양수의 공간에서만 출력이 되어야하니 오버라이딩을 통해서 가정법을 만들어 음수일 경우엔 0.0이 표시되도록 만들어준다. 이떈 기본생성자를 만들어 super의 값을 0으로 초기화 시켜준다. 

-. 문제에서 양수의 공간에서만 점을 출력하라고 하였기에 x와 y  중 하나라도 음수가 있을 경우 출력이 되지 않도록 반복문을 만들었다.