오늘은 자바의기본이되는
Object클래스에 대해 알아보겠습니다
1) java.lang 패키지
자바의 가장 기본이 되는 라이브러리
lang = language 의 줄임말
@@ java.lang 패키지의 대표적인 클래스들
`Object` : 모든 자바 객체의 부모 클래스
`String` : 문자열
`Integer` , `Long` , `Double` : 래퍼 타입, 기본형 데이터 타입을 객체로 만든 것
`Class` : 클래스 메타 정보
`System` : 시스템과 관련된 기본 기능들을 제공
2) Object 클래스
모든클래스의 최상위부모클래스는
Object클래스다
(상속을 받지않아도 자동상속)
메모리에도 존재
즉
extends Object 가
묵시적으로 실행된단 뜻
코드로 예를 한번 들어볼게요
public class ObjectMain {
public static void main(String[] args) {
Child child = new Child();
child.Method();
//toString(); 은 Object클래스의메서드
String string = child.toString();
System.out.println(string);
}}
출력
childMethod
object.Child@63961c42
toString()은 Object의 메서드이며
객체의 정보를 제공한다!!
toString 메서드를 호출하는 과정은 다음과 같다

정리)
자바에서 최종부모는 Object
3)자바에서 Object가 최상위 부모 클래스인 이유
1) 공통 기능 제공
Object` 가 제공하는 기능은 다음과 같다.
객체의 정보를 제공하는 `toString()`
객체의 같음을 비교하는 `equals()`
객체의 클래스 정보를 제공하는 `getClass()`
등등
2) 다형성의 기본 구현
부모는 자식을 담을 수 있다. `
Object` 는 모든 클래스의 부모 클래스이다.
따라서 모든 객체를 참조
타입이다른 객체를 보관해야한다면
Object에 보관가능
4)Object 다형성

Dog 와 Car는 아무런 관련도 없는 객체이다.
둘 다 부모X
Object를 자동상속받는다.
코드를 통해 보자
Dog , Car 는 메서드하나씩만 존재하는 클래스이므로
코드는 생략했다!
public class CarDogMain {
public static void main(String[] args) {
Car car = new Car();
Dog dog = new Dog();
action(car);
action(dog);
}
private static void action(Object obj) {
// obj.move();
// obj.sound(); 컴파일 오류 Object에는 move , sound가 없음

if(obj instanceof Car car) { //객체에 맞는 다운캐스팅
car.move();
}
else if(obj instanceof Dog dog) {
dog.sound();
}
else {
System.out.println("존재하지않는객체");
}}}
출력 ::
차가이동합니다
강아지가 짖어요!
Object는 모든클래스의 부모이다
Object car = new Car();
Object dog = new Dog();
와 같이 변경해도 문제없다
5) Object 배열
Object는 모든 객체를 담을 수 있다.
즉
Object[] 를 만들면
세상에 모든객체를 담을 수있다.
public class ObjectPolyMain2 {
public static void main(String[] args) {
Car car = new Car();
Dog dog = new Dog();
Object object = new Object();
Object[] obj = {car,dog,object};
arr(obj);
}
private static void arr(Object[] obj) {
int length = obj.length;
System.out.println("배열의 크기 :"+length);}}

6)toString
객체의 정보를 문자열 형태로 제공
public class ToStringMain1 {
public static void main(String[] args) {
Object obj = new Object();
String string = obj.toString();
System.out.println(obj);
System.out.println(string);
}}
출력
java.lang.Object@85ede7b
java.lang.Object@85ede7b
println() 으로 출력한 결과와
toString으로 출력한 결과가 같다
왜일까??
println에서 자동으로 toString을 호출하기때문이다!
따라서 println을 사용할때 굳이 toString을
호출하지 않아도 객체정보와 참조값을 알 수있음.
6-1) toString 과 오버라이딩
toString()은 오직 클래스의정보와참조값만을
나타낸다.
이것만으론 객체의상태를 제대로 알기 힘드므로
대부분 override를 활용한다
코드로 한번 보시죠!!
toString()을 오버라이딩해
객체의 정보를 출력
(기본적인 toString()오버라이딩은
IDE 자체에서 제공함 )
굳이 만들려하지말고 IDE힘을 빌리자
public class Car {
private String name;
public Car(String name) {
this.name = name;
}
@Override
public String toString() {
return "Car [name=" + name + "]";
}}
toString()을 오버라이딩하지않고사용한 객체
public class Dog {
private String name;
public Dog(String name) {
this.name = name;
}}
메인코드
public class ToStringMain2 {
public static void main(String[] args) {
Car car = new Car("테슬라Y");
Dog dog = new Dog("시바견");
System.out.println(car);
System.out.println(dog);
}}
출력::
Car [name=테슬라Y]
object.tostring.Dog@33c7353a
toString()을 오버라이딩했더니
상태가 눈에띄게 출력이 된다.
하지만
이렇게되면 참조값을 출력할 방법이
사라진다.
그 대안으로
String hexString = Integer.toHexString(System.identityHashCode(car));
System.out.println(hexString);
출력
33c7353a
Integer.toHexString(System.identityHashCode(인스턴스));
의 방법으로 참조값을 출력할 . 수있다.
7) OCP 원칙
Object클래스 같이
최상위부모가 존재하지않는다면
구체적인것에 의존하게 되고
그에맞는 메서드를 일일이 생성해야할것이다.
@@OCP 원칙
**Open**:
새로운 클래스를 추가하고, `toString()` 을 오버라이딩해서 기능을 확장할 수 있다.
**Closed**:
새로운 클래스를 추가해도 `Object` 와 `toString()`
을 사용하는 클라이언트 코드변경x
8) equals ( )
**동일성(Identity)**: ` ==
` 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인
**동등성(Equality)**: `equals()
` 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인
public class Hello {
private String name;
Hello(String name){
this.name = name;
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Hello other = (Hello) obj;
return Objects.equals(name, other.name);
}}
eqauls (동등성비교)를 위해서는 오버라이딩을 해야함
(IDE에서 제공)
public class Eqaulss {
public static void main(String[] args) {
Hello hello1 = new Hello("Hi");
Hello hello2 = new Hello("Hi"); //둘은 참조값이 다름
System.out.println("동일성 비교 '=='");
System.out.println(hello1==hello2);
System.out.println();
System.out.println("동등성비교 'equals()'");
System.out.println(hello1.equals(hello2));}}
출력
동일성 비교 '=='
false
동등성비교 'equals()'
true
둘은 논리적으로는 같다 .equals 성립
하지만
참조값이 다르므로 아예 동일하다고는
볼 . 수없기때문에
== 비교는 false가 나옴.
'Java공부(코딩)' 카테고리의 다른 글
코딩초보의 자바(Java)공부 17일차 { 래퍼 , Class 클래스 } (5) | 2024.12.30 |
---|---|
코딩초보의 자바(Java)공부 16일차 { String 클래스 } (5) | 2024.12.29 |
코딩초보의 자바(Java)공부 14일차 { 다형성과 설계 } (5) | 2024.12.24 |
코딩초보의 자바(Java)공부 13일차 { 다형성 활용 } (0) | 2024.12.23 |
코딩초보의 자바(Java)공부 12일차 { 다형성 } (0) | 2024.12.22 |