AWS BACK DAY 9. " Object 클래스와 Class 클래스 - toString, Equals, hashCode, getClass 메서드"

이강용·2023년 1월 12일

Java 기초

목록 보기
9/26
post-thumbnail

instance of :

  • instanceof는 객체 타입을 확인하는 연산자이다.

  • 형변환 가능 여부를 확인하며 true / false로 결과를 반환한다.

  • 주로 상속 관계에서 부모객체인지 자식 객체인지 확인하는 데 사용된다.

  • instanceof의 기본 사용방법은 객체 instanceof 클래스 를 선언함으로써 사용한다.

Object

  • 모든 클래스의 최상위 클래스
    • Object 클래스는 모든 자바 클래스의 최상위 클래스
    • 다시 말하면, 모든 클래스는 object 클래스로부터 상속을 받는다.

코드를 작성할 때

Class Student{
int studentID;
String studentName;

컴파일러가 변환

class Student extends Object{
int studentID;
String studentName;

컴파일 과정에서 자동으로 extends Object가 붙는다.

  • 모든 클래스가 Object클래스를 상속받았으므로 Object의 메서드를 사용할 수 있고, 재정의할 수도 있고, Object형으로 변환할 수도 있다.
메서드설명
String toString()객체를 문자열로 표현하여 반환, 재정의하여 객체에 대한 설명이나 특정 멤버 변수 값을 반환
boolean equals(Object obj)두 인스턴스가 동일한지 여부 반환, 재정의하여 논리적으로 동일한 인스턴스임을 정의
int hashCode()객체의 해시 코드 값을 반환
Object clone()객체를 복제하여 동일한 멤버 변수 값을 가진 새로운 인스턴스를 생성
Class getClass()객체의 Class 클래스를 반환
void finalize인스턴스가 힙 메모리에서 제거될 때 가비지 컬렉터(GC)에 의해 호출되는 메서드, 네트워크 연결해제, 파일 스트림 해제 구현
void wait()멀티스레드 프로그램에서 사용하는 메서드, 스레드를 기다리는 상태 (non runnable)로 만듦
void notify()wait() 메서드에 의해 기다리고 있는 스레드를 실행 가능한 상태(runnable)로 가져옴

Object 클래스의 모든 메서드를 재정의할 수 있는 것은 아님!!(주의)

toString()

  • 객체 정보를 문자열(String)으로 바꿔줌

  • toString() 메서드는 인스턴스 정보를 문자열로 반환하는 메서드

  • toString() 메서드의 원형은 생성된 인스턴스의 클래스 이름과 주소값을 보여줌

    Object 클래스의 toString() 메서드원형

    getClass().getName() + '@' + Integer.toHexString(hashCode())

Equals()

  • 두 인스턴스의 주소 값을 비교하여 boolean 값 true/false을 반환해 주는 것

  • 주소 값이 같다면 당연히 같은 인스턴스

  • 그러나, 서로 다른 주소 값을 가질 때도 같은 인스턴스라고 정의할 수 있는 경우가 있음

  • 물리적 동일성(인스턴스의 메모리 주소가 같음)뿐 아니라 논리적 동일성(논리적으로 두 인스턴스가 같음)을 구현할 때도 equals() 메서드를 재정의하여 사용

    생성된 두 객체(인스턴스)가 '같다'는 것은 무엇을 의미할까?

  • 두 객체 (인스턴스)가 물리적으로 같다는 것은, 두 객체 (인스턴스)의 주소 값이 같은 경우 즉, 두 변수가 같은 메모리 주소를 가리키고 있다는 뜻

hashCode()

  • 해시란 데이터를 다루는 기법 중에 하나로 검색과 저장이 아주 빠르게 진행되는것
  • 아주 빠르게 진행될 수 있는 이유는 데이터를 검색할 때 사용할 key와 실제 데이터의 값이
    (valuse가) 한쌍으로 존재하고, key값이 배열의 인덱스로 변환되기 때문에 검색과 저장의 평균적인 시간 복잡도가 O(1)에 수렴하게 됩니다.

hashcode = hash(key);

GetClass()

  • 현재 참조하고 있는 클래스를 확인할 수 있는 메서드
    Student class의 멤버변수 및 생성자 생성
public class Student {
	
	private String name;
	private int age;
	
	public Student() { //디폴트 생성

	}

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [이름은 " + name + ",나이는 " + age + "]";
	}

StudentMain

package Object;

public class StudentMain {
	
	public static void main(String[] args) {
		
		Student st = new Student("LKY",31);
		
		System.out.println(st.getClass()); //해당 객체가 어느 클래스에 속하는지
		
	    System.out.println(st.toString());
		
	}

}
	Object
	   ↓
     Person
	   ↓
    Student   (instance of 를 쓰면 Student가 Object, Person을 다 들고 있음)
		      프로그램의 오류를 야기할 수 있는 문제가 발생 getClass를 쓰는 이유
		  
 if(!(obj.getClass() == Student.class)){ return false; }

 이게 명확한 구조	 

Class 클래스

  • 자바의 모든 클래스와 인터페이스는 컴파일되고 나면 .class 파일로 생성된다.
  • Class 클래스는 컴파일된 class파일에 저장된 클래스나 인터페이스 정보를 가져오는데 사용된다.

어떤 경우에는 여러 클래스 중, 상황에 따라 모르는 클래스의 정보를 사용할 경우 클래스 정보를 직접 찾아야하는 경우가 발생한다.
이때 Class 클래스를 활용한다.

클래스 정보를 가져오는 방법

  1. Object 클래스의 getClass() 메서드
String str = new String();
class clazz = str.getClass();
  • Object에서 선언한 getClass() 메서드는 사용하려면 생성된 인스턴스가 필요하다. (getClass() 메서드의 반환형은 Class
  1. 클래스 파일 이름을 Class변수에 직접 대입
Class clazz = String.class;
  • 컴파일된 클래스 파일이 있다면 클래스 이름만으로 Class클래스를 반환
  1. Class.forName(" 클래스 이름 ")메서드
Class clazz = Class.forName(" ");
  • 컴파일된 클래스 파일이 있다면 클래스 이름만으로 Class클래스 반환
profile
HW + SW = 1

0개의 댓글