모든 클래스는 Object 클래스를 상속합니다.
subclass는 Object 클래스를 직접 상속 하지는 않지만 간접적으로(Object 클래스를 상속하는 클래스를 상속하는 형태) Object 클래스를 상속하게 됩니다.
class A{
}
public static void main(String[] args) {
A a = new A();
System.out.println(a); // String s = String.valueOf(x); -> s가 주소 뿌림
}
1) 기본적으로 모든 클래스는 Object 클래스를 상속하기 때문에 class A는 Object 클래스를 상속합니다.
2) Object 클래스에는 문자열을 반환하는 toString함수가 있습니다. 하지만 class A에는 toStirng함수가 override되어있지 않아서 a가 가리키는 객체의 주소값(가짜)을 출력하게 됩니다.
1. interface
interface + interface명 ();→ 함수 선언부(정의), body없음 (당연히 생성자 만들 수 없음) = 추상메소드
implements 키워드로 인터페이스를 구현할 (자손)클래스 표시합니다.
둘 이상의 다중 인터페이스 구현 가능합니다.(implements A, B 쉼표로 구분)
body가 없으므로 객체 생성 불가, 선언 혹은 구현만 가능합니다.
무조건 public 이어야 합니다.
이름은 앞에 i를 붙이거나 뒤에 -able로 짓는 것이 관례입니다.
2. 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 day_2024_07_31;
interface Printable2 {
public void print(String doc);
}
//삼성전자 개발자
class SprinterDriver implements Printable2{
@Override
public void print(String doc) {
System.out.println("From Samsung printer");
System.out.println(doc);
}
}
//LG전자 개발자
class LprinterDriver implements Printable2{
@Override
public void print(String doc) {
System.out.println("From LG printer");
System.out.println(doc);
}
}
public class PrinterMain2 {
public static void main(String args[]) {
String myDoc = "This is a report about...";
Printable2 prn = new SprinterDriver();
prn.print(myDoc);
prn = new LprinterDriver();
prn.print(myDoc);
}
}
@Override 는 현재 메소드가 부모 클래스의 메소드를 오버라이드 한 것임을 컴파일러에게 명시합니다.
부모 클래스에 해당하는 메소드가 없다면 에러를 발생시킵니다.
인터페이스는 표준이자 규약입니다. (함수명도 규약이 됨. 강제시킴 = 표준화)
인터페이스를 사용하면 함수 선언부를 정의해주고 있어서 그 규약에 맞게 각각의 회사가 맞춰서 구현을 하게되므로 관리에 용이합니다.
선언부분과 구현부분을 분리시켜 독립적으로 프로그램을 작성할 수 있습니다. (외주)
세부 정보를 숨기고 인터페이스를 통해 중요한 정보만 표시해서 보안을 확보할 수도 있습니다.
추상의 의미입니다. abstract 키워드는 생략 가능합니다.(컴파일러 자동 생성)
인터페이스 내에 있는 함수의 body부분이 없고 선언 부분만 있기 때문에 구현은 자손 클래스에서 해야합니다.
그렇기 때문에 인터페이스는 객체를 만들 수 없습니다.
Object obj = new Circle(10);
System.out.println(obj); //출력: 넓이는 100 입니다. (예시)
package day_2024_07_31;
class Circle extends Object {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
double getArea() {
return radius * radius * Math.PI;
}
@Override
public String toString() {
return "넓이는 " + getArea() + " 입니다";
}
}
public class ObjectMain2 {
public static void main(String args[]) {
Object obj = new Circle(10);
System.out.println(obj);
}
}
현재 객체가 메모리에 가지고있는 클래스라면 true, 아니면 false입니다. 용도는 형변환 유무입니다.
if (box instanceof GoldPaperBox) {
((GoldPaperBox) box).goldWrap();
} else if (box instanceof PaperBox) {
PaperBox pBox=(PaperBox)box;
pBox.paperWrap();
((PaperBox) box).paperWrap(); //위에 두줄을 요약
} else {
box.simpleWrap();
}
}