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이라는게 들어가있으면 복사가 된것이다.
}
}
'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 |