java 18

산야(Sanya)·2024년 1월 22일

java 족보

목록 보기
20/28

1.아래의 Main메소드가 돌아 가도록 프로그래밍 하시오.

  • SPrinterDriver 와 LPrinterDriver를 만드시오
interface Printable {
	public abstract void print(String doc);
}



public class InterfaceTest {

	public static void main(String[] args) {

		String myDoc = "This is a report about...";

		// 삼성 프린터로 출력
		Printable prn = new SPrinterDriver();
		prn.print(myDoc);

		System.out.println();

		// LG 프린터로 출력
		prn = new LPrinterDriver();
		prn.print(myDoc);

	}

}

======================================================

interface Printable {
    void print(String doc);
}

class SPrinterDriver implements Printable {
    @Override
    public void print(String doc) {
        System.out.println("삼성 프린터로 출력: " + doc);
    }
}

class LPrinterDriver implements Printable {
    @Override
    public void print(String doc) {
        System.out.println("LG 프린터로 출력: " + doc);
    }
}

public class printtext2 {
    public static void main(String[] args) {
        String myDoc = "This is a report about...";

        Printable prn = new SPrinterDriver();
        prn.print(myDoc);

        System.out.println();

        prn = new LPrinterDriver();
        prn.print(myDoc);
    }
}

2.아래의 인터페이스에 맞추어(상속하여) 아래를 프로그래밍 하시오.

Circle, Rectangle , Triangle
interface AreaGetable {
	public double getArea();
}

	public static void main(String[] args) {
		
		AreaGetable area = new Circle(4);
		System.out.println(area.getArea());

		area = new Rectangle(4,5);
		System.out.println(area.getArea());
		
		area = new Triangle(4,5);
		System.out.println(area.getArea());
	}

======================================================

interface AreaGetable {
    double getArea();
}

class Circle5 implements AreaGetable {
    private double radius;

    public Circle5(double radius) {
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

class Rectangle5 implements AreaGetable {
    private double width;
    private double height;

    public Rectangle5(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double getArea() {
        return width * height;
    }
}

class Triangle5 implements AreaGetable {
    private double base;
    private double height;

    public Triangle5(double base, double height) {
        this.base = base;
        this.height = height;
    }

    @Override
    public double getArea() {
        return 0.5 * base * height;
    }
}

public class printtext2 {
    public static void main(String[] args) {
        AreaGetable area = new Circle5(4);
        System.out.println(area.getArea());

        area = new Rectangle5(4,5);
        System.out.println(area.getArea());

        area = new Triangle5(4,5);
        System.out.println(area.getArea());
    }
}

3. 디폴트 메소드에 대하여 설명하시오.

디폴트 메소드: 디폴트 메소드는 인터페이스에서 제공하는 메소드로, 기본 구현을 가집니다. 이 메소드는 인터페이스를 구현하는 클래스에서 오버라이드할 수 있지만, 오버라이드하지 않아도 됩니다. 디폴트 메소드는 자바 8에서 도입되었으며, 기존 인터페이스를 변경하지 않고도 새로운 기능을 추가할 수 있게 해줍니다.

4. 인터페이스를 상속하는 방법에 대하여 설명하시오.

인터페이스를 상속하는 방법: 인터페이스는 다른 인터페이스를 상속할 수 있습니다. 이는 extends 키워드를 사용하여 수행됩니다. 인터페이스가 다른 인터페이스를 상속하면, 상속받는 인터페이스는 상위 인터페이스의 모든 추상 메소드를 상속받습니다. 또한, 인터페이스는 여러 인터페이스를 동시에 상속할 수 있습니다. 이는 클래스와 달리 인터페이스는 다중 상속을 지원하기 때문입니다.

5.다음 코드에서 생성자로 인한 오류를 찾아내어 이유를 설명하고 오류를 수정하라.

class A {
   private int a;
   protected A(int i) { a = i; }
}
class B extends A {
   private int b;
   public B() { b = 0; }
}
  • 클래스 B는 클래스 A를 상속받고 있습니다. 그런데 클래스 A에는 매개변수를 받는 생성자만 정의되어 있고, 디폴트 생성자가 없습니다. 이 경우, 클래스 B의 생성자에서는 명시적으로 클래스 A의 생성자를 호출해야 합니다. 그렇지 않으면 컴파일 오류가 발생합니다. 이 문제를 해결하려면 클래스 B의 생성자에서 super 키워드를 사용하여 클래스 A의 생성자를 호출해야 합니다. 다음은 수정된 코드입니다:

class A {
   private int a;
   protected A(int i) { a = i; }
}
class B extends A {
   private int b;
   public B() {
      super(0); // 클래스 A의 생성자 호출
      b = 0;
   }
}

6.다음 추상 클래스의 선언이나 사용이 잘못된 것을 있는 대로 가려내고 오류를 지적하라.

(1)abstract class A {
      void f();
   }
   
(2)abstract class A {
      void f() { System.out.println("~"); }
   }
   
(3)abstract class B {
      abstract void f();
   }
   class C extends B {
   }
   
(4)abstract class B {
      abstract int f();
   }
   class C extends B {
      void f() { System.out.println("~"); }
   }

추상 클래스의 선언이나 사용에 대한 문제는 다음과 같습니다:

  • (1) 추상 메서드는 본체가 없어야 합니다. 따라서 void f(); 앞에 abstract 키워드를 추가해야 합니다.
  • (2) 이 선언은 문제가 없습니다. 추상 클래스 내에는 추상 메서드뿐만 아니라 일반 메서드도 포함될 수 있습니다.
  • (3) 클래스 C는 추상 클래스 B를 상속받고 있지만, 추상 메서드 f()를 구현하고 있지 않습니다. 추상 클래스를 상속받는 하위 클래스는 추상 클래스의 모든 추상 메서드를 구현해야 합니다.
  • (4) 클래스 C는 추상 메서드 f()의 시그니처를 잘못 구현하고 있습니다. f() 메서드는 int 타입을 반환해야 하지만, 클래스 C의 f() 메서드는 반환값이 없습니다. 이 경우, 클래스 C의 f() 메서드가 int 타입을 반환하도록 수정해야 합니다.
abstract class A {
   abstract void f();
}

abstract class B {
   abstract void f();
}
class C extends B {
   void f() { /* 구현 내용 */ }
}

abstract class D {
   abstract int f();
}
class E extends D {
   int f() { /* 구현 내용 */ return 0; }
}
profile
개발일지

0개의 댓글