Java Object 클래스

별의개발자커비·2023년 2월 15일
0

Java

목록 보기
39/66
post-thumbnail

1. Object

  • 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 Object 클래스가 가지고 있고
  • 자동적으로 모든 클래스는 Object 클래스를 상속받는다.
package org.opentutorials.javatutorials.progenitor;
 
class O {}

위의 코드는 아래와 코드가 같다.

package org.opentutorials.javatutorials.progenitor;
 
class O extends Object {}

  • 위의 그림은 Object 클래스가 가지고 있는 메소드를 보여준다.
  • 다시 말해서 자바의 객체는 위의 메소드들을 반드시 가지고 있다고 할 수 있다.

2. toString

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
  • 이유

    • c1의 호출을 명시적으로 하지않고 인스턴스를 담고있는 변수만을 프린트하게 되면 tostring 메소드를 호출하도록 약속되어있어서
  • Object라 생기는 점

    • Calculator에는 toString이라는 메소드는 없음
    • 하지만 자동 Calculator extends Object(Object를 상속함)이므로 Object이 갖고있는 toString을 사용할 수 있는 것
    • toString = Object의 멤버
    • Calculator = Object의 자식
  • 여기서 overriding ( 재정의 )
    - Object의 메소드(ex: toString) 를 재정의하는 것

    • toString이 호출하는 애를 바꿀 수 있음

3. equals

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를 재정의해줬으니까
      

== vs eqauls

  • 그 이유가 분명하지 않다면 비교 연산자 == 은 원시 데이터형을 비교할 때만 사용하자.

  • 원시 데이터 형(Primitive Data Type)이란 자바에서 기본적으로 제공하는 데이터 타입으로 byte, short, int, long, float, double, boolean, char가 있다. 이러한 데이터 타입들은 new 연산자를 이용해서 생성하지 않아도 사용될 수 있다는 특징이 있다.

4. finalize

  • finalize는 객체가 소멸될 때 호출되기로 약속된 메소드

  • 이 메소드의 취지만 이해하면 된다. 많은 자바의 전문가들이 이 메소드의 사용을 만류하고 있다.

  • 가비지 컬렉션(garbage collection)

  • 프로그래밍 언어들이 램을 효율적으로 사용하기 위해서 더 이상 사용하지 않는 데이터를 램에서 제거할 수 있는 방법들을 제공한다.

  • 하지만 자바에서는 이러한 방법이 제한적으로 제공되고 있는데 그것은 자동으로 해주기 때문이다. 이 작업을 자동화한 것을 가비지 컬렉션이라고 한다.

4. clone (이해 안감)

  • clone 메소드: 어떤 객체가 있을 때 그 객체와 똑같은 객체를 복제해주는 기능
  • implements Cloneable 추가해줘야
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 )

0개의 댓글