본문 바로가기
Spring

[1] 자바 중급 문법 1

by 민지기il 2025. 3. 19.

[1] Object 클래스

: 자바에서 모든 클래스의 최상위 부모 클래스임 (생략 되어 있지만 extends Object 하고 있음)

역할) 모든 객체에게 필요한 기본 기능이므로 항상 새로운 메서드를 정의하지 않고 사용하는 것

ex) toString(), equals(), getClass() 등등

1) 다형성 -- 다운 캐스팅

public class ObjectPolyExample1 {
    public static void main(String[] args){
        Dog dog = new Dog();
        Car car = new Car();

        action(dog);
        action(car);
    }
    //다운 캐스팅
    private static void action(Object obj){
        //obj.sound()하면 obj는 모른다. -> 다운 캐스팅 필요
        if(obj instanceof Dog dog){
            dog.sound();
        } else if (obj instanceof Car car){
            car.move();
        }
    }
}

2) Object 배열

public class ObjectPolyExample2 {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Car car = new Car();
        Object object = new Object();

        Object[] objects = {dog,car,object};
        size(objects);
    }
    private static void size(Object[] objects) {
        System.out.println("전달된 객체 수는:" +objects.length);
    }
}

size(Object[] objects) 메서드는 배열에 담긴 객체의 수를 세는 역할임

Object 배열은 모든 객체를 담을 수 있음 

 

3) toString() 

public class ToStringMain1 {
    public static void main(String[] args) {
        Object object = new Object();
        String string = object.toString();
        //toString() 반환값 출력
        System.out.println(object);
        System.out.println(string);
    }
}

 

: Object.toString() 메서드가 클래스 정보 & 참조값을 제공함

따라서 상단의 코드는 같은 값을 출력함 ex) java.lang.Object@734469...

public class Car {
    private String carName;
    public Car(String carName){
        this.carName = carName;
    }
}
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 "dogName" + dogName + "/" + "age" +age;
    }
}
public class ObjectPrinter {
    public static void print(Object obj) {
        String string = "객체 정보 출력:" + obj.toString();
        System.out.println(string);
    }
}

obj.toString()으로 예를 들어 Car 인스턴스에 들어가면 부모의 Object 클래스가 있으므로 toString()이 호출됨

이런 설정에 아래와 같은 print를 해봄

public class ToStringMain2 {
    public static void main(String[] args) {
        Car car = new Car("model Y");
        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으로 호출");
        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);
    }
}

모든 같은 값을 출력함

 

[2] equals -- 동일성 & 동등성

- 동일성 (identity): == 연산자로 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인; 물리적으로 같은 메모리에 있는 객체 인스턴스인지 참조값을 확인함

- 동등성 (equality): equals() 메서드로 두 객체가 논리적으로 동등한지 확인

public class UserV1 {
    private String id;

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

public class EqualsMainV1 {
    public static void main(String[] args) {
        UserV1 user1 = new UserV1("id-100");
        UserV1 user2 = new UserV1("id-200");
        System.out.println("identity = "+ (user1==user2));
        System.out.println("equal = " + (user1.equals(user2)));
    }
}

이렇게 하면 false가 나온다. user1.equals(users)로 해도 false가 나온다

<개선> -- equals 클래스를 만들어야 함

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); //String 비교에는 equlas 사용

    }
    //개선 
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        UserV2 user = (UserV2) obj;
        return id.equals(user.id);
    }

}
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("equal = " + (user1.equals(user2)));
    }
}

이러면 false, true가 나온다.

 

'Spring' 카테고리의 다른 글

[3] 자바 중급 문법 3 -- 날짜와 시간  (0) 2025.03.21
[2] 자바 중급 문법 2  (0) 2025.03.21
[8] 소셜 로그인 구현 2  (0) 2025.03.18
[9] 상품 생성  (0) 2025.03.18
[7] 소셜 로그인 구현  (0) 2025.03.12