Object 클래스
- java.lang 패키지에 위치하는 클래스
- 모든 클래스의 슈퍼클래스(최상위클래스)
-> 상속을 표현하지 않으면 자동으로 상속되는 클래스
- Object 클래스의 모든 멤버는 다른 클래스에서 사용 또는 오버라이딩 가능
1. equals() 메서드(public boolean equals(Object o) {})
- 두 객체가 같은지 동등비교(==) 수행
=> 즉, 두 객체의 주소값을 비교하여 같으면 true, 다르면 false 리턴
- 실제 '두 객체가 같다'는 의미는 두 객체의 주소값 비교가 아닌 객체가 가지는 멤버변수가 같다는 의미로 사용됨
=> 따라서, 사용자가 정의하는 클래스에 Object 클래스로부터 상속받은 equals() 메서드를 오버라이딩 하여 각 객체의 멤버변수끼리 비교하도록 수정하여 사용함
- 자바에서 제공하는 대부분의 클래스(API)들은 Object 클래스의 equals() 메서드를 오버라이딩 해 놓았으므로 객체 내용 비교가 가능함
ex) String 클래스, ArrayList 클래스 등
- equals() 메서드 자동 생성(오버라이딩) 기능을 활용하여 쉽게 구현
-> Alt+Shift+S->H
class Person {
String name;
String jumin;
public Person(String name, String jumin) {
super();
this.name = name;
this.jumin = jumin;
}
}
class OverridePerson { // class OverridePerson extends Object
String name;
String jumin;
public OverridePerson(String name, String jumin) {
super();
this.name = name;
this.jumin = jumin;
}
// Object 클래스의 equals() 메서드 오버라이딩
// Person 클래스의 모든 멤버변수를 비교하여
// 하나라도 다를 경우 false를 리턴, 모두 같은 경우 true 리턴하도록 수정
@Override
public boolean equals(Object obj) {
// 주의! equals() 메서드 파라미터로 객체를 전달하면
// 해당 객체는 Object 타입으로 업캐스팅이 일어나는데
// 이로 인해 해당 객체 고유의 멤버에는 접근이 불가능해짐
// => 따라서, 다시 해당 객체 타입으로 다운캐스팅이 필요함!
// OverridePerson other = (OverridePerson)obj // Object -> OverridePerson
// => 무조건 변환하기 보다 instanceof 연산자로 판별하면 더 안전함
if(obj instanceof OverridePerson) {
OverridePerson p = (OverridePerson)obj; // Object -> OverridePerson
// 다운캐스팅 된 객체(p)의 멤버변수와 현재 인스턴스의 멤버변수를
// 각각 비교 후 같으면 true 리턴, 다르면 false 리턴
// => 문자열끼리의 비교이므로 String 클래스의 equals() 로 비교
if(name.equals(p.name) && jumin.equals(p.jumin)) {
// 이름과 주민번호가 모두 같을 경우 true 리턴
return true;
}
}
// 두 객체의 변수가 하나라도 다르거나
// instanceof 연산 결과가 false 일 경우 false 리턴
return false;
}
// Alt + Shift + S -> H 단축키로 equals() 메서드를 오버라이딩
// => 같이 생성되는 HashCode() 메서드는 삭제해도 무방!
// @Override
// public boolean equals(Object obj) {
// if (this == obj)
// return true;
// if (obj == null)
// return false;
// if (getClass() != obj.getClass())
// return false;
// OverridePerson other = (OverridePerson) obj;
// return Objects.equals(jumin, other.jumin) && Objects.equals(name, other.name);
// }
}
Person p1 = new Person("홍길동", "031010-3123456");
Person p2 = new Person("홍길동", "031010-3123456");
System.out.println("p1의 객체 정보 : " + p1);
System.out.println("p2의 객체 정보 : " + p2);
// 참조변수에 대한 동등비교(==) 수행
if(p1 == p2) { // 객체 p1 과 p2 에 저장된 주소값 비교
System.out.println("두 객체의 주소값이 같다! (==)");
} else {
System.out.println("두 객체의 주소값이 다르다! (==)");
}
// 참조변수에 대한 Object 클래스의 equals() 메서드를 통한 비교 수행
if(p1.equals(p2)) { // 동등비교 연산(==) 과 동일한 결과를 수행
System.out.println("두 객체의 주소값이 같다! (equals())");
} else {
System.out.println("두 객체의 주소값이 다르다! (equals())");
}
System.out.println("-----------------------------------------");
// Person 타입 변수 p3 에 p2 변수의 주소값을 복사
Person p3 = p2;
System.out.println("p2의 객체 정보 : " + p2);
System.out.println("p3의 객체 정보 : " + p3);
// 참조변수에 대한 동등비교(==) 수행
if(p3 == p2) { // 객체 p3 과 p2 에 저장된 주소값 비교
System.out.println("두 객체의 주소값이 같다! (==)");
} else {
System.out.println("두 객체의 주소값이 다르다! (==)");
}
// 참조변수에 대한 Object 클래스의 equals() 메서드를 통한 비교 수행
if(p3.equals(p2)) { // 동등비교 연산(==) 과 동일한 결과를 수행
System.out.println("두 객체의 주소값이 같다! (equals())");
} else {
System.out.println("두 객체의 주소값이 다르다! (equals())");
}
// => Object 클래스 내의 equals() 메서드는 두 객체의 주소값을 비교한다!
System.out.println("========================================");
OverridePerson p10 = new OverridePerson("홍길동", "031010-3123456");
OverridePerson p11 = new OverridePerson("홍길동", "031010-3123456");
System.out.println("p10의 객체 정보 : " + p10);
System.out.println("p11의 객체 정보 : " + p11);
2. toString() 메서드(public String toString() {})
- 어떤 객체의 정보를 문자열로 변환하여 리턴
- 기본적으로 Object 클래스의 toString() 메서드는 객체의 정보(= 주소값)를 문자열로 리턴하도록 정의되어 있음
- 일반적으로 객체의 정보는 객체 내의 멤버변수에 저장된 데이터(속성값)를 의미하므로 Object 클래스의 toString() 메서드를 오버라이딩하여 객체가 가진 멤버변수값을 문자열로 결합하여 리턴하도록 해야함
- 출력문 내에는 toString() 메서드 생략 가능(참조변수명만 사용 가능)
- 자바에서 제공하는 대부분의 클래스(API)들은 toString() 메서드가 오버라이딩 되어 있으므로 객체에 저장된 값을 문자열로 리턴받기 가능
ex) String 클래스, ArrayList 클래스 등
- equals() 메서드와 마찬가지로 단축키를 통한 자동 생성 가능
-> Alt + Shift + s -> s
class Person2 {
String name;
int age;
String jumin;
public Person2(String name, int age, String jumin) {
super();
this.name = name;
this.age = age;
this.jumin = jumin;
}
}
class Person3 {
String name;
int age;
String jumin;
public Person3(String name, int age, String jumin) {
super();
this.name = name;
this.age = age;
this.jumin = jumin;
}
// @Override
// public String toString() {
// // 현재 인스턴스가 가진 멤버들을 모두 문자열로 결합하여 리턴
// // -> 결합하는 형태(출력 모양)는 개발자가 알아서 결정
//
// return "이름 :" + name + ", 나이: " + age + ", 주민번호: " + jumin;
// }
// toString() 메서드 자동 생성(오버라이딩) 단축키: Alt+Shift+S -> S
@Override
public String toString() {
return "Person3 [name=" + name + ", age=" + age + ", jumin=" + jumin + "]";
}
}
String str = new String("자바"); // String 타입도 객체이다!
System.out.println(str); // toString() 메서드가 생략되어 있음!(문자열 출력)
System.out.println(str.toString()); // 위의 결과와 동일함(문자열 출력)
Person2 p = new Person2("홍길동", 20, "031010-3123456");
System.out.println("사람 p의 정보: "+ p.toString());
System.out.println("사람 p의 정보: "+ p);
// -> println() 메서드 내에서 p객체 정보 출력 시 toString() 생략 가능
// 출력문이 아닌 결과값을 변수에 저장하는 경우 반드시 toString() 필수!
String personInfo = p.toString();
// Object 클래스의 toString()메서드는 "클래스명@주소값" 형태의 문자열로 리턴
// -> 주소값은 16진수로 변환되어 문자열로 결합됨
System.out.println("Person2 p의 클래스명: " + p.getClass().getName());
System.out.println("Person2 p의 주소값: " + p.hashCode());
System.out.println("----------------------------------");
Person3 p2 = new Person3("홍길동", 20, "031010-3123456");
System.out.println("p2의 객체의 정보: " + p2.toString());
System.out.println("p2의 객체의 정보: " + p2);
TEST
/*
* Account 클래스 정의
* - 멤버변수
* 계좌번호(accountNo, 문자열), 예금주명(ownerName, 믄지열)
* 현재잔고(balance, 정수)
* - 생성자: 계좌번호, 예금주명, 현재잔고를 전달받아 초기화
* - equals() 메서드 오버라이딩 하여 계좌 정보를 비교하도록 정의
* - toString() 메서드 오버라이딩 하여 계좌 정보를 문자열로 리턴하도록 정의
*/
class Account {
String accountNo;
String ownerName;
int balance;
public Account(String accountNo, String ownerName, int balance) {
super();
this.accountNo = accountNo;
this.ownerName = ownerName;
this.balance = balance;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Account other = (Account) obj;
return Objects.equals(accountNo, other.accountNo) && balance == other.balance
&& Objects.equals(ownerName, other.ownerName);
}
@Override
public String toString() {
return "Account [accountNo=" + accountNo + ", ownerName=" + ownerName + ", balance=" + balance + "]";
}
}
Account acc = new Account("111-1111-111","춘식이",10000);
System.out.println("acc의 계좌 정보:" + acc);
Account acc2 = new Account("111-1111-111", "춘식이", 10000);
if(acc.equals(acc2)) {
System.out.println("두 계좌는 동일한 계좌입니다!");
} else {
System.out.println("두 계좌는 다른 계좌입니다!");
}
'⛏️ > JAVA' 카테고리의 다른 글
[JAVA] 30. Wrapper 클래스 (1) | 2023.10.17 |
---|---|
[JAVA] 29. String (0) | 2023.10.11 |
[JAVA] 27. 인터페이스 (0) | 2023.10.05 |
[JAVA] 26. 추상 메서드, 추상 클래스 (0) | 2023.10.05 |
[JAVA] 25. 상수 (0) | 2023.10.05 |