WebDev/본과정

객체 비교와 인터페이스

Raadian 2021. 5. 12. 21:16

1. Object 클래스에 대하여 설명하시오.

1.1 정의

: Java에서의 모든 타입을 아우르는 객체 타입을 일컫는다.

 

1-2. 적용사례

Class ObjectExample { ... } // 상속을 명시하지 않은 클래스 Class ObjcetExample extends Object { ... } // 사실은 이러한 클래스가 모두 Object에 의해 상속 받아진다.

: 즉, 상속하고자 하는 클래스가 없으면 컴파일러에 의해 java.lang.Object 클래스로 통해서 상속이 되도록 코드가 구성 된다.

 

1-3. Object 클래스에 있는 대표적인 메소드

equals(Object obj); // 비교하고자 하는 객체가 해당 Object 객체의 내부와 "equal to"의 여부를 나타낸다. 
toString(); // Object 객체에서의 String 타입으로 표현값을 Return한다.

 

 

2. 아래와 같이 출력되는 이유를 하시오.

class A {
    @Override
    public String toString() {
        return "이것은 A 클래스 입니다.";
    }
}

public class TestMain {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a);
    }
}

> 이것은 A 클래스 입니다.

: 1-3에 언급한대로 toString()은 Object 클래스에 속한다. 이 메소드는 Object 객체에서의 String 타입으로 표현값을 반환하는데, 이러한 특성을 이용하여 오버라이딩을 적용 했음을 Annotation 표기(@Override)로 통해 알 수 있다. 따라서 해당 기능을 이용하여 리턴 값을 바꾸어 출력하였다.

 

 

3. class 이름 및 함수 에서 final 의 의미는?

  • 클래스에 final에 붙는 경우해당 클래스 상속할 수 없다.
  • final class FinalClass { ... }
  • 메소드에 final이 붙는 경우해당 메소드 오버라이딩 할 수 없다.
  • protected final int FinalMethod() { ... }

 

 

4. 연습문제 7-22 번을 푸시오.

4-1. Circle 클래스

public class Circle extends Shape { 
    double r; // 반지름

    @Override double calcArea() {
    	return Math.PI * Math.pow(r, 2); 
    }
}

 

4-2. Rectangle 클래스

public class Rectangle extends Shape { 
    double width, height; // 폭과 높이

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

    boolean isSquare() { // 정사각형인지 아닌지를 알려준다.
        boolean result = false;

        if (width == height) { // 정사각형인지 아닌지의 판별식 
        	result = true; 
        } else { 
        	result = false;
        } 

        return result; 
    }
}

 

 

5. 연습문제 7-23 번을 푸시오.

5-1. Exercise7_23(메인 클래스)

public class Exercise7_23 { 
    public static void main(String[] args) { 
        Shape[] arr = {new Circle(5.0), new Rectangle(3,4), new Circle(1)}; 
        System.out.println("면적의 합 : " + sumArea(arr)); 
    } 

    // 주어진 배열에 담긴 도형들의 넓이를 모두 더해서 반환 
    private static double sumArea(Shape[] arr) { 
        double sum = 0; 
        
        for (int i = 0; i < arr.length; i++) {
        sum += arr[i].calcArea();
        } 

        return sum;
    }
}

 

5-2. 변경된 Circle 클래스

public class Circle extends Shape { 
    double r; // 반지름

    public Circle(double r) { 
    	this.r = r; 
    } 

    @Override double calcArea() { 
    	return Math.PI * Math.pow(r, 2);
    } 
}

 

5-3. 변경된 Rectangle 클래스

public class Rectangle extends Shape { 
    double width, height; // 폭과 높이 

    public Rectangle(int width, int height) { 
    	this.width = width; this.height = height;
    } 

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

    boolean isSquare() { // 정사각형인지 아닌지를 알려준다. 
        boolean result = false; 
        
        if (width == height) { // 정사각형인지 아닌지의 판별식
        	result = true;
        } else {
        	result = false; 
        } 

        return result; 
    } 
}

 

 

6. interface 와 class 의 차이는?

: 인터페이스(Interface)와 클래스(Class)의 차이는 크게 상속(extends) 키워드와 구현(implements) 키워드로 나뉘어진다.

extends implements
1 : 1 상속만을 지원(ex. class Robot extends Machine) 다중 상속을 지원(ex. class Robot implements Movable, Runnable)
메소드의 몸체를 가지기 때문에 인스턴스 생성이 가능하다. 메소드의 몸체(Body)를 갖지 않아 참조변수 선언만 가능하다.

 

 

7. 다음을 프로그램 하시오.

SPrinterDriver 와 LPrinterDriver를 만드시오

interface Printable { // MS가 정의하고 제공한 인터페이스
    public void print(String doc); 
}
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);
}
> From Samsung printer 
> This is a report about ... 
> From LG printer 
> This is a report about ...

 

7-1. SPrinter 클래스

public class SPrinterDriver implements Printable { // Printable 인터페이스 구현
    @Override // 추상 메소드 오버라이딩 
    public void print(String doc) {
        System.out.println("From Samsung Printer");
        System.out.println(doc);
    }
}

 

7-2. LPrinter 클래스

public class LPrinterDriver implements Printable { 
    @Override 
    public void print(String doc) {
        System.out.println("From LG Printer");
        System.out.println(doc); 
    } 
}

 

 

8. @Override 에 대하여 설명하시오.

: 주석과 같은 맥락의 Annotation 표기법으로 앳(@) 키워드를 통해 컴파일러에서 처리하여 해당 메소드가 오버라이딩 되었음을 명시한다.

단, 메소드가 오버라이딩이 아닐 때 컴파일 에러로 표기할 수 있다.

 

 

9. interface 에 대하여 설명하시오.

: 기능 구현 추상적인 형태로 틀을 생성하는 것을 일컬으며 메소드의 몸체를 갖지 않는 특성을 가진다.

 

 

10. interface에 올 수 있는 두가지는?

10-1. LPrinter 클래스 implements extends와 같이 해당 클래스는 인터페이스를 통해 구현 되었음을 표기한다.

class Printer implemnets Printable { ... } // 인터페이스 또한 다형성(Polymorphism)을 가진다.

 

10-2. LPrinter 클래스abstract 추상 키워드를 일컫는다.

abstract class AbClass { ... } // 추상 클래스
public abstract void abMethod() {...} // 추상 메소드

 

 

11. abstract 키워드에 대하여 설명하시오.

: 인터페이스를 구현할 때의 추상 키워드인 abstract의 특성은 다음과 같다.

abstract class AbClass { ... } // 추상 클래스 
public abstract void abMethod() {...} // 추상 메소드

이외에 추상(abstract) 키워드가 붙은 것 객체 생성이 불가능하되 타입의 형태로 선언만 가능하다는 점(자손이 구현) interface를 구현 할 때 abstract 키워드를 따로 붙지 않아도 암묵적으로 추상의 의미가 될 수 있다.

interface Printable { // 인터페이스 
	public void print(String doc); // abstract 키워드가 붙지 않아도 암시적으로 추상 메소드가 된다. 
}

 

 

12. 아래의 출력 결과가 아래와 같이 나오도록 프로그래밍 하시오.

Object obj = new Circle(10); System.out.println(obj);

> 출력: 넓이는 100 입니다.

 

12-1. 메인 클래스

public class ObjectMain { 
    public static void main(String[] args) {
        Object obj = new Circle(10); 
        System.out.println(obj); 
    } 
}

 

12-2. Circle 클래스

public class Circle {
    private double rad;

    public Circle(double rad) {
    	this.rad = rad; 
    } 

    public double getRad() {
    	return rad; 
    } 

    public void setRad(double rad) { 
    	this.rad = rad;
    }

    public double getArea() { // 원의 넓이
    	return Math.PI * Math.pow(rad, 2); 
    }

    @Override public String toString() { 
    	return "출력: 넓이는 " + getArea() + " 입니다."; 
    }
}

 

 

13. 아래의 메모리를 그리시오.

class MobilePhone { 
    protected String number; 

    public MobilePhone(String num) { 
    	number = num;
    }
    
    public void answer() {
    	System.out.println("Hi~ from " + number);
    }
}

 

class SmartPhone extends MobilePhone { 
    private String androidVer;

    public SmartPhone(String num, String ver) { 
        super(num);
        androidVer = ver; 
    } 

    public void playApp() {
    	System.out.println("App is running in " + androidVer); 
    }
}

 

class PhoneMain { 
    public static void main(String[] args) { 
        MobilePhone phone = new SmartPhone("010-555-777", "Nougat");
        phone.answer(); 
        SmartPhone s = (SmartPhone)phone; 
        s.playApp(); 
    }
}