[Java] Object Class

SeongWon Oh·2021년 8월 17일
0

Java

목록 보기
21/39
post-thumbnail

Object Class

  • 모든 클래스의 최상위 클래스로 모든 클래스들은 컴파일러가 자동으로 extends Object를 추가하여 java.lang.Object를 상속받는다.
    class Student => class Student extends Object

  • Object 클래스의 일부는 재정의를 하여 사용할 수 있다.
    ex) toString(), equals(), hashCode(), clone()

java.lang패키지는 많이 사용하는 기본 클래스들이 속한 패키지로 프로그래밍을 할때 import하지 않아도 자동으로 import된다. String, Integer, System, Object등이 속해있다.


toString() method

  • 객체의 정보를 String으로 바꾸어서 사용할 때 쓰이며 기본 클래스인 String, Integer 클래스의 경우는 이미 재정의되어있다.

👨🏻‍💻 Example Code

package ch01;

class Book {
	private String title;
	private String author;
	
	public Book(String title, String author) {
		this.title = title;
		this.author = author;
	}

	// toString을 overriding함으로써 기본 인스턴스 출력값이 주소값이 아닌 아래의 return값으로 바꼈다.
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return title + ", " + author;
	}
	
	
}


public class BookTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Book book = new Book("데미안", "헤르만 허세");
		
		System.out.println(book);
		// 결과값 : ch01.Book@24d46ca6ㅜ
		// ch01 package의 Book class이다.
		// 인스턴스가 저장된 가상 메모리는 24d46ca6이다.
		
		String str = new String("test");
		System.out.println(str);
		// 위의 book과 같이 String object로 str이라는 인스턴스를 생성하였는데
		// 결과가 위와 다르게 주소값이 아닌 str의 문자열이 나온다.
		// 이렇게 나오는 이유는 String의 toString method가 overriding되었기 떄문이다.
		// Book Class도 toString method를 overriding을 하면 주소값이 아닌 결과 출력이 가능하다.
	}

}

equals() method

  • 두개의 인스턴스의 주소 값을 비교하여 true/false를 반환하는 method이다.

  • 같은 학번, 같은 아이디의 회원과 같이 인스턴스가 다르더라도 논리적으로 동일한 경우 true를 반환하도록 재정의 할 수 있다. (hashCode도 같이 재정의해줘야한다.)


hashCode() method

  • hashCode()는 인스턴스의 저장 주소를 반환한다.

  • 논리적으로 동일하다는 것을 위해서 equal() method를 재정의하였다면 hashCode() method도 재정의하여 동일한 인스턴스들이 동일한 hashCode값이 반환되도록 해야한다.


clone() method

  • 객체의 원본을 복사해주는 method이다.

  • clone()메서드를 사용하면 객체의 정보(멤버 변수 값등...)가 동일한 새로운 인스턴스를 생성할 수 있다.

  • 동일한 인스턴스를 생성하는 것이기에 객체 지향 프로그래밍에서의 정보은닉, 객체 보호의 관점에서 위배될 수 있다. 그리하여 모든 class에서 사용이 가능한 것이 아니고 implements Cloneable를 넣은 class에서만 사용가능하다.

👨🏻‍💻 Example Code (equals(), hashCode(), clone() 통합 예시)

Student.java

package ch02;

public class Student implements Cloneable{ // 해당 class를 clone할 수 있다고 구현
	private int studentNum;
	private String studentName;
	
	public Student(int studentNum, String studentName) {
		this.studentName = studentName;
		this.studentNum = studentNum;
	}
	
	public String toString() {
		return studentNum + ", "+ studentName;
	}
	
	public void setStudnetName(String name) {
		this.studentName = name;
	}
	
	
	// 같은 값을 같은 instance를 논리적으로 같다고 판별하기 위해서는 equels와 hashCode method를 재정의해야한다.
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return studentNum;
	}

	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if (obj instanceof Student) { //obj가 Student의 instance인가 확인
			Student std = (Student) obj; //obj를 Student로 downcasting
			if(this.studentNum == std.studentNum)
				return true;
			else
				return false;
		}
		return false;
	}

	
	// 객체의 현재 상태를 그대로 복사하는데 사용하는 method로 clone()메서드를 사용하면 객체의 정보(멤버 변수 값등...)가 
	// 동일한 또 다른 인스턴스가 생성되는 것이므로, 객체 지향 프로그램에서의 정보 은닉, 객체 보호의 관점에서 위배될 수 있다.
	// 그리하여 모든 class에서 사용이 가능한 것이 아니고 implements Cloneable를 넣은 class에서만 사용가능하다.
	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		return super.clone();
	}
	
}

EqualTest.java

package ch02;

public class EqualsTest {

	public static void main(String[] args) throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		Student st1 = new Student(100, "Lee");
		Student st2 = new Student(100, "Lee");
		
		System.out.println(st1 == st2);
		System.out.println(st1.equals(st2));
		// 값들이 같음에도 불구하고 물리적으로 저장된 주소값이 달라서 false라는 결과가 나온다.
		// Student의 equals method를 studentNum값이 같으면 같다고 판별하라고 overriding을 한 뒤에는 true로 return
		
		System.out.println(st1.hashCode());
		System.out.println(st2.hashCode());
		// overriding전에는 hashCode의 값도 다른 값 출력
		// hashcode를 overriding을 한 뒤에는 hashcode값도 동일하게 출력한다.
		
		System.out.println(System.identityHashCode(st1));
		// System.identityHashCode를 통해 실제로 st1이 갖는 실제 hashCode값을 찾을 수 있다.
		
		
		st1.setStudnetName("Kim");
		// clone을 통해 st1의 현재상태와 동일한 인스턴스인 copyStudent 인스턴스를 생성
		Student copyStudent = (Student)st1.clone();
		System.out.println(copyStudent);
	}

}



Reference

  • [Fast Campas] 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글