package org.opentutorials.javatutorials.progenitor;
class O {}
위의 코드는 아래와 코드가 같다.
package org.opentutorials.javatutorials.progenitor;
class O extends Object {}
package org.opentutorials.javatutorials.progenitor;
class Calculator{
int left, right;
public void setOprands(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 toSting(){
return "left: " + rhis.left + ", right: " + this.right ;
}
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10, 20);
System.out.println(c1); // case 1
System.out.println(c1.toString()); // case 2
}
}
결과 ( case1 , 2 둘 다 동일 )
org.opentutorials.javatutorials.progenitor.Calculator@11be650f
이유
Object라 생기는 점
여기서 overriding ( 재정의 )
- Object의 메소드(ex: toString) 를 재정의하는 것
package Object;
public class Student {
String name;
Student (String name){ // @1
this.name = name;
}
public boolean equals(Object obj) { // 2. 여기로 들어가니까 Object obj = s2(얘의 데이터타입은 Student) 데이터타입이 더 포괄적인 Object로 바뀌어서 들어오게
Student s = (Student) obj ; // 3. 근데 데이터타입이 Object인 변수 obj를 Student 데이터타입을 갖고있는 s라는 변수에 할당하고 싶은 것 (Student s = ____ obj)
// 4. 그래서 (Student) 형변환을 해줬음
return this.name == s.name ;
}
public static void main(String[] args) {
Student s1 = new Student ("egoing"); // @1에 의해 name = egoing를 가지는 객체 s1 생성됨
Student s2 = new Student ("egoing"); // @1에 의해 name = egoing를 가지는 객체 s2 생성됨
System.out.println(s1 == s2);
System.out.println(s1.equals(s2)); // 1. 이 s2가 equals(Object obj) 요 함수로 들어가게 되는데 s2의 데이터타입은 Student
}
}
결과
false
true
이유
System.out.println(s1 == s2);
- 데이터 자체가 다르니까
System.out.println(s1.equals(s2));
- 얘는 overriding해서 equal를 재정의해줬으니까
그 이유가 분명하지 않다면 비교 연산자 == 은 원시 데이터형을 비교할 때만 사용하자.
원시 데이터 형(Primitive Data Type)이란 자바에서 기본적으로 제공하는 데이터 타입으로 byte, short, int, long, float, double, boolean, char가 있다. 이러한 데이터 타입들은 new 연산자를 이용해서 생성하지 않아도 사용될 수 있다는 특징이 있다.
finalize는 객체가 소멸될 때 호출되기로 약속된 메소드
이 메소드의 취지만 이해하면 된다. 많은 자바의 전문가들이 이 메소드의 사용을 만류하고 있다.
가비지 컬렉션(garbage collection)
프로그래밍 언어들이 램을 효율적으로 사용하기 위해서 더 이상 사용하지 않는 데이터를 램에서 제거할 수 있는 방법들을 제공한다.
하지만 자바에서는 이러한 방법이 제한적으로 제공되고 있는데 그것은 자동으로 해주기 때문이다. 이 작업을 자동화한 것을 가비지 컬렉션이라고 한다.
package Object;
class Student2 implements Cloneable {
String name;
Student2 (String name){
this.name = name;
}
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
public static void main(String[] args) {
Student2 s1 = new Student2 ("egoing");
try {
Student s2 = (Student) s1.clone();
System.out.println(s1.name);
System.out.println(s2.name);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
Object 클래스를 놓고 생각해보자. 이 클래스가 모든 클래스의 부모라는 사실은 이해의 영역이 아니라 약속의 영역이다. 즉 자바를 만든 측과 자바를 사용하는 측의 약속이다. 그리고 이 클래스가 clone이나 toString과 같은 메소드를 가지고 있다는 것 또한 이해의 영역이 아니라 숙지해야 하는 영역이다. 한편 모든 클래스가 toString을 사용할 수 있고 또한 이 메소드를 새롭게 재정의 할 수 있다는 점은 이해의 영역이다. 어떤 지식을 배울 때는 이해해야 하는 것과 그냥 알아야 하는 것을 잘 분별하는 것이 중요하다.
( 출처 생활코딩 https://opentutorials.org/module/516/6241 )