본문 바로가기

IT일반과목/java

Object 클래스에 대해서



https://docs.oracle.com/javase/8/docs/api/ -> 여기 들어가서 보면 자동으로 닫는게 있다.-


>FileInputStream이걸 보면된다.

AutoCloseable라는걸 상속을 한게 있다.

java.lang.Object

java.io.InputStream

java.io.FileInputStream

이것도 보면 다 상속을 받은것이다.

Closeable를 상속해서 구현을 했고 autoClose로가보면 인터페이스가 void형 하나밖에 없다.

IO관련된건 전부다 이걸 상속받아 만들었다고 생각하면된다.

자바는 거의 100% 상속을 받아서 만들어져있다고보면된다.


프로젝트->objcet->jongkyu.test(패키지)->Exam(클래스)

만들고 jongkyu.run(패키지)->Run(클래스)만들고보면

run에서 객체 생성후 보면 없어야정상인데 있는걸 볼수있다.


extends Object를 자동으로 상속받는다. ->아무것도 적지않았을경우 

모든클래스의 부모이다.


=====================================================================================

Object 클래스

 -> 클래스 만들면 자동으로 Object 클래스를 상속받는다.

 -> extends Object가 자동으로 들어간다.

 -> 모든클래스의 조상클래스


public class Test {


}

public class Test extends Object {


}

이거랑 동일하다 


public class Silver extends Grade {


}

이렇게 만들어도 Object의 후손이다.

public class Grade extends Object{

}

Grade안에 어차피 Object를 상속받기때문에

다 상속받는거랑 같다.


API문서를 보았을때도 전부 보면 extends Object라고 다 써져있다.


toString, clone, hashcode, equals를 봐보겠다. -> Object클래스안에것들을 보겠다.


toString


System.out.println(e);//jongyu.test.Exam@7852e922

System.out.println(e.toString());//jongyu.test.Exam@7852e922


이렇게 뜬다.패키지명이 뜨고, 클래스명이뜬다.@는 구분자이고, 뒤에값은 인스턴스를 식별하기 


위한값이다.


새롭게 몇개 더만들어보면 뒤에 코드가 다 다르다. 식별하기 위한 값이다.

Exam e = new Exam();

System.out.println(e);

System.out.println(e.toString());

Exam e1 = new Exam();

System.out.println(e1);

이렇게 보인다는 것이다.


@Override

public String toString() {

return "toString호출";

}

이렇게 해줬을 경우 오버라이드 한 그게 호출이 된다는 것이다.

===================================================

package jongyu.test;


public class Exam {

@Override

public String toString() {

String a="클래스명 : "+getClass()+"\n인스턴스 주소 : 


"+Integer.toHexString(hashCode());

return a;

}

}


hashcode() -> 주소가 아니다.

 -> 주소값이 아니고 객체를 구별하기 위한 고유 정수값이다.

 -> 같은객체는 같은값, 다른객체 다른값

=======================================================

toString -> 객체를 호출했을때 출력해주는 결과이다.


Clone

 -> 복제

 -> 객체자체를 복사해서 다른객체에도 사용하려면 clone을 사용해야함.

문제가 있다.

 -> 접근제어지시자가 protected이다.

 -> protected는 다른패키지에서 사용할 수가 없다.

 -> 그래서 오버라이딩이 반드시 필요하다.

 -> clone메소드 만들때 Cloneable인터페이스를 상속받아서 만들어야 한다.


->clone에서 왜 object를 return으로 줘야할까?

 -> clone이 객체를 복사하고 있다는건 새로 객체를 만든다면 그 주소값을 전달해줘야된다는 말


이니 데이터타입을 object로줘야한다는 것이다.

결국 주소값을 반환해줘야되고 객체형태여야 주소값을 줄수있기때문에 리턴타입이 object인것이


다.


================================================================


==============================================================

소스

==============================================================

package jongkyu.run;


import jongyu.test.*;


public class Run {

public static void main(String[] args) {

// Exam e = new Exam();

// System.out.println(e);

// System.out.println(e.toString());

// Exam e1 = new Exam();

// System.out.println(e1);

CloneTest c1 = new CloneTest(10);

//이거일경우 결국 CloneTest에10이라는값을 넣은것이다.

CloneTest c2=null;

//c2=c1.clone();//이게 안되는 이유가 10이라는 데이터를 넣어서 객체를 만들었고

//c2라는건 만들기만하고 실제 객체는 연결은 안되어있는데 왜안되냐면

//clone은 다른객체에서 가져다 쓸수없다. protected이기 때문이다.

//그렇다면 CloneTest에서

//implements Cloneable라고 써줘야된다.

//c1.clone라는곳의 주소에 10을 넣었다.

//그렇다면 data가 10이라는걸 들어가있다.

//c2라는게 있는 상태에서 주소가안들어가있으니 주소를 넣는방법이 

/*

* public Object clone() throws CloneNotSupportedException{

return super.clone();

*이거인 것이다.

}

*/

try {

c2=(CloneTest)c1.clone();//아까 보았을때 부모의것을 갖고왔기때문에 자식껏도 쓸수있게 해준것이다.

}//자식객체만갖고있는 메소드는 형변환을 해줘야 했었다.

catch(CloneNotSupportedException e){

e.printStackTrace();

}

System.out.println(c2.getData());

//c2의 데이터에 10이라는게 들어가있으면 복사가 된것이다.

}

}


-------------------------------------------------------------------------------------------------
package jongyu.test;

public class CloneTest implements Cloneable {
private int data;//변수
public CloneTest() {
}//기본생성자
public CloneTest(int data) {
this.setData(data);
}//생성자
public int getData() {
return data;
}//getter
public void setData(int data) {
this.data = data;
}//setter
public Object clone() throws CloneNotSupportedException{
return super.clone();
//의미가 뭐냐면 
//부모의 clone메소드를 통해서 
//객체를 새로 만들고 그 주소값을 리턴해주겠다.
}
//CloneTest는 즉 Object의 자손이며 new라는걸 통해서 CloneTest를 쓸수있다.
//Object o = new CloneTest -> 다형성때문에 Object라는곳에 CloneTest라는곳의 주소를 넣은것이다.
//자식객체를 만들고 부모객체로 리턴해주겠다는 것이다.
//어떤식으로 리턴을 해주며 다형성을 쓸수밖에 없다는 것이다.
//Object라는자식이 수많으니 그걸로 싹다 리턴해버리겠다는 것이다.
//그렇다고 Object에 익숙해지진 말자.
//Object라는 부모클래스의 자식클래스의주소를 넘겨서 그걸 갖고오겠다는 것이다.
//부모클래스의 clone를 만들어주는데 값도 복사를 한다.데이터는 10이라는걸 복사한다.
//복사를 했으면 객체가새로만들어졌으니 new역할을한다는것이다.
//new역할은 객체만들고 주소갖고오는것이였다
//Object라는 형태로 갖고온것이다.
}

------------------------------------------------------------------------------------------------------------------------
package jongyu.test;

public class Exam {
@Override
public String toString() {
String a="클래스명 : "+getClass()+"\n인스턴스 주소 : "+Integer.toHexString(hashCode());
return a;
}
}


'IT일반과목 > java' 카테고리의 다른 글

자바 Collections  (0) 2018.08.01
equals, hahscode  (0) 2018.08.01
예외처리7  (0) 2018.08.01
예외처리 6  (0) 2018.08.01
집공부  (0) 2018.07.31