forDevLife
[생활코딩-자바입문] 핵심 요약 4 본문
생활코딩 40. Object 클래스
1) 소개
Object 클래스는 자바 모든 클래스의 어머니라고 보면된다. 모든 클래스가 object를 상속한다.
2) toString
toString class는 object의 대표적인 메소드이다. 이는 객체의 내용을 문자화한다고 이해하면 된다.
println(c1)에서, c1은 인스턴스이다. 이런식으로 전달하면 자바는 자동으로 객체를 c1.toString으로 이해하여 출력한다.
따라서 c1이나, c1.toString이나 동일한 의미이다.
class Calculator {
int left, right;
public void SetOperands(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right);
}
public void avg() {
System.out.println((this.left + this.right) / 2);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.SetOperands(10, 20);
System.out.println(c1);
System.out.println(c1.toString());
}
}
toString 정보에 따라 아래 내용을 출력하면, toString도 어쨌든 메소드이므로 여러 함수를 모아 리턴함을 볼 수 있다.
우리는 필요에 따라 이 메소드를 오버라이딩 하여 사용이 가능하다. 그건 아래서 진행하겠다.
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.SetOperands(10, 20);
System.out.println(c1);
System.out.println(c1.toString());
System.out.println(c1.getClass());
System.out.println(c1.getClass().getName());
System.out.println(Integer.toHexString(c1.hashCode()));
}
}
아래 코드는 toString을 오버라이딩 하여 user define으로 출력하였다.
부모 클래스의 결과를 함께 출력하기 위해 super.toString()도 함께 작성하였다.
class Calculator {
int left, right;
public void SetOperands(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right);
}
public void avg() {
System.out.println((this.left + this.right) / 2);
}
public String toString() {
return super.toString() + ", left : " +this.left + ", right :" + this.right;
}
}
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.SetOperands(10, 20);
System.out.println(c1);
System.out.println(c1.toString());
}
}
2) equals
어떤 두 개의 인스턴스가 서로 같은 인스턴스인지 비교하는 역할을 하는 API가 바로 equal 이다.
equals의 정의를 복사한 후, Student에서 오버라이딩한다.
equals로 들어가는 인자는 Object obj = s1(or s2) 로 대입된다. 앞에서 배웠듯이 부모 클래스 타입으로 자식이 들어가는 건 가능하다.
하지만 Student s1 = obj는 반대의 경우로 불가능하다.(자식은 자신의 속성을 숨기고 부모인 척 할 수 있지만, 부모는 자식이 뭘 구현하고있는지 알 수 없기 때문.) 따라서 강제로 형변환을 통해 s1에 할당을 하였다. 이렇게 되면 obj -> s1할당을 통해 name에 접근 가능하다.
equals를 아래처럼 구현하는 건 기본적인 거고, 실제로는 해시코드라는 걸 사용해야 한다고 하는데,
이는 다음 방법으로 한다.
클래스 오른쪽 -> source -> Generate hashcode -> 어떤 필드를 비교할건지 지정 -> 자바가 자동으로 hashcode와 equals 메소드 생성
class Student {
String name;
Student(String name) {
this.name = name;
}
public boolean equals(Object obj) {
Student s1 = (Student)obj;
return this.name == s1.name;
}
}
public class ObjectDemo {
public static void main(String[] args) {
Student s1 = new Student("egoing");
Student s2 = new Student("egoing");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
3) finalize
이 메소드는 객체가 소멸될 때 호출되기로 약속된 메소드이다. 인스턴스가 소멸할 때 처리해야할 작업이 있다면 finalize를 오버라이딩하여 객체가 소멸될 때 일어나야 하는 일을 지정할 수 있다. 그냥 취지만 이해하자.
사실 finalize 대신 가비지 컬렉션이라는 것을 사용한다고 한다.
Garbage collection : 쓰레기를 수집 또는 버린다.
인스턴스를 만드는 것은 내부적으로 메모리(RAM)를 사용하는 것이다. 이 중요한 장치를 효율적으로 사용하기 위해, 더는 사용하지 않는 데이터를 제거하는 방법을 제공한다.
자바에서도 이런 방법을 제한적으로 제공하는데, 이유는 RAM을 다루는 까다로운 작업을 자바가 자동화했기 때문이다. 이 작업이 바로 가비지 컬렉션이다.
만약 어떤 인스턴스를 만들어 변수에 담았는데, 이걸 사용하는 것이 더 없다면 자바가 정기적으로 순찰 돌면서 사용하지 않는 변수를 삭제한다. 이를 통해 메모리 관리를 해준다는 장점 가진 언어가 자바이며, 다른 언어도 보통 이 기능을 제공한다.
그렇다고 해서 메모리가 개발자에게 더는 중요하지 않다는 건 아니다. 가비지 컬렉션의 메커니즘에 대해 이해하며, 어떤 경우에 컴퓨터가 느려지는 지 잘 이해하고 지식을 잘 버무려야 좋은 Application이 만들어진다.
참고 : Java Garbage Collection
4) clone
clone은 복제란 의미로, 객체를 복제하는 역할이다. 좀 처리해 줘야할 부분이 있다.
1) Clonable이라는 interface를 가져와야 한다. 이는 이 클래스가 복제 가능한 객체라는 사실을 자바 가상 머신에 알려주는 역할이다. 실제 interface 내부에는 아무것도 없는데, 이는 그냥 약속으로 이해하면 된다.
2. clone( ) 메소드는 object에서 protect로 선언되어 있다. 따라서 상속관계에 있다면 다른 패키지 멤버에 접근이 가능하다.
class Student1 implements Cloneable {
String name;
Student1(String name) {
this.name = name;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class ObjectDemo1 {
public static void main(String[] args) {
Student1 c1 = new Student1("egoing");
try {
Student1 c2 = (Student1)c1.clone();
System.out.println(c1.name);
System.out.println(c2.name);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
'Java' 카테고리의 다른 글
[생활코딩-자바입문] 핵심 요약 6 (0) | 2020.11.15 |
---|---|
[생활코딩-자바입문] 핵심 요약 5 (0) | 2020.11.15 |
[생활코딩-자바입문] 핵심 요약 3 (0) | 2020.11.08 |
[생활코딩-자바입문] 핵심 요약 2 (0) | 2020.11.08 |
[생활코딩-자바입문] 핵심 요약 (0) | 2020.11.06 |