ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 자바 기본 API(Object 클래스)
    IT/개발(자바, 서블릿, 스프링 등) 2020. 1. 18. 11:31

    이번에는 자바 API 중에서 java.lang 패키지에 있는 기본 API 중 Object, String, StringBuffer, StringBuilder, Math 클래스에 대해 자주 사용하는 기능 위주로 살펴보겠다. 가장 먼저 Object 클래스에 대해 알아보겠다.

     

    1. Object 클래스

    Object 클래스는 모든 자바 클래스의 가장 루트에 있는 클래스다. 모든 클래스가 Object 클래스를 상속 받는다. 따라서 모든 자바 객체는 Object클래스가 포함하는 메서드들을 모두 상속받아 사용할  수  있다.

     

    1.1 해시코드

    [프로토타입] public int hashCode()

     

    새로운 생명이 탄생하면 출생 신고를 하고 주민번호를 부여 받는다. 주민번호는 특정한 원리에 의해 생성되는데 각 자리마다 의미를 부여하여 번호가 만들어진다.

     

    _  _  _  _  _  _  -  _       _  _  _  _              _                  _

                            ↑                      ↑                 

    생년월일        성별     지역코드             접수순서         검증번호

     

    자바 프로그래밍에서 new 명령문으로 힙 메모리에 새로운 인스턴스를 만드는 것은 새로운 생명이 탄생하는 것과 같다. 힙 메모리에 만들어진 인스턴스도 주민번호와 같은 일련번호가 만들어진다. 그런 역할을 하는 메서드가 hasnCode()이다. hasnCode()는 메모리에 생성된 인스턴스위 주솟값을 가지고 일련번호를 만들어 반환하는 메서드이다. hasnCode() 메서드가 반환하는 일련번호를 '해시코드(HashCode)'라고 하며, 해시코드는 인스턴스가 메모리에 생성되는 주솟값을 기초로 만들어지는 만큼 서로 다른 인스턴스는 해시코드 값이 같을 수 없다.

     

    public class Test {
    	public static void main(String[] args){
        	Object obj1 = new Object();
            Object obj2 = new Object();
            
            // 1.1 hashCode() 메서드 예시
            System.out.println(cl.hashCode());
            System.out.println(c2.hashCode());
        }
    }
    
    [실행결과]
    366712642
    1829164700
    

     

    1.2 클래스 정보

    [프로토타입] public final Class<?> getClass()

     

    getClass() 메서드는 Class 타입의 인스턴스를 생성해 반환한다. Class는 java.lang 패키지에 있는 클래스로서 현재 클래스에 대한 정보를 다룬다. getClass() 메서드는 클래스에 대한 정보만 담는 객체를 새로 생성하여 활용할 때 사용한다. 

     

    public class Test {
    	public static void main(String[] args){
        	Object obj1 = new Object();
            Object obj2 = new Object();
    
            // 1.2 getClass() 메서드 예시
            Class c = obj.getClass();
            System.out.println(cl.getName());
            
        }
    }
    
    [실행결과]
    java.lang.Object
    

     

    1.3 문자열로 표현

    [프로토타입] public String toString()

     

    toString() 메서드는 인스턴스에 대한 정보를 문자열로 반환하는 메서드이다.  toString() 메서드에서 반환하는 문자열은 다음과 같은 형식의 값이다.

     

    getClass().getName()   +   '@'   +   Integer.toHexString(hashCode())

     

    getClass().getName()는 현재 클래스의 이름이다. Integer.toHexString() 메서드는 java.lang.Integer 클래스에 선언된 static 메서드로서 인자로 전달된 int 값을 16진수 문자열로 변환하여 반환한다. 위에서는 해시코드를 16진수 문자열로 변환하여 반환한다. 만약 toString() 메서드 없이 참조변수를 출력하면, 컴파일러가 자동으로 toString() 메서드를 호출하는 코드로 변환한다. 참조변수를 출력한다는 것은 인스턴스에 대한 정보를 출력하겠다는 의도이기 때문이다. 

     

    Object 클래스의 toString() 메서드는 객체에 대한 정보를 '클래스명@16진수해시코드' 형태로 출력한다. 자바의 모든 객체도 이 메서드를 상속받아 사용하므로 같은 형태의 값을 출력한다. 만약 객체 정보를 다른 값으로 출력하고 싶다면, toString() 메서드를 오버라이딩하여 원하는 문자열로 반환하게 한다. 오버라이딩할 땐 메서드 선언부는 변경할 수 없다는 원칙은 지켜야 한다.

     

    public class Test {
    	public static void main(String[] args){
        	Object obj1 = new Object();
            Object obj2 = new Object();
            
            // 1.3 toString() 메서드 예시
            System.out.println(cl.toString());
            System.out.println(c2.toString());
            
            System.out.println("-----");
            
            // toString() 메서드 없이 참조변수로 출력하는 예시
            System.out.println(c1);
            System.out.println(c2);
            
            System.out.println("-----");
            
            // toString() 메서드 오버라이딩 예시
            MyObject obj3 = new MyObject();
            System.out.println(obj3);
            
        }
    }
    
    class MyObject {
    	public String toString(){
        	return "MyObject";
        }
    }
    
    [실행결과]
    java.lang.Object@15db9742
    java.lang.Object@6d06d69c
    -----
    java.lang.Object@15db9742
    java.lang.Object@6d06d69c
    -----
    MyObject
    

     

    1.4 같은지 비교

    [프로토타입] public boolean equals(Object obj)

     

    equals() 메서드는 인자로 전달된 객체와 현재 객체가 같은지를 판단한다. 이때 판단 기준은 해시코드값이다. 서로 다른 인스턴스들은 해시 코드값이 다르기 때문이다. 

     

    equals() 메서드는 주솟값을 기반으로 만들어지는 해시코드가 같은지 비교한다. 서로 다른 주소에 위치한 객체들은 당연히 다른 결과(false)가 나온다. == 연산자는 단순히 변숫값이 같은지를 비교한다. 참조변수에는 주솟값을 가지고 있다. 서로 다른 인스턴스는 다른 주솟값을 가지므로 다르다는 결론(false)이 나올 것이다.

     

    Object 클래스의 equals()는 인스턴스가 같은지 판단하는 메서드이다. 다른 조건으로 같은지 판단해야 할 땐, 오버라이딩하여 판단조건을 새로 지정한다. 아래는 equals() 메서드를 오버라이딩한 예시이다. 매개변수 타입이 Object로 선언되어있고, Object는 어떤 타입이든 저장할 수 있으며, 사용하기 전에 원래 인스턴스 타입으로 변경해야만 인스턴스가 가진 모든 내용을 사용할 수 있다. 따라서 인자로 전달된 값을 Object 타입에서 MyObject 타입으로 변경하여 arg 참조변수에 저장했다. 

     

    this는 현재 인스턴스(아래 예제에선 obj1이 참조하는 인스턴스)이고 arg는 메서드 호출 시 전달된 인자((아래 예제에선 obj2가 참조하는 인스턴스)이다. onj1 참조변수의 equals() 메서드를 호출하면서 인자값으로 obj2 참조변숫값을 전달한다. MyObject의 equals() 메서드는 obj1의 num 값과 obj2의 num 값을 비교하여 같으면 true 다르면 false를 반환한다.

     

     

     

    public class Test {
    	public static void main(String[] args){
        	Object obj1 = new Object(123);
            Object obj2 = new Object(123);
            
            // 1.4 equals() 메서드 예시
            if(obj1.equals(obj2)){
            	System.out.println("동일 객체이다.");
            } else {
            	System.out.println("다른 객체이다.");
            }
            
            if(obj1==obj2){
            	System.out.println("동일 객체이다.");
            } else {
            	System.out.println("다른 객체이다.");
            }
        }
    }
    
    class MyObject {
    	int num;
        
        MyObject(int num) {
        	this.num = num;
        }
        
    	public String toString(){
        	return "MyObject";
        }
        
        public boolean equals(Object obj){
        	boolean result = false;
            MyObject arg = (MyObject) obj;
            
            if(this.num == arg.num) {
            	result = true;
            }
            
            return result;
        }
    }
    
    [실행결과]
    동일 객체이다.
    다른 객체이다.

     

Designed by Tistory.