본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JAVA

JAVA 스터디 11 - Object 클래스

반응형

Object 클래스에 대하여

-java.lang 패키지

java.lang 패키지는 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합이다 . 따라서 자바에서는 java.lang 패키지 클래스들은 import 문을 사용하지 않아도 클래스 이름만으로 바로 사용할 수 있도록 하고 있다.

 

-java.lang.Object 클래스

 

java.lang 패키지 중에서도 가장 많이 사용되는 클래스는 바로 Object 클래스이다. Object 클래스는 모든 자바 클래스의 최고 조상 클래스가 된다.

따라서 자바의 모든 클래스는 Object 클래스의 모든 메소드를 바로 사용할 수 있다 .

Object 클래스는 필드를 가지지 않으며 , 총 11개의 메소드만으로 구성되어 있다.

 

1.toString( ) 메서드

 

toString() 메서드는 해당 인스턴스에 대한 정보를 문자열로 반환한다. 이때 반환되는 문자열은 클래스 이름과 함께 구분자로 '@'가 사용되며 , 그뒤로 16진수 해시 코드(hash code)가 추가된다. 16진수 해시 코드 값은 인스턴스의 주소를 가리키는 값으로 , 인스턴스마다 모두 다르게 변환한다.

 

*자바에서 toString() 메서드는 기본적으로 API 클래스마다 자체적으로 오버라이딩을 통해 재정의되 있다.

 

import java.io.File;

class Instance{

}

public class ObjectClassTest {

    public static void main(String[] args) {
        //각 class 마다 Object의 toString을 override하여 각각 구현 되었다

        //사용자 정의 클래스 toString
        Instance instance = new Instance();
        System.out.println("Object ===="+instance.toString());
        //String class의 toString
        String word = "word";
        System.out.println("String===="+word.toString());
        //파일 class의 toString
        File file = new File("D:\\users\\administrator\\Downloads\\huge.jpg");
        System.out.println("file===="+file.toString());
    }

}

 

2.equals() 메서드

equals() 메소드는 해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교하여 , 그 결과를 반환한다.

이떄 참조 변수가 가리키는 값을 비교하므로 , 서로 다른 두 객체는 언제나 false 를 반환 한다.

 

//equals()
Instance a = new Instance();
Instance b = new Instance();

//인스턴스의 주소가 다르기 때문에 false가 출력된다.
System.out.println(a.equals(b));

//b 를 a 에 대입해서 주소값이 같아졌다
a = b ;

//주소값이 같음으로 true가 출력된다
System.out.println(a.equals(b));

 

*자바에서 equals() 메서드는 기본적으로 각 API 클래스마다 자체적으로 오버라이딩 되어 있다.

 

 

3.clone() 메서드

 

clone() 메서드는 해당 인스턴스를 복제하여 , 새로운 인스턴스를 생성해 반환한다. 하지만 Object 클래스의 clone() 메서드는 단지 필드의 값만을 복사하므로, 필드의 값이 배열이나 인스턴스면 제대로 복제할 수 없다 , 따라서 이러한 경우에는 해당 클래스에서 clone() 메서드를 오버라이딩하여 , 복제가 제대로 이루어지도록 재정의 해야한다.

clone() 메서드는 데이터의 보호를 이유로 Cloneable 인터페이스를 구현한 클래스의 인스턴스만 사용 가능하다 .

 

import java.util.ArrayList;

class Phone implements Cloneable{

    private String phoneName;
    private ArrayList<String> owners = new ArrayList<>();

    public String getPhoneName() {
        return phoneName;
    }

    public void setPhoneName(String phoneName) {
        this.phoneName = phoneName;
    }

    public ArrayList<String> getOwners() {
        return owners;
    }

    public void setOwners(String owner) {
        this.owners.add(owner);
    }

    //부모 클래스의 clone을 호출하여 오버라이딩하고 있다.
    public Object clone(){
        try {
            Phone clonedPhone = (Phone)super.clone();
          1.clonedPhone.owners = (ArrayList<String>) owners.clone();
            return clonedPhone;
        }catch (CloneNotSupportedException ex){
            return null;
        }
    }
}

public class ObjectClassTest {

    public static void main(String[] args) {
          
        
        Phone phone1 = new Phone();
        phone1.setPhoneName("iphone");
        phone1.setOwners("UGO");
        System.out.println("Phone1=="+phone1.getPhoneName()+"owner=="+phone1.getOwners());

        2.Phone phone2 = (Phone)phone1.clone();
          phone2.setOwners("HONG");
        System.out.println("Phone1=="+phone1.getPhoneName()+"owner=="+phone1.getOwners());
        System.out.println("Phone2=="+phone1.getPhoneName()+"owner=="+phone2.getOwners());

    }

}

위의 코드는 clone() 메서드를 커스터마이징 하여 사용한 코드이다

첫번째로 clone()을 사용하기위해선 cloneable을 implements해야한다 .

1번은 clone()을 커스터마이징하는 부분인데 Phone 클래스는

String phoneName , List<String> owners 두가지 필드를 가지고 있다 .

phoneName은 바로 clone 되지만 List<String> 타입의 owners는 오브젝트 타입 특성상 주소값만 가지고 있기 떄문에 clone 되지 않는다 . 이를 해결하기 위해 1번처럼 오브젝트 타입의 필드는 따로 클론해줘야 한다 .

만약 1번 코드가 없다면 owners는 같은 주소값을 가리키기 떄문에 출력값은 아래와 같다.

 

Phone1==iphone,owner==[UGO]

Phone1==iphone,owner==[UGO, HONG]

Phone2==iphone,owner==[UGO, HONG]

 

만약 1번 코드가 있다면 clone하여 새로운 주소값을 갖는 owners를 가르키기 때문에 결과는 아래와 같다

 

Phone1==iphone,owner==[UGO]

Phone1==iphone,owner==[UGO]

Phone2==iphone,owner==[UGO, HONG]

 

Object 클래스의 모든 메소드 목록이다.

 

참조 https://advenoh.tistory.com/13

http://www.tcpschool.com/

반응형

'JAVA' 카테고리의 다른 글

JAVA 스터디 13 - 접근제어자  (0) 2021.03.23
JAVA 스터디 12 - 패키지  (0) 2021.03.23
JAVA 스터디 10 - final  (0) 2021.03.18
JAVA 스터디 9 - 추상 클래스와 추상메서드  (0) 2021.03.18
JAVA 스터디 8 - 상속  (0) 2021.03.18