자바에서 기본으로 제공하는 라이브러리(클래스 모음) 중 가장 기본이 되는 것으로
language 의 줄임말이다
자바 언어의 가장 기본이 되는 클래스들을 보관하는 패키지를 뜻한다
java.lang 패키지는 모든 자바 애플리케이션에 자동으로 import 된다
모든 클래스의 최상위 부모 클래스로 묵시적 상속이 이루어진다
Object 클래스는 모든 객체의 공통 기능을 제공한다
Object 클래스가 모든 객체의 최상위 부모이므로
다른 객체들은 편리하게 공통 기능을 상속 받을 수 있다
개발자는 모든 객체가 Object 의 기능을 상속 받는 것을 알고 있으므로
프로그램이 단순화되고 일관성을 가진다
Object 는 모든 클래스의 부모 클래스로 모든 객체를 참조할 수 있다
다형성을 지원하는 기본적인 메커니즘을 제공한다
모든 자바 객체는 Object 타입으로 처리될 수 있다
타입이 다른 객체들을 모두 담을 수 있다
부모가 없는 두 클래스가 있을 때
각각의 인스턴스에서 원하는 동작을 동일한 상황에 따라 조절하고 싶다면
Object 클래스에서 각각에 맞게 다운 캐스팅을 하여
처리할 수 있다
Car car = new Car();
Dog dog = new Dog();
action(dog);
action(car);
private static void action (Object obj) {
// 다운캐스팅
if (obj instanceof Dog dog) {
dog.sound();
} else if (obj instanceof Car car) {
car.sound();
}
}
위 코드에서 Object 타입을 활용한 다형성을 구현하여
Dog, Car 개별 타입들을 Object 타입으로 받아
다운캐스팅을 하여 사용
Pattern Matching for instanceof 이후 (Java 16+):
Java 16부터는 instanceof 연산자와 동시에 타입을 확인하고 해당 타입의 변수를 선언하고 초기화하는 기능을 제공합니다. instanceof의 조건이 참(true)으로 평가되면, 선언된 타입의 새로운 변수가 해당 객체로 자동 형변환되어 스코프 내에서 사용 가능하게 됩니다.
어떠한 객체든 모두 참조할 수 있다
다형성을 이용해 다른 객체를 사용하려면 다운 캐스팅을 해줘야 한다
다형성을 제대로 활용하려면
다형적 참조와 메서드 오버라이딩을 함께 해야한다
Object 는 모든 객체의 부모이기 때문에
다형적 참조는 가능하지만
Object 에서 제공하는 기능 외에는 메서드 오버라이딩 할 수 없다
Object 배열은 자바의 모든 객체를 담을 수 있다
private static void size(Object[] objects) {
System.out.println(objects.length);
}
Object 매개변수로 하는 메서드 작성 시
자바 내의 모든 객체를 인수로 전달할 수 있다
때문에 새로운 클래스가 추가되거나 변경되어도
해당 메서드는 수정핟지 않아도 된다
Object 가 없어도 비슷하게 구현하여 사용할 수도 있지만
다른 사람들과 내 코드에 일관성이 사라질 것이다
객체 정보를 문자열 형태로 제공
디버깅과 로깅에 유용한 메서드
Ojbect 클랫에 정의되므로 몯든 클래스에서 상속받아 사용할 수 있다
기본적으로 패키지를 포함한 객체의 이름과 참조값(해시코드 - 16진수)를
제공한다
println 에서도 객체를 받으면 toString() 을 호출하도록
오버로딩 되어 있다
Object.toString() 은 객체의 참조값을 제공하지만
참조값 만으로는 객체의 상태를 적절히 나타낼 수 없기 때문에
주로 오버라이딩해서 보다 유용한 정보를 제공하도록 한다
toString() 을 재정의하면
객체의 참조값을 출력할 수 없다
String refValue = Integer.toHexString(System.identifyHashCode(dog1));
Object 가 제공하는 toString() 이 없다면
서로 관계가 없는 객체의 정보를 출력하기 어렵다
따로 메서드를 만들더라도 구체적인 타입에 의존하게 되어
OCP 를 만족하기 어려울 것이다
Object 클래스는 다형적 참조 문제와 메서드 오버라이딩 문제를 해결해준다
Object 클래스가 존재함으로 인해 구체적인 클래스를 사용하지 않고
추상적인 클래스를 참조할 수 있게 된다
Object 클래스를 사용하는 것을 Object 클래스에 의존한다고 표현한다
다형적 참조와 메서드 오버라이딩을 적절히 사용한다는 것
System.out.println() 는 Object 매개변수를 사용하고
내부에서 toString() 을 오버라이딩 하여 호출한다
따라서 println() 을 사용해서 모든 객체 정보를 편리하게 출력할 수 있다
자바 언어는 객체지향 언어 답게 스스로 객체지향의 특징을 잘 활용한다
Obejct 클래스는 동등성 비교를 위한 equals() 메서드를 제공한다
String 의 비교 또한 equals() 를 사용해야 한다
자바는 두 객체가 같다는 표현을 2가지로 구분한다
동일은 완전히 같음을 의미한다
동등은 같은 가치나 준을 의미한다
동일성은 물리적으로 같은 메모리에 있는 객체 인스턴스인지 참조 값을 확인하는 것이고
동등성은 논리적으로 같은지 확인하는 것이다
동등성의 개념은 각 클래스마다 다르다
어떤 클래스는 id 를 기반으로 동등성을 처리할 수 있고
어떤 클래스는 연락처를 기반으로 동등성을 처리할 수 있다
따라서 equals() 메서드는 오버라이딩 하여 사용해야 한다
그렇지 않으면 equals() 는 동일성 비교를 기본으로 제공한다
개념적으로는 동등성 처리를 위해 특정 값을 비교하여도 되지만
실제로 사용하는 정확한 equals() 를 구현하기 위해서는
객체 내의 모든 값을 비교해야 한다
대부분의 ide 는 equals() 코드를 자동으로 만들어 준다