ToBe끝판왕

[ JAVA ] Object 클래스 본문

■ 프로그래밍 SKILLS/JAVA

[ JAVA ] Object 클래스

업그레이드중 2024. 8. 11. 22:54
반응형

 

 


 

■ java.lang 패키지 에 관하여 알아보자 !

•  자바 언어를 이루는 가장 기본이 되는 클래스들을 보관하는 패키지

•  java.lang 패키지의 대표적인 클래스
-  Object : 모든 자바 객체의 부모 클래스
-  String : 문자열
-  Integer, Long, Double : 래퍼타입 , 기본형 데이터 타입을 객체로 만든 것

 

 

 

Object 클래스

 

•  자바에서 모든 클래스의 최상위 부모 클래스는 항상 Object 클래스이다.

•  객체의 정보를 제공한다던가, 같은지 비교한다던가 라는 모든 객체에게 필요한 기본 기능 제공

•  Object 클래스는 모든 객체에게 필요한 공통 기능을 제공하므로, 다른 개발자가 코딩을 한다 해도 프로그래밍을 단순화하고

    일관성을 가지게 한다.

•  Object는 모든 객체를 대상으로 다형적 참조가 가능하다.

•  Object를 통해 전달받은 객체를 호출하기 위해서는 각각의 객체에 맞는 다운캐스팅 과정이 필요하다.

    ( Object 클래스에 속하지 않은 메서드와 같은 객체의 기능을 호출하기 위해서 )

 

 

※  다운 캐스팅 이란 ?

•  객체의 타입을 상위클래스에서 하위클래스로 변환하는 것

•  상위클래스 참조 변수를 통해 하위 클래스의 특정 메서드 or 필드에 접근이 가능해진다

•  다운캐스팅 전에 instanceOf 연산자를 사용하여 객체의 실체 타입을 확인하는것이 좋다

 

class Animal {
    public void move() {
        System.out.println("움직입니다.");
    }
}

class Dog extends Animal {
    public void bark() {
        System.out.println("멍멍");
    }
}

public class DowncastingExample {
    public static void main(String[] args) {
        Animal animal = new Dog(); // 업캐스팅
        Dog dog = (Dog) animal; // 다운캐스팅

        dog.bark(); // 다운캐스팅 후 하위 클래스의 메소드 호출
    }
}

 

 


 

 

Object 클래스의 주요 메서드

 

 

1) equals( )

•  객체의  동등성을 비교한다.

•  equals( ) 와 hashCode( ) 는 보통 함께 사용된다.

•  실무에서는 IDE 가 자동으로 만들어주는 equals( ) 를 사용한다.

 

 

 

※ 자바에서 두 객체가 같다는 두가지로 제공

•  동일성( Identity ) :  == 연산자를 사용하여 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인 ( 참조값 확인 )

•  동등성( Equality ) :  equals( ) 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인

 

package lang.object.equals;

public class UserV1 {

    private String id1;

    public UserV1(String id1) {
        
        this.id1 = id1;
    }
}

 

package lang.object.equals;

public class EqualsMainV1 {

    public static void main(String[] args) {
        UserV1 user1 = new UserV1("id-100");
        UserV1 user2 = new UserV1("id-100");

        System.out.println("identity = " + (user1 == user2));
        System.out.println("equality = " + (user1.equals(user2)));

    }
}

 

// 실행 결과
// eqaulity( 동등성 ) 이 false 가 나온것은 equals() 메서드가 기본적으로 == 동일성 비교 제공
identity = false
equality = false

 

 

•  Java 에서 Object 클래스에서 정의되어 있는 equals() 메서드

-  기본적으로 == 동일성 비교를 기본으로 제공

-  동등성 비교를 사용하기 위해서는, equals() 메서드를 재정의 해야한다.

 

public boolean equals(Object obj) {
    return (this == obj);
}

 

 

•  재정의(오버라이딩) 을 사용하여  equals() 메서드 사용

-  user1, user2 서로 다른 객체지만 둘다 같은 id를 가지고 있다 따라서, 동등하다

-  실무에서는 IDE가 자동으로 만들어주는 equals() 사용

 

package lang.object.equals;

import java.util.Objects;

public class UserV2 {

    private String id;

    public UserV2(String id) {
        this.id = id;
    }

//    @Override
//    public boolean equals(Object obj) {
//
//        UserV2 user = (UserV2) obj;
//
//        return  id.equals(user.id);
//
//    }


// 단축키를 사용하여 equals() 재정의 코드 자동 구현
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        UserV2 userV2 = (UserV2) o;
        return id.equals(userV2.id);
    }

}

 

package lang.object.equals;

public class EqualsMainV2 {

    public static void main(String[] args) {

        UserV2 user1 = new UserV2("id-100");
        UserV2 user2 = new UserV2("id-100");

        System.out.println("identity = " + (user1 == user2));
        System.out.println("equality = " + (user1.equals(user2)));
    }
}

 

// 실행 결과

identity = false
equality = true

 

 


 

 

 

2) toString( )

•  객체의 정보를 문자열 형태로 제공한다.

•  디버깅과 로깅에 유용하게 사용된다.

•  모든 클래스에서 상속받아 사용이 가능하다.

•  System.out.println() 메서드도 Object 매개변수를 사용하고 내부에서 toString()을 호출

   따라서, System.out.println()을 사용하면 세상의 모든 객체의 정보를 편리하게 출력 가능

 

 

•  Object가 제공하는 toString( ) 메서드는 패키지를 포함한 객체의 이름과 객체의 참조값를 16진수로 제공

 

package lang.object.tostring;

public class ToStringMain1 {

    public static void main(String[] args) {
        Object object = new Object();
        String string = object.toString();

        //toString()의 반환값 출력
        System.out.println(string);

        //object 직접 출력
        System.out.println(object);
    }
}

 

// 실행 결과

java.lang.Object@b4c966a
java.lang.Object@b4c966a

 

 

•  toString( ) 메서드를 재정의( 오버라이딩 )하여 유용한 정보를 제공하는것이 일반적이다.

 

 

•  아래 예시의 경우

-  print( ) 메서드의 매개변수로 Obj obj 인데 인수로 dog(Dog)가 전달된다.

-  메서드 내에서 obj.toString( ) 을 호출

-  Object에 있는 toString( )을 찾는데 이 때, 자식에 재정의(오버라이딩) 된 메서드가 있는지 찾아본다.

-  Dog 클래스에 재정의된 메서드가 있기때문에 Dog.toString( ) 을 실행한다.

 

// Car 클래스
// Car 클래스는 toString( ) 을 재정의하지 않는다.

package lang.object.tostring;

public class Car {

    private String carName;

    public Car(String carName) {

        this.carName = carName;
    }
}

 

// Dog 클래스
// toString( ) 메서드를 재정의 하였다.


package lang.object.tostring;

public class Dog {

    private String dogName;
    private int age;

    public Dog(String dogName, int age) {
        this.dogName = dogName;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "dogName='" + dogName + '\'' +
                ", age=" + age +
                '}';
    }
}

 

// Object 타입을 매개변수로 사용하여, 다형적 참조를 사용
// ( 세상의 모든 객체 인스턴스를 인수로 받을수 있다.)
// Object 클래스는 모든 클래스의 부모이기에, toString() 메서드를 오버라이딩 가능하다


package lang.object.tostring;

public class ObjectPrinter {
    public static void print(Object object) {
        String string = "객체 정보 출력: " + object.toString();
        System.out.println(string);
    }
}

 

package lang.object.tostring;

public class ToStringMain2 {

    public static void main(String[] args) {

        Car car = new Car("ModelY");
        Dog dog1 = new Dog("멍멍이1", 2);
        Dog dog2 = new Dog("멍멍이2", 5);

        System.out.println("1.단순 toString 호출");
        System.out.println(car.toString());
        System.out.println(dog1.toString());
        System.out.println(dog2.toString());

        System.out.println("2.println 내부에서 toString 호출");
        System.out.println(car);
        System.out.println(dog1);
        System.out.println(dog2);

        System.out.println("3.Object 다형성 활용");
        ObjectPrinter.print(car);
        ObjectPrinter.print(dog1);
        ObjectPrinter.print(dog2);

    }
}

 

// 출력 결과

1.단순 toString 호출
lang.object.tostring.Car@4e50df2e
Dog{dogName='멍멍이1', age=2}
Dog{dogName='멍멍이2', age=5}

2.println 내부에서 toString 호출
lang.object.tostring.Car@4e50df2e
Dog{dogName='멍멍이1', age=2}
Dog{dogName='멍멍이2', age=5}

3.Object 다형성 활용
객체 정보 출력: lang.object.tostring.Car@4e50df2e
객체 정보 출력: Dog{dogName='멍멍이1', age=2}
객체 정보 출력: Dog{dogName='멍멍이2', age=5}

 

 

 

 

※ 해당 내용은 인프런 김영한 강사님의  "실전 자바 중급1" 인강의 참고자료와 예시들을 참고하였습니다

반응형
Comments