[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 |