<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과 관련된 타입들만 들어올 수 있습니다.)
'프로그래밍 공부 > Java' 카테고리의 다른 글
[lesson] Java 프로그래밍 언어 - 스레드(Thread) (0) | 2021.08.07 |
---|---|
[lesson] Java 프로그래밍 언어 - Collection (0) | 2021.08.04 |
[lesson] Java 프로그래밍 언어 - API (0) | 2021.07.30 |
[lesson] Java 프로그래밍 언어 - 예외 처리 (0) | 2021.07.29 |
[lesson] Java 프로그래밍 언어 - 내부 클래스, 람다식 (0) | 2021.07.29 |