Object class 중, clone(), equals(), hashCode(), toString() 메서드

- 자바 API는 다양한 클래스들을 제공하는데, 그 중 java.lang 패키지에는 자바 프로그래밍에 기본적이고 다양한 클래스들이 다수 포함되어 있다. 


- API란? (위키백과 참고)

API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다. 주로 파일 제어, 창 제어, 화상 처리, 문자 제어 등을 위한 인터페이스를 제공한다.


Object class

: 자바의 모든 클래스가 직접 또는 간접적으로 상속받는 최상위 클래스. 자바 클래스의 기본 특징을 결정짓고, 따라서 모든 클래스는 Object클래스를 상속받아 메서드를 사용할 수 있으며, 재정의 할 수 있다.

clone()

: 객체의 복사는 얕은복사(참조값만을 복사) & 깊은복사(메모리를 복사)로 나뉜다.


1
2
3
4
5
6
7
8
9
10
11
12
package chapter14.javaBasicClass;
 
public class CloneTest implements Cloneable{
    public int x;
    public int y;
 
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
 
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package chapter14.javaBasicClass;
 
public class CloneTestMain {
 
    public static void main(String[] args) {
        CloneTest c1 = new CloneTest(); //CloneTest의 객체 생성.
        CloneTest c2 = null;
 
        try {
            c2 = (CloneTest) c1.clone(); //생성한 c1객체의 clone()메서드로 객체를 복사한다.
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
 
        c1.x = 10;
        c1.y = 20;
 
        c2.x = 30;
        c2.y = 40;
 
        System.out.println("c1.x = " + c1.x + ", c1.y = " + c1.y); //c1의 멤버변수 출력
        System.out.println(c1); //c1의 참조값 출력
 
        System.out.println("c2.x = " + c2.x + ", c2.y = " + c2.y);
        System.out.println(c2);
    }
}
 
cs









-> 결과를 확인해보면, c1과 c2의 타입은 동일하지만, 메모리는 따로 사용하고 있음(깊은복사)을 알 수 있다.



equals()

: 기본 타입의 변수들은 두 값이 같은지를 '=='연산자로 확인하지만, 객체는 equals() 메서드를 통해 확인한다. 두 객체가 같으면 true, 다르면 false를 반환, 두 객체의 참조값을 비교


1
2
3
4
5
package chapter14.javaBasicClass;
public class EqualsTest {
    public int x;
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package chapter14.javaBasicClass;
 
public class EqualsTestMain {
 
    public static void main(String[] args) {
        EqualsTest e1 = new EqualsTest();
        EqualsTest e2 = new EqualsTest();
        
        e1.x = 1;
        e2.x = 1;
        System.out.println(e1.equals(e2));
        
    }
 
}
 
//EqualsTest 클래스가 equals()를 재정의 하지 않아 equals()가 단순히 참조값만 비교하기 때문에
//결과는 false.
 
cs


----------------------------------------------------------------------------------------------------------------------------------------


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package chapter14.javaBasicClass;
 
public class EqualsTest {
    public int x;
 
    @Override
    public boolean equals(Object obj) {    //equals()를 재정의함.
        if (obj instanceof EqualsTest) { //파마리터의 타입이 현재 클래스와 동일하다면, 
//안쪽의 if문에서 두 멤버변수의 값이 동일한지 비교한다.
            EqualsTest var = (EqualsTest) obj;
            if (this.x == var.x) {
                return true;
            }
        }
        return false;
    }
}

cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package chapter14.javaBasicClass;
 
public class EqualsTestMain {
 
    public static void main(String[] args) {
        EqualsTest e1 = new EqualsTest();
        EqualsTest e2 = new EqualsTest();
        
        e1.x = 1;
        e2.x = 1;
        System.out.println(e1.equals(e2));
        
    }
 
}

//EqualsTest 클래스에서 equals()를 재정의했다. e1과 e2의 타입이 동일하고, 멤버변수 x의 값도 동일하기 때문에, 
//결과는 true
cs


----------------------------------------------------------------------------------------------------------------------------------------


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package chapter14.javaBasicClass;
 
import java.util.Scanner;
 
public class StrEqualsMain {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        String id = "test";
        String pwd = "1234";
 
        System.out.println("id : ");
        String id_str = sc.next(); // 문자열로 입력받은 값을 id_str에 저장
 
        System.out.println("pwd : ");
        String pwd_str = sc.next(); // 문자열로 입력받은 값을 pwd_str에 저장
 
        if (id.equals(id_str) && pwd.equals(pwd_str)) { // 클래스의 멤버변수 id와 pwd가 입력받은 값과 동일하다면.
            System.out.println("로그인 성공");
        } else {
            System.out.println("로그인 실패");
        }
 
        sc.close(); // scanner는 닫아주는게 원칙
    }
 
}
 
//String클래스의 equals()는 대소문자를 구분한다.
 
cs



hashCode()

: 객체가 할당 받은 메모리에 맵핑되는 유일한 정수. hashCode()는 이 값을 반환해준다.

자바는 메모리 사용의 안정성을 위해서, 애플리케이션이 메모리에 직접 접근하는 걸 피한다. 그래서 객체가 new로 생성되면 자바 시스템이 객체가 사용할 메모리를 할당하고 이 메모리에 접근할 수 있는 티켓인 해시코드를 생성해 그 값을 반환하는데 이것이 참조값이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package chapter14.javaBasicClass;
 
class Test{
    public int x;
    public int y;
}
 
public class HashTestMain {
 
    public static void main(String[] args) {
        //t1과 t3은 new연산자를 통해 객체를 생성하고, t2는 t1의 참조값을 복사한다.
        Test t1 = new Test();
        Test t2 = t1;    
        Test t3 = new Test();
        
        System.out.println("t1.hashCode() : " + t1.hashCode());
        System.out.println("t2.hashCode() : " + t2.hashCode());
        System.out.println("t3.hashCode() : " + t3.hashCode());
    }
 
}
//t2는 t1의 참조값을 복사했으므로 두 객체의 해시 코드가 동일하다.
cs










toString()

: 해당 객체가 어떤 객체인지를 나타내는 문자열을 반환한다.

그래서 사람들이 메서드의 결과를 읽고 쉽게 이해할 수 있도록 만드는 것이 좋으며, 디버깅에서도 유용하게 사용된다.

Object class의 toString()은 "클래스명@hash Code"를 반환하도록 구현되어 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package chapter14.javaBasicClass;
 
public class Member {
    private String name;
    private String tel;
    private String address;
 
    public Member(String name, String tel, String address) {
        this.name = name;
        this.tel = tel;
        this.address = address;
    }
    
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getTel() {
        return tel;
    }
 
    public void setTel(String tel) {
        this.tel = tel;
    }
 
    public String getAddress() {
        return address;
    }
 
    public void setAddress(String address) {
        this.address = address;
    }
 
    @Override
    public String toString() {
        return "Member [name=" + name + ", tel=" + tel + ", address=" + address + "]";
    }
 
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package chapter14.javaBasicClass;
 
class Test2 {
    public int x;
    public int y;
}
 
public class MemberMain {
 
    public static void main(String[] args) {
        System.out.println("toString()을 재정의하지 않은 객체 출력");
        Test2 t1 = new Test2();
        System.out.println("t1 : " + t1);
        System.out.println("t1.toString() : " + t1.toString());
 
        System.out.println();
 
        System.out.println("toString()을 재정의한 객체 출력");
        Member m1 = new Member("aaa""111""서울시");
        Member m2 = new Member("bbb""222""경기도");
        System.out.println("m1 : " + m1);
        System.out.println("m2 : " + m2);
 
    }
 
}
cs

















댓글

Designed by JB FACTORY