Java Plus - accidentlywoo/sec GitHub Wiki
파일과 Overriding, Class class, IO
- 폴더구조 : META-INF(정보의 정보) > MANIFEST.MF 내용
버전 표시 라인
진입접 표시 : Main-Class : FQCN(com.my.gui.Horse)
- 부모의 메소드와 동일한 리턴타입, 메소드 이름, 매개변수 리스트를 가져야한다.
- 접근 제한을 더 강하게 오버라이딩 할 수 없다.
- 새로운 예외를 throws할 수 없다.
ex)
class P{
public void m() throws IOException{
}
}
class C extends P{
public void m() throws IOException{}
public void m() throws FileNotFoundException{} // IOException의 하위 Exception이라 사용가능
public void m(){}
// public void m() throws {} // 컴파일 오류
// public void m() throws SQLException{}
}
JAVA SE
- Class : 클래스 정보 ( 클래스이름, 메소드들, 멤버필드들)
- Object : 객체정보 ( hashCode(), toString())
- File : 파일크기, 쓰기/읽기 가능, 최종사용시간
void m(Object o){
//o.a() Object에 없는 메소드 호출 : 컴파일 오류
if(o instanceof A){ // 다운캐스팅을 하기전에 클래스 체크
A a = (A)o;
a.a();
}
}
void m(Object o){
Class clazz = o.getClass();
if(clazz.getName().getSimpleName().equals("A")){
A a = (A)o;
a.a();
}
}
java -cp bin A
class A{
psvm(String[] args){
syso("hello");
Class.forName("java.util.Date"); // 런타임시에 클래스 로딩
}
}
class DCL{
public static void test(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class claszz = Class.forName(className);
claszz.newInstance(); // 매개변수없는 생성
// 자바빈즈의 조건에 만족해야 런타임 다이나믹 로드를 할 수 있다.
// -> public 매개변수없는 생성자
}
}
public class DynamicClassLoad {
public static void main(String[] args) {
System.out.println("hello");
Scanner sc = new Scanner(System.in);
String className = sc.next();
DCL.test(className);
}
}
자바에서 데이터는 스트림(Stream)을 통해 입출력되므로 스트림의 특징을 잘 이해해야한다.
Stream : 순차단방향 데이터 흐름 : ABC -C-B-A->
java.io 입출력 라이브러리 사용 가능.
키보드 : Stream - InputStream is = System.in;
파일 : - FileInputStream fis = new FileInputStream("a.txt");
파일 : Reader - FileReader fr = new FileReader("a.txt");
소켓 : InputStream is = socket.getInputStream();
프로세스 : InputStream is = process.getInputStream();
<>InputStream : 바이트단위 입력 : 이미지 파일, 멀티미디어, 텍스트 파일 가능
<>Reader : 문자단위 입력
int r = is.read();
int r = fis.read();
int r = fr.read();
int r = is.read();
<>OutputStream : 바이트단위 출력 스트림 - FileOutputStream
<>Writer : 문자단위 출력 - FileWriter
Reader - Writer : 문자단위의 입력 -> 문자단위의 출력
InputStream - OutputStream : 바이트단위의 입력 -> 바이트단위의 출력
-> 종류를 맞추지 않으면 문자깨짐 발생
writeInt(65);
문제점 : 다양한 타입별로 입력되는 데이터들은 출력시 그 타입과 순서를 알아야한다.
-> 유지보수성이 떨어지고, 보안상 취약하다.
대표 메소드
writeObject(dt);
readObject();
- 객체의 필드(인스턴스 변수)
- 직렬화
- 송신
--->
- 수신
- 역직렬화
readObject(); // ClassNotFoundException dt = new Date();
- Date 클래스 찾기
- JVM이 로드
- 바이트코드 검증
- 인터프리트
-> Class clazz = Class.forName("Date");
클래스 타입의 객체생성
-> clazz.newInstance();
객체인스턴스변수를 채움 : setter
활용? : 분산시스템에서 사용한다!
RMI(Romote Method Invocation)
InputStream is = System.in; //-> 표준 입력시스템은 InputStream 타입
InputStreamReader isr = new InputStreamReader(is); // 자바에만 있는 착한 녀석 Byte -> Char
BufferedReader br = new BufferendReader(isr); //(한줄 입력은 BufferedReader 밖에 없당!)
String line = br.readLine();
--간단하게 구현한 것이 바로 Scanner!
Scanner sc - new Scanner(System.in);
sc.nextLine();
Java SE 정보용 클래스
- Object
- Class
- File