Java공부(코딩)

코딩초보의 자바(Java)공부 15일차 { Object클래스 }

동곤일상 2024. 12. 25. 16:22
반응형
오늘은 자바의기본이되는
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가 나옴.