•
모든 클래스의 조상
→ 클래스 선언 시 자동으로 컴파일러에 올라간다.
class Sample extends Object {
// extends Object 부분은 작성하지 않아도 있는 것 처리된다.
}
Java
복사
•
java.lang 안에 있다.
•
왜 모든 클래스의 조상인가?
→ 자주 쓰이는 함수들을 Override 하기 위해서
자주 쓰는 메서드
1. equals() 메서드
•
== 로 객체의 주소가 동일한지 확인
•
true / false 를 리턴한다.
예제 코드
public class Equals {
public static void main(String[] args) {
Circle circle1 = new Circle(10);
Circle circle2 = new Circle(10);
System.out.println("circle1 의 주소값(해쉬코드): " + circle1);
System.out.println("circle2 의 주소값(해쉬코드): " + circle2);
// 주소 비교
if(circle2 == circle1) {
System.out.println("두 개의 원은 같습니다.");
} else {
System.out.println("두 개의 원은 같지 않습니다.\n\n");
}
// Circle 내부의 radius 값 비교
if(circle2.equals(circle1)) {
System.out.println("두 개의 원은 같습니다.");
} else {
System.out.println("두 개의 원은 같지 않습니다.");
}
}
}
Java
복사
class Circle {
private int radius;
public int getRadius() {
return radius;
}
public Circle(int radius) {
this.radius = radius;
}
}
Java
복사
결과 화면
circle1 의 주소값(해쉬코드): edu.lion.car.sep29.Circle@4f3f5b24
circle2 의 주소값(해쉬코드): edu.lion.car.sep29.Circle@15aeb7ab
두 개의 원은 같지 않습니다.
두 개의 원은 같지 않습니다.
Java
복사
equals() 메서드는 주소를 비교하기 때문에 위 코드에서 false 를 리턴한다.
Circle 클래스에서 equals() 메서드를 재정의 한다면, 내부 값을 비교하게 할 수 있다.
→ Object 클래스의 equals() 메서드를 오버라이딩
public boolean equals(Circle c1){
if(this.radius == c1.getRadius()){
return true;
} else {
return false;
}
}
Java
복사
객체의 radius 를 비교하도록 설정하면 true 를 리턴하게 된다.
다형성을 활용하기 위해서, equals() 메서드의 parameter를 Object 로 설정할 수 있다.
@Override
public boolean equals(Object obj){
if(obj instanceof Circle2){
Circle2 c1 = (Circle2) obj; // obj 안에 Circle2가 있으므로 형변환 가능
if(this.radius == c1.getRadius()){
return true;
} else {
return false;
}
}
return true;
}
Java
복사
Object 는 모든 클래스의 부모 클래스이므로, 형변환을 쉽게 할 수 있다.
2. toString() 메서드
•
객체의 문자정보를 리턴하는 메서드이다.
•
hashcode가 주소를 한 번 바꿔준다
public class toStringTest {
public static void main(String[] args) {
Object obj = new Object();
// toString()도 Object 클래스 안에 들어있어서 사용 가능
System.out.println(obj.toString());
System.out.println(obj + "\n\n\n");
toString_INum num1 = new toString_INum(10);
System.out.println(num1.toString());
System.out.println(num1);
}
}
class toString_INum {
private int num;
public toString_INum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}
Java
복사
print 함수의 parameter는 Object obj이다.
→ 매개변수 obj가 null이 아니면 toString()을 출력한다.
객체변수를 println 에 넣으면 주소가 출력된다.
equals() 와 마찬가지로 toString() 도 클래스에서 재정의 해주어야 원하는 출력을 얻을 수 있다. (아래 예제코드 참고)
public class toStringTest_2 {
public static void main(String[] args) {
Student s = new Student("홍길동", "남자");
System.out.println(s);
// toString이 정의되어 있지 않다면, s에서는 주소(해쉬코드)가 출력된다.
// toString을 Student에서 재정의 해야 원하는 출력이 나온다.
}
}
class Student {
private String name;
private String gender;
public Student(String name, String gender){
this.name = name;
this.gender = gender;
}
public String toString(){
// toString을 재정의 해주었다.
return "이름은 " + this.name + "이고 성별은 " + this.gender + "입니다.";
}
}
Java
복사
결과 화면
이름은 홍길동이고 성별은 남자입니다.
Java
복사
Student 클래스에서 toString() 메서드를 재정의 했다. 따라서 toString() 을 호출해도 주소가 나오지 않고, 재정의한 리턴 값이 나오게 된다.