객체지향 프로그래밍은 객체를 재사용함으로써 생산성을 향상시키는 것이 모적이다.
자바 IO객체들은 서로가 협력해서 원하는 작업을 처리하도록 설계되어 있다.
class Parent 2 {
int i = 7;
public int get(){
return i;
}
}
class Child2 extends Parent2{
int i = 5;
public int get(){
return i;
}
}
public class ChildTest{
public static void print(Parent2 p){
system.out.println(p.i);
system.out.println(p.get());
}
}
이런 코드가 있다.
Parent2 p2 = new Child2()
system.out.println(p2.i);
system.out.println(p2.get());
정답은 7, 5 이다.
변수가 메모리에 올라가게될경우, Parent2나 Child2 둘다 올라가게 된다.
하지만 메소드가 오버라이딩 될경우, 자식의 것만 남긴다.
Child2 c = new Child2()
system.out.println(c);
system.out.println(p2);
이것의 값은 7,5 7,5이다.
이처럼 변수는 선언된것을 따라가고 메소드는 참조된것을 따라간다.
자바 IO란 자바 프로그램에서의 입력작업, 출력작업을 의미한다.
읽고 쓸수 있는 클래스는 바이트 단위로 읽고 쓰는 '바이트 스트림 클래스'와
문자 단위로 읽고 쓰는 '문자 스트림 클래스'로 나뉜다.
자바 API를 읽어 볼 필요가있다.
다음 문제를 살펴보자.
"키보드로부터 한줄 씩 입력받아 화면에 한 줄씩 출력하시오."
① BufferedReader의 readLine()이라는 한줄을 입력받는 메소드가 있으므로 사용한다.
② system.in 키보드로부터 입력받기 위해 무조건 사용해야 한다.
③ 화면에 출력하기 위해 사용한다.
처음에 BufferedReader 클래스를 heap메모리에 올린다.
하지만 BufferedReader의 클래스 생성자는 기본생성자가 없다.
BufferdReader = new BufferedReader(Reader객체나 Reader의 자손 활용)
Reader클래스는 추상 클래스여서 리더의 직계자손들중이 InputStreamReader를 사용하고
InputStreamReder는 인자로 InputStream을 받는다.
System.in이 InputStream이기 때문에 아래와 같은 코드가 가능하다.
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReder(isr)