[JAVA] Object

Coastby·2022년 9월 28일
0

JAVA

목록 보기
25/33

object

object 모든 클래스의 공통된 조상. 구체적인 클래스가 있음.

클래스 생성 시, 다른 클래스를 상속받고 있지 않다면 extends Object가 생략되어 있는 것이다. Object가 가지고 있는 메소드를 이용해서 공통적인 기능을 가질 수 있다.

class O {}

==

class O extends Object {}

Object method 중에 사용 빈도가 높고, 중요한 것들을 알아본다. 상속이란 기능을 통해서 자바가 모든 객체에 공통적인 기능을 객체지향스럽게 구현하는 사례라고 할 수 있다.

toString

인스턴스를 출력할 때 .toString()이 기본적으로 내재되어 있다.

System.out.println (c1);

==

System.out.println (c1.toString()); 

클래스정보@인스턴스가 저장된 주소

원하는 내용으로 overriding하여서 재정의할 수 있음.

class O {
	public String toString() {
		return this.left+", "+this.right;
	}
}
//result
10, 0

//원래 toSting()값을 보고 싶다면
class O {
	public String toString() {
		return super.toString()+" "+this.left+", "+this.right;
	}
}
//result
org.opentutorials.javatutorials.Exceptions.Calculator@63961c42 10, 0

equals

equals의 시그니쳐에 맞춰서 오버라이딩을 해줄 수 있다. 어떠한 매개변수를 받을 때 어떤 것이 들어올 지 모를때 매개변수로 Object 타입을 쓰는 것은 일반적인 방법이다.

public boolean equals (Object obj) {
	
}

그런데 equals 에 들어가는 매개변수의 데이터 타입은 Object이므로 데이터타입이 student인 객체를 전달해야하는데 어떻게 하나?

강제로 형변환을 시켜줘야 한다.

Object obj = s2

자식을 부모의 데이터타입으로 형변환하는 것은 자동으로 할 수 있다.

student s = (student) obj

그러나 부모를 자식으로 바꾸는 것은 문제점이 발생할 수 있기 때문에 명시적으로 형변환을 할거다라고 지저을 해주어야 한다.

class student {
	String name;
	student (String name) {
		this.name = name;
	}
	
	public boolean equals(Object obj) {
		student s = (student) obj;
		
		return this.name == s.name;
	}
}

public class ObjectDemo {
	public static void main (String[] args) {
		student s1 = new student("hoon");
		student s2 = new student("hoon");
		System.out.println (s1 == s2);
		System.out.println (s1.equals(s2));
	}
}

equals 와 hashCode()는 함께 구현해야하는 경우가 많다. 어떤 것이고 어떻게 구현을 하는 지 후에 공부하라.

오른쪽 클릭에 개발도구가 있어서 직접하지 않아도 된다. 어떤 멤버를 비교할 것인지를 설정할 수 있다.

finalize

API에서 toString()은 가급적이면 구현하는 것을 추천한다. equals()는 Object class가 가지고 있는대로 객체와 객체를 비교하는 원래 형태로 쓰는 것을 추천한다.

finalize는 사용할 일이 거의 없다.

좋은 어플리케이션은 RAM을 적게 쓰면서 많은 일을 할 수 있는 어플리케이션이다. 언어들이 RAM을 효율적으로 사용하기 위해 사용하지 않는 메모리를 삭제하는 작업을 한다. 자바에서는 이러한 작업을 자동화하였고 이를 가비지 컬렉션이라고 한다. 그럼에도 불구하고 좋은 애플리케이션을 만들기 위해서는 가비지 컬렉션에 대한 이해가 필요하다.

NAVER D2

clone

클래스가 복제가능한 객체라는 사실을 JVM에 알려줘야한다.

interface clonable은 비어있다. 그냥 자바에 약속하는 인터페이스이다.

clone() method의 접근제어자는 protected이다. protected는 다른 패키지에서는 호출할 수 없다. 상속된 관계에서는 사용가능하다. class Object는 다른 패키지에 있기 때문에 호출이 안된다 (다른 toString()과 같은 메소드는 public 이라 바로 호출이 가능하다.) 상속받은 것을 이용하여 protected보다 개방적인 접근제어자인 public으로 만드는 것은 가능하다.

다시 에러가 발생하는데 이는 Exception 처리가 필요한 것이다.

class student implements Cloneable {
	String name;
	student (String name) {
		this.name = name;
	}
	
	public boolean equals(Object obj) {
		student s = (student) obj;
		return this.name == s.name;
	}
	
	public Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}

public class ObjectDemo {
	public static void main (String[] args) {
		student s1 = new student("hoon");
		try {
			student s2 = (student) s1.clone();
			System.out.println(s1.name);
			System.out.println(s2.name);	
		} catch (CloneNotSupportedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

//result
hoon
hoon
profile
훈이야 화이팅

0개의 댓글