
- Object는 모든 클래스의 최상위 부모 클래스
- Object 클래스는 필드가 없고 메소드로 구성되어 있으며 모든(All) 클래스는 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가 가리키는 객체의 주소값을 출력하게 된다.
① interface
② class
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);
}
✅ 구현
//삼성 프린터
class SprinterDriver implements Printable {
@Override
public void print(String doc) {
System.out.println("From Samsung pirnter");
System.out.println(doc);
}
}
//LG 프린터
class LprinterDriver implements Printable {
@Override
public void print(String doc) {
System.out.println("From LG pirnter");
System.out.println(doc);
}
}
- 부모 클래스(super class)에 존재하는 필드나 메서드를 자식 클래스(sub class)에서 재정의하여 사용하는 것.
- 현재 메소드가 부모 클래스의 메소드를 오버라이드 한 것임을 컴파일러에게 명시하고, 부모 클래스에 해당하는 메소드가 없다면 에러를 발생시킨다.
- 인터페이스는 표준이자 규약이다. (함수명도 규약이 됨. 강제시킴 = 표준화)
- 인터페이스가 없다면 printable 예시의 경우 각각 객체를 생성, 각각 다른 함수를 사용해야하므로 회사가 많아지면 점점 관리가 까다로워진다. 인터페이스를 사용하면 함수 선언부를 정의해주고 있어서 그 규약에 맞게 각각의 회사가 맞춰서 구현을 하게되므로 관리에 용이하다.
- 선언 부분과 구현 부분을 분리시켜 독립적으로 프로그램을 작성할 수 있다.
- 세부 정보를 숨기고 인터페이스를 통해 중요한 정보만 표시해서 보안을 확보할 수도 있다.
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 이어야 함(생략가능: 컴파일러가 붙여줌)
}
- abstact: 추상의 의미.
- abstract 키워드는 생략 가능(컴파일러 자동 생성)
- 인터페이스 내에 있는 함수의 body부분이 없고 선언 부분만 있기 때문에 구현은 자손 클래스에서 해야한다.(자손이 구현!)
- 그렇기 때문에 인터페이스는 객체를 만들 수 없다.
Object obj = new Circle(10);
System.out.println(obj); //출력: 넓이는 100 입니다. (예시)
✅ 구현
class Circle {
public double r;
public Circle(double r) {
this.r = r;
}
public double getArea() {
return r*r*Math.PI;
}
@Override
public String toString() {
return "넓이는 " +getArea()+ "입니다.";
}
}
public class ObjCircle {
public static void main(String[] args) {
Object obj = new Circle(10);
System.out.println(obj); //출력 : 넓이는 100 입니다. (예시)
}
}
Box box1 = new Box();
PaperBox box2 = new PaperBox();
GoldPaperBox box3 = new GoldPaperBox();
/*
box1은 Box클래스 참조, Box객체 생성
box2는 PaperBox클래스 참조, PaperBox객체 생성
box3은 GoldPaperBox클래스 참조, GoldPaperBox객체 생성
*/
wrapBox(box1);
wrapBox(box2);
wrapBox(box3);
}
public static void wrapBox(Box box) {
if (box instanceof GoldPaperBox) {
((GoldPaperBox) box).goldWrap();
} else if (box instanceof PaperBox) {
((PaperBox) box).paperWrap();
} else {
box.simpleWrap();
/*
box1 → GoldPaerBox(x) → PaperBox(x) → box.simpleWrap();
box2 → GoldPaerBox(x) → PaperBox(o) → ((PaperBox) box).paperWrap();
box3 → GoldPaerBox(o) → ((GoldPaperBox) box).goldWrap();
형변환을 시켜준 이유:
box 객체가 어떤 타입을 참조하는지 모르기 때문에 형변환으로 명시해준것임
*/
