본문 바로가기

Dev.BackEnd/JAVA

[JAVA] 11 - 2. Object 클래스와 그 메소드들




Chapter 11 - 2. Object 클래스 .toString( ) 메소드, .clone( ) 메소드

 Java의 모든 클래스는 하나의 동일한 클래스를 상속받는다.

이렇게 하면 최상위 클래스에 정의되어 있는 메소드를 사용할 수 있게 되는 장점이 존재한다.

Object 클래스
모든 클래스의 조상인 Object 클래스

toString( )
문자화시키다.
이 메서드는 인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의한 것이다.
인스턴스의 정보를 제공한다는 것은 대부분의 경우 인스턴스 변수에 저장된 값들을
문자열로 표현한다는 뜻이다.

class A를 정의했다면 이 클래스에는 toString이라는 메소드가 없다.
하지만 호출할 수 있다.
Object 클래스의 상속을 받고 있는 class A 이므로 Object 클래스의 메소드은 toString 메소드이기 때문이다.

우리가 console 창에 출력할 때 쓰던 System.out.println( ) 메소드의 경우를 보면,
이렇게 자동적으로 toString 메소드가 호출된다.
1
System.out.println(c) ==> System.out.println(c.toString);
cs
물론 이 toString 메소드도 오버라이딩할 수 있다.
다른 클래스를 새롭게 정의하는 것보다 효율적이라고 할 수 있는 점은
Object 클래스 소속의 메소드가 되기 때문에
메소드 호출을 따로 할 필요가 없다는 것이다.

예제를 통해 보자,
code>
MyDate.java code>
1
2
3
4
5
6
7
8
9
10
11
public class MyDate {
    public int day;
    public int month;
    public int year;
    
    public MyDate(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;
    }
}
cs
MyDateTest.java code>
1
2
3
4
5
6
7
public class MyDateTest {
    public static void main(String[] args) {
        MyDate d1 = new MyDate(1222000);
        
        System.out.println(d1);//2000년 2월 12일 
    }
}
cs

이렇게 코드를 작성하고 작동시키면 다음과 같은 결과값이 출력된다.

d1이라는 인스턴스의 주소값이 출력되는 것이다.

console> class_160714.MyDate@2401f4c3
코드 상에 적은 주석처럼 나타나게 하게 위해서는 toString 메소드를 오버라이딩해야 한다.
1
2
3
public String toString(){
    return year + "년" + month + "월" + day +"일";
}
cs
 
MyDate 클래스에 위와 같은 코드를 추가해주면, toString 메소드를 오버라이딩할 수 있는 것이다.

조상클래스에 정의된 메소드를 자손클래스에서 오버라이딩 할 때는
조상에 정의된 접근범위보다 같거나 더 넓어야 하기 때문에,
접근제어자가 public 일 수 밖에 없다.



.clone( )
복제하다.
단순히 객체에 저장된 값을 그대로 복제할 뿐, 객체가 참조하고 있는 객체까지 복제하지는 않는다.
즉, 같은 객체를 참조하고 있기 때문에 '얕은 복사’를 하게 된다.
그래서 원본을 변경하면 복사본도 영향을 받는다.
원본이 참조하고 있는 객체까지 복제하는 것을 ‘깊은 복사’라고 한다.
깊은 복사에서는 원본과 복사본이 서로 다른 객체를 참조하기 때문에,
원본의 변경이 복사본에 영향을 주지 않는다.

복제를 하려면 복제 가능한 객체라는 것을 JVM에게 알려줘야 한다.
cloneable 이라는 인터페이스를 만들어줘야 한다.
cloneable 인터페이스에 들어가보면 아무것도 없다.
단지 구분자의 역할일 뿐이다.
clone메소드는  protected 접근 제어자를 갖고 있다.
그리고 java.lang 이라는 패키지에 담겨져 있다.
그래서 바로 가져다가 쓸 수 없다.
그래서 super를 사용한면서 접근 제어자를 public으로 바꿔준다..
그리고 예외처리를 해줘야 한다.
클래스에서는 사용자에게 던지고 사용자 측에서 try catch한다,
code>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Student implements Cloneable
{
     Student(String name){
          this.name = name;
     }
     public Object clone() throws CloneNotSupportedException{
          return super.clone();
     }
}
 
Student s1 = new Student ("a");
try{
     Student s1 = (Student)s1.clone();
catch(CloneNotSupportedException ) {
     e.printStackTrace();
}
cs




포스팅 내용은 생활코딩의 이고잉님의 강의자료를 기준으로 작성하였습니다. 문제가 될 시 삭제하겠습니다.

Chapter 11 - 2. The End