IO 스트림과 제너릭타입
IO 스트림
- 프로그램 외부와 입출력 수행을 동일한 방법으로 수행하기 위해 장치를 통해 입출력되는 데이터의 흐름을 추상화 하는 도구입니다.
- 입출력은 한쪽 방향으로만 동작 되기 때문에 각각 입력 스트림, 출력 스트림으로 구현하고 통신하기 위해서 각각 모두 갖추고 있어야 합니다.
- 바이트 기반 스트림 : 모든 종류의 데이터를 바이트 단위로 취급하며 InputStream/OutputStream로 파생하여 사용합니다.
- 문자 기반 스트림 : 문자만을 받고 보낼 수 있는 스트림으로 Reader/Wirter로 파생하여 사용합니다.
- 콘솔 입출력 : 키보드로 입력을 받고 모니터로 출력하는 소프트웨어 입니다.(System.in, System.out,Scanner)
- 파일 입출력 : 파일의 생성및삭제, 디렉터리 생성및 삭제, 정보 구하기 등을 수행합니다. 이때 파일 객체를 생성했다고 파일이나 디렉터리가 반드시 생성되는것이 아니며 생성자 매개값이 비어져 있어도 익셉션이 발생하지 않기 때문에 사용시 exist()를 이용해 존재 여부를 확인하고 사용해야 합니다.
- 보조스트림 : 단독으로 수행될 수 없고 다른 스트림과 연결하여 사용해야 하며 입력/출력 소스와 연결되어 수행되어집니다.
- 직렬화 : 객체를 출력하기 위해 객체의 데이터 필드 값을 연속적인 바이트로 변경하는 행위입니다. 자바는 Serializable 인터페이스를 구현하는 객체만 직렬화/역직렬화가 가능합니다. serialVersionID 필드를 통해 동일 여부를 판단 하며 개발자가 따로 작성하지 않을 경우 랜덤 값을 부여하게 됩니다. 서로 다른 프로그램이 객체를 주고 받을 때 개발자가 serialVersionID를 동일하게 주어 사용하는데 값이 다르면 다른 객체로 인식하기 때문입니다. 대상 객체가 필드를 가진 클래스를 상속받아 생성되는 객체일때 부모가 Serializable 인터페이스를 구현하지 않았다면 따로 readObject/writeObject 메서드를 정의를 해주어야 합니다. 부모에서 먼저 처리후 자식에서 defaultReadObject/defaultWriteObject 를 사용해 처리합니다.
제너릭 타입
public class Example<T>
- T 타입 파라미터에 따라 타입이 달라지게됩니다.
=>중복 코딩 줄여줍니다.
제너릭을 사용하는 이유
- Object로 인해 빈번한 타입변환 발생으로 인한 프로그램 성능 저하 방지합니다.
- 중복코딩방지 합니다.
- 컬렉션, 람다식
제한된 타입 파라미터
- 타입파라미터에 상위타입을 extends하여 해당 상위 타입을 구현하거나 하위만 지정이 가능하게 하여 제한합니다.
제너릭타입의 상속
- 부모의 타입 파라미터는 계승하고 그대로 사용하거나 추가해야합니다.