자바는 상속을 통해 부모의 기능을 자식에게 물려줘서 사용할 수 있게 하는데,
상속을 받은 자식은 부모의 모든 기능을 사용할 수 있습니다.
public class Car { public void move() { System.out.println("차를 이동합니다."); } public void openDoor() { System.out.println("문을 엽니다."); } }
public class ElectricCar extends Car { public void charge() { System.out.println("충전합니다."); } }
public class GasCar extends Car { public void fillup() { System.out.println("기름을 주유합니다."); } }
코드를 보면 ElectricCar와 GasCar는 모두 Car를 상속받는다. 그럼 ElectricCar와 GasCar는 Car클래스의 move()메소드와 openDoor()메소드를 사용할 수 있다.
그런데 여기서, Car클래스도 상속을 받고있다 그런데 왜 다른 클래스들 처럼 extends키워드를 명시하지 않았을까?
자바에서 모든 클래스의 부모클래스는 "Object클래스"이다. 클래스에 따로 상속을 명시하지 않으면 묵시적으로 Object클래스를 상속받는다.
Object클래스는 모든 클래스들의 부모이므로 모든 객체를 다 담을 수 있다.
하지만 Object를 통해 전달받은 메소드를 호출할 일이 있다면 그에 맞게 다운캐스팅을 해줘야한다.
다형성은 다형적 참조와 메서드 오버라이딩이 함께 이루어져야 한다. 그런데 Object클래스는 더 이상 상위 클래스가 없기 때문에 메서드 오버라이딩에 한계가 생긴다. Object클래스가 세상의 모든 메서드들을 다 알고있는건 아니기 때문이다.
자바가 기본으로 제공하는 라이브러리중 가장 기본이 되는 패키지이다. Language의 줄임말이다.
대표적인 클래스들
Object : 모든 자바 객체의 부모 클래스
String : 문자열
Integer, Long, Double : 래퍼타입, 기본형 데이터 타입을 객체로 만든 것
Class : 클래스 메타 정보
System : 시스템과 관련된 기본 기능들을 제공
이 외에도 java.lang패키지의 Object클래스 에서 제공하는 메서드들도 있는데 간략하게 알아보자
toString() : 객체의 정보를 제공
equals() : 객체의 같음을 비교
getClass() : 객체의 클래스정보를 제공
정적 의존관계 : 컴파일 시간에 결정되며 주로 클래스 간의 관계를 의미, 프로그램을 실행하지 않고, 클래스 내에서 사용하는 타입들만 보면 쉽게 의존관계를 파악할 수 있다.
동적 의존관계 : 런타임 시간에 확인 가능한 의존관계, 런타임에 어떤 인스턴스를 사용하는지를 나타내는 것
참고로 단순히 의존관계 또는 어디에 의존한다고 하면 보통은 정적 의존관계를 뜻한다.
Object클래스는 자바의 모든 클래스들의 부모 클래스이고 Object클래스가 제공하는 메소드들도 개발자들이 사용하는 공통기능을 제공해준다.
하지만 Object클래스는 더 이상 상위의 상속을 받는 클래스가 없기 때문에 다형성을 활용하는데 있어서 한계가 있다.