본문 바로가기
프로그래밍 공부/Java

[lesson] Java 프로그래밍 언어 - Object , Wrapper Class

by Luna_lua 2021. 7. 30.
반응형

<Object>

Object클래스는 java.lang 패키지 중에서도 가장 많이 사용되는 클래스입니다.

Object 클래스는 모든 자바 클래스의 최상위 부모클래스로서 모든 자식은 Object클래스를 상속받았기 때문에 부모클래스를 모두 사용할 수 있습니다.( 저번에 오버라이딩 + 상속에서 말씀드렸지만 부모의 메소드는 오버라이딩하여 재선언이 가능합니다.)

-> java.lang 패키지란? 자바에서 기본적인 동작을 수행하는 클래스들을 모아놓은 패키지라고 보시면 됩니다.

 

<Object 중 주로 사용하는 메소드>

1. toString()
항상 객체명을 출력할 때에는 toString()이 생략되어있다.
toString()을 통해 출력되는 문자열이 마음에 들지 않는다면, 재정의하여 사용할 수 있습니다.

// Object의 toString 메소드

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    
    
// Object클래스를 상속받은 String 클래스의 toString 메소드    
// extends없이 상속이 받아져 있습니다.
public String toString() {
        return this;
    }
    
 
// Object클래스를 상속받은 ArrayList<E>의 toString 메소드
// extends없이 상속이 받아져 있습니다.
public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }

2. equals() : 주소값 비교하는 메소드입니다. ==와 혼용하지 않아야 합니다. 

주로 String에서 이슈가 있습니다 바로 ==과 .equals()중에 비교를 어떻게 해야하는건가?

(문자열 비교시 .equals();를 사용해야 합니다.)

 

문자열을 비교하는 예제 코드입니다. 

	public static void main(String[] args) {
		
		// 값의 우선순위가 높다
		String data1 = "ABC";
		String data2 = "ABC";
		
		// 필드의 우선 순위가 높다
		String data3 = new String("ABC");
		String data4 = new String("ABC");
		
		// 같은 문자열 비교
		System.out.println("====\"ABC\"와 \"ABC\"를 비교====");
		System.out.println("같은 문자열을  ==로 비교한 결과 : " +(data1 == data2));
		// 필드안에 있는 문자열의 주소값으로 나오게 재정의 해놓은것!!
		System.out.println("data1의 주소값 : "+data1.hashCode());
		System.out.println("data2의 주소값 : "+data2.hashCode());

		System.out.println();
		System.out.println("====new String(\"ABC\")와 new String(\"ABC\")를 비교====");
		// 같은 문자열 객체 비교
		System.out.println("같은 문자열 객체를  ==로 비교한 결과 : "+(data3 == data4));
		System.out.println("같은 문자열 객체를  .equals로 비교한 결과 : "+data3.equals(data4));
	}
    
    // console 출력창
/*   
*     ===="ABC"와 "ABC"를 비교====
*     같은 문자열을  ==로 비교한 결과 : true
*     data1의 주소값 : 64578
*     data2의 주소값 : 64578
*
*     ====new String("ABC")와 new String("ABC")를 비교====
*     같은 문자열 객체를  ==로 비교한 결과 : false
*     같은 문자열 객체를  .equals로 비교한 결과 : true
*/

 

원래는 Object클래스에서도 ==으로 주소값비교였습니다. 그러나 String 클래스에서 값 비교로 재정의 되었습니다.

// Object 클래스 equals 메소드
public boolean equals(Object obj) {
        return (this == obj);
    }
    
// String 클래스 equals 메소드
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }


3. hashCode() : 해당 객체의 주소값

위의 equals비교하는 String 비교예제에서 주소값을 확인하는 메소드를 추출해 왔습니다.

	public static void main(String[] args) {
		
		
		String data1 = "ABC";
		String data2 = "ABC";
	
    		// 변수의 주소를 출력
		System.out.println("data1의 주소값 : "+data1.hashCode());
		System.out.println("data2의 주소값 : "+data2.hashCode());
	}
    
    // console 출력창
/*    
*     data1의 주소값 : 64578
*     data2의 주소값 : 64578
*/

 

<Wrapper Class>

Wrapper클래스는 기본 자료형들인 int, double 등의 클래스타입니다. (int => Intger, double => Double...)

 

public static void main(String[] args) {
		
		int data_i = 10;

		// 클래스 타입 객체 = new 클래스 타입(일반 타입);  => //boxing
		Integer data_I2 = new Integer(data_i);
		
		// 일반 타입 변수 = 객체.000value();  //unboxing
		data_i = data_I2.intValue();
		
        
		// JDK4 버전 이상부터는 auto를 지원한다.
        
		// auto boxing
		Integer data_I = data_i;
		
		// auto unboxing
		data_i = data_I;		
	}


<Wrapper 클래스를 사용하는 이유>
1. 원시타입(일반타입)을 박싱하면 다양한 메소드를 제공받을 수 있습니다.
2. 반드시 객체로 사용해야 할 때에는 박싱을 해주어야 합니다.

 

 

+) Object와 제네릭의 차이

오브젝트는 최상위 클래스이므로 모든 클래스가 업캐스팅으로 들어올 수 있지만, 제네릭은 타입에 제한을 둘 수 있게 해줄 수 있다.

(제네릭 타입이 String이라면 String과 관련된 타입들만 들어올 수 있습니다.)

반응형