Java Plus - accidentlywoo/sec GitHub Wiki

더 나아가기

파일과 Overriding, Class class, IO

jar 파일 실행시키기

  • 폴더구조 : 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 : 파일크기, 쓰기/읽기 가능, 최종사용시간

intaceof 와 Class 클래스

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);
		
	}
}

IO

자바에서 데이터는 스트림(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 : 바이트단위의 입력 -> 바이트단위의 출력

-> 종류를 맞추지 않으면 문자깨짐 발생

java.io 주요클래스 체크

DataInputStream / DataOutputStream -> 타입별로 다양한 메소드들이 제공된다.

writeInt(65);

문제점 : 다양한 타입별로 입력되는 데이터들은 출력시 그 타입과 순서를 알아야한다.

-> 유지보수성이 떨어지고, 보안상 취약하다.

ObjectInputStream / ObjectOutputStream

대표 메소드

writeObject(dt);
readObject();
  1. 객체의 필드(인스턴스 변수)
  2. 직렬화
  3. 송신

--->

  1. 수신
  2. 역직렬화

ObjectInputStream의 readObject 메소드의 동작

readObject(); // ClassNotFoundException dt = new Date();
  1. Date 클래스 찾기
  2. JVM이 로드
  3. 바이트코드 검증
  4. 인터프리트

-> Class clazz = Class.forName("Date");

클래스 타입의 객체생성

-> clazz.newInstance();

객체인스턴스변수를 채움 : setter

활용? : 분산시스템에서 사용한다!

RMI(Romote Method Invocation)

BufferedInputStream / BufferedOutputStream

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
⚠️ **GitHub.com Fallback** ⚠️