package ex_object;
public class Ex3 {
public static void main(String[] args) {
/*
* 4. toString() 메서드
*
*/
Person p1 = new Person("홍길동", 20);
System.out.println("객체 p1의 정보 : " + p1.toString()); // ex_object.Person@15db9742 출력!
// => toString() 메서드를 호출하면 "클래스명@해시코드값" 형태로 문자열 리턴
// 출력문 내에서 참조변수 뒤에 toString() 메서드를 생략해도 toString() 결과가 출력
System.out.println("객체 p1의 정보 : " + p1); // p1.toString() 와 동일한 결과
System.out.println("=========================================");
ToStringPerson p2 = new ToStringPerson("홍길동", 20);
// toString() 메서드 오버라이딩 후에는 해당 객체의 멤버변수 값을 출력할 경우
// 출력문에서 객체명.toString() 메서드를 호출하거나 toString() 메서드 없이
// 객체명만으로 출력해도 멤버변수 값이 리턴되어 출력
System.out.println("객체 p2의 정보 : " + p2.toString()); // 홍길동, 20 출력
System.out.println("객체 p2의 정보 : " + p2); // toString() 메서드가 생략!
// String person = p2; // 오류 발생!
String person = p2.toString();
// toString() 메서드가 적용된 대표적인 예 : String 클래스
String str = "홍길동";
System.out.println(str); // toString() 메서드 생략되어 있음!
System.out.println(str.toString()); // 정석적인 문법
}
}
// Person 클래스 내에서 toString() 메서드를 오버라이딩하여
// 이름과 나이 변수의 값을 문자열로 결합하여 리턴하도록 구현
class ToStringPerson {
String name;
int age;
public ToStringPerson(String name, int age) {
super();
this.name = name;
this.age = age;
}
// Object 클래스의 toString() 메서드 오버라이딩
// @Override
// public String toString() {
// // 멤버변수 name과 age 값을 문자열로 결합하여 리턴
// return name + ", " + age;
//
// }
// toString() 메서드 자동 오버라이딩 단축키 : Alt + Shift + S -> s
@Override
public String toString() {
return "ToStringPerson [name=" + name + ", age=" + age + "]";
}
}
연습
package ex_object;
public class Test3 {
public static void main(String[] args) {
// 2명의 계좌 생성
// 1) 계좌번호 : 111-1111-111, 예금주명 : 홍길동, 현재잔고 : 1000
// 2) 계좌번호 : 111-1111-111, 예금주명 : 홍길동, 현재잔고 : 1000
Account acc1 = new Account("111-1111-111", "홍길동", 1000);
Account acc2 = new Account("111-1111-111", "홍길동", 4000);
// equals() 메서드를 호출하여 두 객체가 같은지 판별하여
// "두 계좌는 동일!" 또는 "두 계좌는 다름!" 출력
if (acc1.equals(acc2)) {
System.out.println("두 계좌는 동일!");
} else {
System.out.println("두 계좌는 다름!");
}
// toString() 메서드를 호출하여 계좌번호, 예금주명, 현재잔고를 출력
// System.out.println(acc1.toString());
System.out.println(acc1);
System.out.println(acc2);
}
}
/*
* Account 클래스 정의
* 멤버변수 : 계좌번호(accountNo, String 타입), 예금주명(ownerName, String 타입), 현재잔고(balance, int 타입)
* 생성자 : 계좌번호, 예금주명, 현재잔고를 전달받아 초기화하는 생성자
* equals() 메서드 오버라이딩 - 단축키X, null값 비교는 생략, 멤버변수 값만 비교
* toString() 메서드 오버라이딩
* ex) 계좌번호 = 111-1111-111, 예금주명 = 홍길동, 현재잔고 = 1000 원
*
*/
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;
}
// Object 클래스의 equals() 메서드 오버라이딩
@Override
public boolean equals(Object obj) {
// Account 클래스의 멤버변수 비교
// 전달받은 obj의 객체 멤버변수에 접근하기 위해 다운캐스팅 필요!
Account acc = (Account) obj;
if (accountNo.equals(acc.accountNo)) {
if (ownerName.equals(acc.ownerName)) {
if (balance == acc.balance) {
return true; // 모든 멤버변수 값이 일치할 경우 true 값 리턴
}
}
}
// if (accountNo.equals(acc.accountNo) && ownerName.equals(acc.ownerName) && balance == acc.balance) {
// return true;
//
// }
// if (accountNo.equals(acc.accountNo)) {
// return true;
// } else if (ownerName.equals(acc.ownerName)) {
// return true;
// } else if (balance == acc.balance) {
// return true;
// }
// => OR 연산자랑 동일한 코드
return false;
}
@Override
public String toString() {
return "계좌번호 = " + accountNo + ", 예금주명 = "
+ ownerName + ", 현재잔고 = " + balance + " 원";
}
}
```