5-1. java.lang 패키지_Object

zhyun·2020년 9월 2일
0

java

목록 보기
8/11

1. java.lang 패키지

  • 자바 프로그래밍에 가장 기본이 되는 클래스들을 포함하고 있다.
  • ex) String, Object, System...

2. Object

  • Object클래스는 멤버변수 없이 11개의 메서드로 되어있다.

1) equals()

  • 참조변수가 가르키는 주소를 비교한다.
  • 객체 자신과 객체 obj가 같은 객체인지 알려준다.
  • 주소가 아닌 해당 인스턴스가 가지고 있는 값을 비교하려면
    equal()를 오버라이드 해야한다.
    : equal()가 오버라이드 되어있는 클래스들 -> String, File, Date...
  • equals() 예시1
public class EqualsTest01 { 
	public static void main(String[] args) {
		Value v1 = new Value(10); 
		Value v2 = new Value(10);
		
		System.out.println(v1); //h_javaLang.Value@6084fa6a
		System.err.println(v2);//h_javaLang.Value@3a5476a7
		System.out.println(v1 == v2); // 주소비교 : false
		System.out.println(v1.equals(v2)); //false
	}
}

class Value{
	int value;
	Value(int value){
		this.value = value;
	}
  • equals() 예시2
public class EqualsTest02 {
	public static void main(String[] args) {
		Person p1 = new Person(9312202777777L);
		Person p2 = new Person(9312202777777L);
		
		System.out.println(p1 == p2);
               // new p1의 주소 == new p2의 주소 : false
               
		System.out.println(p1.equals(p2));
               // 아래 Person클래스에서 equals() 오버라이드했음
               // p2(obj)가 Person타입의 인스턴스이고 && null이 아닐때
               // p1의 regNo == p2의 regNo (true 반환)
		
		System.out.println(p1.toString()); // 원래 주소값이 나오고 오버라이드하면 원하는 값이 출력된다
		System.out.println(p1.hashCode()); // @뒤에 33abb81e 10진수를 16진수로 바뀐 값 출력

		System.out.println("".equals(null)); // 가능
        
		String a = null;
		System.out.println(a.equals("")); // 불가능. 터짐
		System.out.println(null.equals("")); //불가능.	
	}

}
class Person implements Serializable{
	long regNo;
	Person(long regNo){
	     this.regNo = regNo;
	}
    
	@Override
	public boolean equals(Object obj) {
		boolean result = false;
		if(obj instanceof Person && obj != null){ // obj가 Person의 인스턴스인지 && obj가 null값이 아닐때
			result  = this.regNo == ((Person)obj).regNo;
		}               // p1의 regNo == p2의 regNo
		return result;
	}
	
	@Override
	public String toString() {
		return "Person [regNo=" + regNo + "]";
	}
     // 오버라이드 하면 System.out.println(p1.toString());
     //--> Person [regNo=9312202777777] 출력되고 (main매서드에서)
     // 오버라이드 안하면 '주소값'이 나온다.

2) hashCode()

  • 10진수로 이루어져 있고, 객체의 주소에서 해시코드를 만들어 반환한다.
  • String클래스는 같은 문자열을 가지고 있다면 동일한 해시코드를
    반환하게 만들어져 있다.
  • ex)
String aa = "Love";
String bb = "Love";
-> aa와 bb의 문자열이 "Love"로 동일 -> hashCode() 값이 동일하게 나온다.    
System.out.println(aa.hashCode()); 
System.out.println(bb.hashCode());

3) toString()

  • : Object의 toString()
    -> return getClass().getName() +"@"+Integer.toHexString(hashCode());
    // toHexString : 10진수를 16진수로 변환하는 메서드
    : toString() 오버라이드 되어있는 클래스들
    -> String...
  • 즉, 클래스를 작성할 때 toString()을 오버라이딩하지 않는다면,
    호출할 때 클래스이름에 16진수의 해시코드를 얻게 될 것이다.

4) getClass()

  • 클래스의 정보를 얻어올 때 사용한다.
    (1) 생성된 객체로부터 얻는 방법
    Class obj = new Person().getclass();
    (2) 클래스 리터럴로부터 얻는 방법
    Class obj = Person.class;
    (3) 클래스명으로부터 얻는 방법
    Class obj = Class.forName("Person");
    -> 로드되어 있는 클래스중 "Person"이라는 클래스 가지고옴

  • ex)

import java.util.Arrays;

public class GetClassTest {
	public static void main(String[] args) throws ClassNotFoundException {
   
   //1. 클래스의 정보를 객체로부터 얻는 방법
    Class re1 = new Person(1234L).getClass(); //객체에 대한 정보
    System.out.println(re1.getName()); // 출력 : h_javaLang.Person
    System.out.println(Arrays.toString(re1.getInterfaces())); //출력 : [interface java.io.Serializable]
    
  //2. 클래스 리터럴로부터 얻는 방법
    Class re2 = Person.class; // 반환타입이 Class
    System.out.println(re2.getName()); // 출력 : h_javaLang.Person
    System.out.println(Arrays.toString(re2.getInterfaces()));//출력 : [interface java.io.Serializable]
		 
  //3. 클래스명으로부터 얻는 방법
    Class re3 = Class.forName("h_javaLang.Person"); // 패키지 이름 붙여야 함
    System.out.println(re3.getName()); // 출력 : h_javaLang.Person
    System.out.println(Arrays.toString(re3.getInterfaces())); //출력 : [interface java.io.Serializable]  
}

}
profile
HI :)

0개의 댓글