프로그래밍/JAVA

27 Object class와 Wrapper Class

윤지(●'◡'●) 2021. 4. 20. 11:00
반응형

 


 

Object 클래스

 

모든 클래스의 최상위 클래스로 모든 자바 클래스는 Object 클래스를 상속받는다.

그 이유는 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 제공하기 위해서다.

 

위의 사진은 Object 클래스가 가지고 있는 메소드들 이다

 

내부 API 문서: http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

 

Object (Java Platform SE 7 )

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup. The general contract of fi

docs.oracle.com

 

이 중, equals()와 toString()에 대해 알아보자 :)

 

- equals()

equals() 메소드는 해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교하여, 그 결과를 반환한다.

equals()는 String타입의 값 비교에 사용하는데, 왜 == 가 아닌 equals()를 사용하는걸까?

 

String data3 = new String("ABC"); //객체화
String data4 = new String("ABC"); //객체화
// heap 영역에 각 각 한개 씩 (즉, 2개) 생성

System.out.println(data3 == data4); // false
System.out.println(data3.equals(data4)); //true

 

바로, 필드로 객체화 했을 때에는 서로 가진 주소값이 다르기 때문에 ==으로 비교했을 때에는 정확한 비교가 어렵다.
그래서 String 클래스에서 equals()를 값 비교로 재정의하였기 때문이다.

 

 

위의 코드는,  Object클래스의 equals()메소드를 Override를 한 것이다. 첫번째 조건문에서는 객체를 비교를 하는 조건문이고 두번째 조건문에서는 String클래스가 맞으면 객체 안의 데이터(문자)를 비교를 하는 소스 코드이다.

 

*equals를 재정의 해야 할 때
객체간 주소 비교가 아닌 특정 필드의 요소를 비교하여야 할 때에는
해당 객체의 필드에 equals()를 재정의하여 원하는 요소를 비교하도록 재정의한다.

 

 

- toString()

 

toString() 메소드는 해당 인스턴스에 대한 정보를 문자열로 반환한다.

이때 반환되는 문자열은 클래스 이름과 함께 구분자로 '@'가 사용되며,

그 뒤로 16진수 해시 코드(hash code)가 추가된다.

16진수 해시 코드 값은 인스턴스의 주소를 가리키는 값으로, 인스턴스마다 모두 다르게 반환된다.

 

Student std = new Student();
Student std2 = new Student();
		
System.out.println(std.toString());
System.out.println(std2.toString());

[결과]

Student@26f0a63f
Student@4926097b

 

 


 

Wrapper  클래스

 

프로그램에 따라 기본 타입의 데이터를 객체로 취급해야 하는 경우가 있다.

예를 들어, 메소드의 인수로 객체 타입만이 요구되면, 기본 타입의 데이터를 그대로 사용할 수는 없다.

이때는 기본 타입의 데이터를 먼저 객체로 변환한 후 작업을 수행해야한다.

 

이렇게 8개의 기본 타입에 해당하는 데이터를 객체로 포장해 주는 클래스를 래퍼 클래스(Wrapper class)라고 한다.

래퍼 클래스는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만들어 준다.

이러한 래퍼 클래스는 모두 java.lang 패키지에 포함되어 제공된다.

 

 

 

 

1) 박싱(Boxing)과 언박싱(UnBoxing)

 

 

 

래퍼 클래스(Wrapper class)는 산술 연산을 위해 정의된 클래스가 아니므로, 인스턴스에 저장된 값을

변경할 수 없다. 단지, 값을 참조하기 위해 새로운 인스턴스를 생성하고, 생성된 인스턴스의 값만을 참조할 수 있다.

클래스 타입 = new 클래스타입(일반타입);	//박싱(boxing)
일반 타입 = 클래스 타입.일반타입Value();	//언박싱(unboxing)

 

 

2)오토 박싱(AutoBoxing)과 오토 언박싱(AutoUnBoxing)

 

JDK 1.5부터는 박싱과 언박싱이 필요한 상황에서 자바 컴파일러가 이를 자동으로 처리해준다.

이렇게 자동화된 박싱과 언박싱을 오토 박싱(AutoBoxing)과 오토 언박싱(AutoUnBoxing)이라고 부른다.

 

아래 코드로 박싱과 언박싱, 오토 박싱과 오토 언박싱의 차이를 확인해보자 :)

 

int data = 10;
Integer data_I = new Integer(data);//박싱
data = data_I.intValue(); //언박싱
		
//JDK5버전 이상부터는 오토를 지원한다.
int data2 = 10;
Integer data2_I = data2; // 오토 박싱
data2 = data2_I;	// 오토 언박싱

 

위의 코드에서 볼 수 있듯이 래퍼 클래스인 Interger 클래스에는 언박싱을 위한 intValue() 메소드가 포함되어 있다.

 

하지만, 오토 박싱을 이용하면 new 키워드를 사용하지 않고도 자동으로  인스턴스를 생성할 수 있다.

그리고 intValue() 메소드를 사용하지 않고도, 오토 언박싱을 이용하여 인스턴스에 저장된 값을 바로 참조할 수 있다.

 

 

 

출처 : www.tcpschool.com/
반응형