모든(All) 클래스는 Object 클래스를 상속한다.(Object 클래스는 모든 클래스의 조상)
subclass는 Object 클래스를 직접 상속 하지는 않지만 간접적으로 결국은 Object 클래스를 상속하게 된다.
= Object 클래스를 사용할 수 있다
아래에서 주소가 출력되는 이유를 순차적으로 설명하시오.
class A{ } public class Test { public static void main(String[] args) { A a = new A(); System.out.println(a); } }
이렇게 의미 없는 값이 출력되지 않도록 Object class의 String toString()함수를 override 하면 Object의 자식 클래스인 class A의 tring toString() 함수가 호출된다.
println()함수가 객체 이름을 매개 변수로 받아서 toString()을 호출할 수 있도록 overload되어 있기 때문에 a.toString을 붙이지 않아도 위의 문제와 같이 원하는 문자열이 출력되는 결과를 얻을 수 있다.
클래스가 마지막이다 → 더 이상 다른 클래스가 상속할 수 없다.
함수가 마지막이다. → 다른 클래스에서 overriding 할 수 없다.
interface와 class를 동시에 상속, 구현 가능
다음을 프로그램 하시오.
interface Printable { // MS가 정의하고 제공한 인터페이스 public void print(String doc); } //SPrinterDriver 와 LPrinterDriver를 만드시오 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); }
package java_1214;
interface Printable { // MS가 정의하고 제공한 인터페이스
public void print(String doc);
}
class SPrinterDriver implements Printable {
public void print(String doc) {
System.out.println("From Samsung printer");
System.out.println(doc);
}
}
class LPrinterDriver implements Printable {
public void print(String doc) {
System.out.println("From LG printer");
System.out.println(doc);
}
}
public class PrintInterfaceEx {
//SPrinterDriver 와 LPrinterDriver를 만드시오
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);
}
}
오버라이딩 하라고 좀 더 명확하게 개발자들에게 알려주는 것 컴파일시 에러 등을 발생시켜 경고나 확인을 하는 목적으로 사용한다. → 안전성을 위한 것
@Override 는 현재 메소드가 부모 클래스의 메소드를 오버라이드 한 것임을 컴파일러에게 명시하고, 부모 클래스에 해당하는 메소드가 없다면 에러를 발생시킨다.
인터페이스는 표준이자 규약이다. (함수명도 규약이 됨. 강제시킴 = 표준화)
선언부분과 구현부분을 분리시켜 독립적으로 프로그램을 작성할 수 있다. (외주)
세부 정보를 숨기고 인터페이스를 통해 중요한 정보만 표시해서 보안을 확보할 수도 있다.
interface Printable {
public void print(String doc); // 추상 메소드(=함수정의, 선언만)
//(abstrct 생략 가능)인터페이스 무조건 public, abstract 함수
}
interface Printable {
public static final int PAPER_WIDTH = 70; //상수
public static final int PAPER_HEIGHT = 120;
public void print(String doc);
//무조건 public static final 이어야 함(생략가능: 컴파일러가 붙여줌)
}
추상의 의미. abstract 키워드는 생략 가능(컴파일러 자동 생성)
인터페이스 내에 있는 함수의 body부분이 없고 선언 부분만 있기 때문에 구현은 자손 클래스에서 해야한다.(자손이 구현)
그렇기 때문에 인터페이스는 객체를 만들 수 없다.
아래의 출력 결과가 아래와 같이 나오도록 프로그래밍 하시오.
Object obj = new Circle(10); System.out.println(obj); //출력: 넓이는 100 입니다. (예시)
public class Fuck extends Object{
public static void main(String[] args) {
Object obj = new Circle05(10);
System.out.println(obj);
}
}
class Object {
double getArea() {
return 0.0;
}
}
class Circle05 extends Object {
@Override
public String toString() {
return "넓이는 " + r*r*Math.PI + "입니다";
}
public Circle05(int r) {
super();
this.r = r;
}
int r;
public double getArea() {
return r*r*Math.PI;
}
}