object는 무엇인가?

2022. 11. 11. 15:44자바멘토링/자바의 신 1~7강 질문리스트 정리

모든 클래스의 부모 클래스는 object이다?

  • 자바에서는 기본적으로 아무런 상속을 받지 않으면 java.lang.object클래스를 확장한다.

이클립스가 어떻게 object를 확장하는 지 알수있을까?

 

답: object 클래스에 있는 메소드를 사용하면된다.

 

ex) 내가 만약 부모 parent클래스를 상속을 받게 되면 이미 부모 parent클래스안에 object 클래스가 상속이 되어있기에 

이중 상속을 받을 수 없다 

 

-> "자바는 한번에 이중상속을 받을수 는 없지만 여러단계로 상속을 받을수는 있습니다." 

 

왜? 모든 클래스는 object클래스를 상속 받을까?

 

답: object클래스에 있는 메소드들을 통해서 클래스의 기본적인 행동을 정의 할수 있기 때문입니다.

"이정도의 메소드는 정의 되어 있어야  하고 처리를 해주는 것이다"

 


그렇다면 object 클래스에서 제공하는 메소드들은 무엇이 있는가?

 

객체를 처리하기 위한 메소드

해당 메소드들은 많은 메소드들이 있지만 그중에서도 가장 많이 쓰여서 꼭 알아야 하는 것들이다 .

쓰레드 처리를 위한 메소드

 

객체를 처리하기 위한 메소드 핵심 !

 

1)toString();

:해당 클래스가 어떤 객체인지를 쉽게 나타낼 수 있는 중요한 메소드다.

 

toString() 메소드가 자동으로 호출되는 경우

  • System.out.println()메소드에 매개 변수로 들어가는 경우
  • 객체에 대하여 더하기 연산을 하는 경우 
public void toStringMethod(Object obj){

System.out.println(obj);   // (1)
System.out.println(obj.toString(););// (2)
System.out.println("plus"+obj);  // (3)
}

(1) . 경우는 객체를 그냥 출력 하는 것과 toString()동일

(2).  경우는  toString()메소드가 구현이  안되어있지만 object 클래스에서 상속을받기 에 사용이 가능하다.

(3). 경우는  '+ '같은 경우는 참조자료형에서는 String만 가능하지만 여기서 "+"연산을 사용했다.
객체에 더하기 가능하다. 

 

String외에 참조자료형에 더하기 연산을 수행 하면 자동으로 toString()메소드가 호출되어 객체의 위치는 String 값이 놓이게 된다.
toString()을 오버라이딩을 해서 사용할 필요가 없지만 DTO같이 객체를 출력할때 좀더 편하게 출력 하기 위해서 오버라이딩을 해서 사용할 수있다.

 

MemberDTO(클래스)

Public Class MemberDTO{
	public Stirng name;
	public String phone;
	publlic String email;
}
Public void equalMethod(){
	MemberDTO obj1= new MemberDTO("Sangmin");
	MemberDTO obj2= new MemberDTO("Sangmin");
	
	if(obj1==obj2){

	System.out.println("obj1 and obj2 is same);
	}else{

	System.out.println("obj1 and obj2 is different");
	}


}
결과 : obj1 and obj2 is different

 

2)equals();

:객체는 ==만으로 같은지 확인이 안되므로 ,equals()를 사용한다.
"=="은 기본자료형에서 두개의 값이 같은지 다른지를 바교한다 그 연산자로는 ==,!=
같 있다.  결과는 true,false인 boolean타입의 값으로 나온다.

 

그러나 참조자료형에서는 ==를 사용할 수가 없다. 사용은 가능하나. 값을 비교하는 것이 아니라 "주소값"을 비교하게된다. 그래서 값이 같다고하더라도 다른 객체라고 자바는 인식을 한다. 그래서 참조자료형은 equals()를 사용해야한다.       

 

실행결과

obj1 and obj2 is different 

 

 

근데   equals()는 오버라이딩을 해서 사용해야 한다?

:오버라이딩을 하지 않으면 equals()메소드에서는 hashcode()값을 비교한다.
hashcode()값은 이미 이야기 했지만 , 해당객체의 주소값을 리턴한다.

그러니 서로의 주소값이 달라 서로 다르다는 결과가 나온다.

 

해결방법?

MemberDTO클래스에 equals()를 오버라이딩 하쟈.

 

마지막으로 중요한것 !

equals() 오버라이딩 하면 두 객체가 같은 값을 가지고 있으므로  서로 같음을 통해 
true라는 결과가 나오지만 아직 서로 주소값은 다르기에 hashcode() 메소드의 값은 다르다 
따라서 같은 hashcode()메소드를 결과를 갖도록 이또한 MemberDTO 클래스에 오버라이딩을 해야한다.

equlas()는 객체를 비교하기 위해서는 오버라이딩이 필요하지만 그렇지 않은 메소드만 있는 기능위주의
클래스에서는 오버라이딩이 필요없다.

ex) 동명이인이 없다고 본다면 두개는 서로 같은 객체이다.

 

3)hashcode();

:객체의 고유값을 나타내는 hashcode() 

 

기본적으로 객체의메모리 주소를 16진수로 리턴한다.  만약 어떤 두개의 객체가 서로 동일하다면, hashcode()값은 무조건 동일해야만 한다.

 

==>따라서 

equals()메소드를 오버라이드 하면 hashcode()메소드도 오버라이드해서 동일한 결과가 나오도록 
만들어야한다.

 

오버라이딩 규칙!

  • 자바 애플리케이션이 수행되는 동안에 어떤 객체에 대해서 이메소드가 호출될때에는 항상동일한 int값을 
    리턴해 주어야한다. 하지만 자바를 실행할때 마다 같은 값이어야 할 필요는 전혀없다.
  • 어떤 두개의 객체에 대하여 equals()메소드를 사용하여 비교한 결과가 true일 경우에, 두객체의 hashcode()메소드를 호출하면 동일한 int값을 리턴해야만 한다.
  • 두객체를 equals()메소드를 사용하여 비교한 결과 false를 리턴했다고 해서 ,hashcode()메소드를 호출한 int값이 무조건 달라야 할 필요는  없다. 하지만 이경우에 서로 다른 int값을 제공하면 hashtable의 성능을 향상시키는데 도움이 된다.