객체 비교와 인터페이스
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();
}
}
