추상 클래스

문이빈·2023년 7월 26일
0
post-thumbnail
  • 추상클래스는 절대 new할 수 없다.
    -> 대신 Sub class를 이용하여 생성할 수있다.
    ex) Calendat cal = new GregorianCalendar();

  • 메소드 생성
    ex) Calendat cal = Calendat.getInstance();

  • 익명 Inner class

$1도 같이 생성 된다.

인터페이스
implements 하면 모든 추상메소드를 Override를 써준다,

대신 Override를 해주는 클래스로 생성
Collection coll = new ArrayList();
Map map = new HashMap();

메소드를 이용하여 해준다.
Iterator it = coll.iterator();
PreparedStatement pstmt = conn.preparedStatement();

package nested;

public abstract class AbstractTest { 
// POJO형식 , 추상메소드를 가진 클래스 여서 추상 클래스로 만들어 줌.
    String name;

public String getName() { // 메소드의 구현 부
	return name;
}

public abstract void setName(String name); // 추상메소드
}

--------------------------------------------------------------

public abstract class AbstractExam { 
// 추상클래스라고 추상메소드가 있을 필요는 없다.

public void cc() {}
}

--------------------------------------------------------------

public class AbstractMain {

public static void main(String[] args) {
	AbstractTest at = new AbstractTest() { // 익명 Inner class
	// 추상 클래스라서 생성(new) 불가, {} - 흑기사(잠깐 사용) 대신 오버라이딩 걸어줘야해
	
	@Override
	public void setName(String name) {
		this.name = name;
	}
};

at.setName("홍길동");
System.out.println(at.getName());

InterA in = new InterA() {
	public void aa() {}
	public void bb() {}
};

AbstractExam ae = new AbstractExam() {};
// 추상메소드가 없기 때문에 원하는 메소드를 선택해서 Override 
-> 추상메소드가 없는 추상 클래스 like 두끼
	}
}    


Comparable / Comparator 인터페이스

: 객체를 정렬하는데 필요한 메소드가 정의되어 있다
: 비교대상자가 더 크면(<) -1, 같다면(==) 0, 작으면(>) 1을 반환시켜줍니다. : 이 값을 비교하여 정렬을 할 수 있다. 일반적인 int, char, double 같은 타입의 배열이라면 다음 함수들을 이용
Collections(또는 Arrays).sort() : 정렬
Collectoins(또는 Arrays).reverse() : 뒤집기

  1. Comparable (java.lang) - 기본 정렬기준을 구현하는데 사용
  • 주로 Integer와 같은 warpper클래스와 String, Date, File과 같은 것
  • 기본적으로 오름차순으로 정렬되도록 구현되어 있다
  • public int compareTo(T o)
    public final class Integer
    extends Number
    implements Comparable<Integer>
  1. Comparator (java.util) - 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
  • public int compare(T o1, T o2)
  • public boolean equals(Object obj)

Collections.sort()

객체 정렬

package collection;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class PersonSort {

public static void main(String[] args) {
	String[] ar = {"orange", "apple", "banna", "pear", "peach", "applemango"};

System.out.print("정렬 전 = ");
for(String data : ar) {
	System.out.print(data+" ");
}
System.out.println();

Arrays.sort(ar); // 배열에 관련된 모든 메소드를 가진 클래스 - sort는 static으로 선언되어 있다. 

System.out.print("정렬 후 = ");
for(String data : ar) {
	System.out.print(data+" ");
}
System.out.println();
System.out.println("----------------------");

PersonDTO aa = new PersonDTO("홍길동", 25);
PersonDTO bb = new PersonDTO("프로도", 40);
PersonDTO cc = new PersonDTO("어피치", 35);

ArrayList<PersonDTO> list = new ArrayList<PersonDTO>();
list.add(aa);
list.add(bb);
list.add(cc);

System.out.println("정렬 전");
for(PersonDTO personDTO : list) {
	System.out.println(personDTO);
	
}//for
System.out.println();

System.out.println("이름으로 오름차순"); 
Comparator com = new Comparator<PersonDTO>() {

	@Override
	public int compare(PersonDTO o1, PersonDTO o2) { //구현
		return o1.getName().compareTo(o2.getName() ); // 오름차순
		
	//	return o1.getName().compareTo(o2.getName()) * -1; // 내림차순
		}
	};
	
	

// 나이는 정렬이 되지만 이름도 같이 움직이게 하기 위해 / collection이라는 객체 안에 들어 있어서
Collections.sort(list,com);

System.out.println("정렬 후");
for(PersonDTO personDTO : list) {
	System.out.println(personDTO);
	}//for
System.out.println();
    }
}


IO Stream (Input Output - IO)

입출력 처리

  • 단위
  1. byte 단위 처리(Stream이 붙어서 byte단위) (숫자, 영문자) - byte 스트림
    InputStream
    OutputStream
  2. 문자(char-2byte) 단위 처리(숫자, 영문자, 한글) - 문자 스트림
    Reader
    Writer

출력 시 파일 없으면 자동으로 파일 생성
입력 시 파일 없으면 Error (FileNotFoundException)

객체 직렬화

: 객체는 파일이나 네트워크로 전송이 안된다
: 객체를 byte[ ] 변환시켜서 전송해야한다
: Serializable

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataStream {

public static void main(String[] args) throws IOException{
	DataOutputStream dos = new DataOutputStream(new FileOutputStream("result.txt"));
	dos.writeUTF("홍길동");
	dos.writeInt(25);
	dos.writeDouble(185.3);
	dos.close();
	
	DataInputStream dis = new DataInputStream(new FileInputStream("result.txt"));
	String name = dis.readUTF();
	int age = dis.readInt();
	double height = dis.readDouble();
	
	System.out.println("이름 = " + name);
	System.out.println("나이 = " + age);
	System.out.println(" 키 = " + height);
	
	dis.close();	
    }
}

파일을 읽어 오려고

ByteStream.java

package io;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ByteStream {

public static void main(String[] args) throws IOException {
	BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("data.txt")));
	
//		System.out.println(bis.read()); 
            // A라는 첫번째 글짜 한개를 가져오는데 아스키 코드로 읽어옴
//		System.out.println(bis.read()); 
//		System.out.println(bis.read()); 
            // 더이상 읽을 문자(숫자 X, 기호 X)없으면 -1 값을 출력함
	
	int data;
	while((data=bis.read()) != -1) {
		System.out.print(data); 
        }
    }
}

엔터는 2byte \r\n

문자로 출력해 보기

int data;
while((data=bis.read()) != -1) {
     System.out.print((char)data); 



크기 구하기

배열의 잡아서 한번에 읽어

package io;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ByteStream2 {

public static void main(String[] args) throws IOException {
	File file = new File("data.txt");
	BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
	int size = (int)file.length();
	// 배열.length  파일의 크기 구하기 
	
	byte[] b = new byte[size];
	bis.read(b, 0, size);
	
	System.out.println(new String(b));
	
    }
}

java.io.NotSerializableException 객체 직렬화 오류

객체 직렬화

package io;

import java.io.Serializable;

public class PersonDTO implements Serializable{ // DTO는 1인분 클래스
    private String name;
    private int age;
    private double height;

public PersonDTO(String name, int age, double height) {
	super();
	this.name = name;
	this.age = age;
	this.height = height;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getAge() {
	return age;
}

public void setAge(int age) {
	this.age = age;
}

public double getHeight() {
	return height;
}

public void setHeight(double height) {
	this.height = height;
	}
}

public class PersonDTO implements Serializable
implements Serializable을 해줘야지 직렬화 준비 완료

package io;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class ObjectMain {

public static void main(String[] args) throws IOException, ClassNotFoundException {
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("result2.txt"));
		
		PersonDTO dto = new PersonDTO("홍길동", 25, 185.3);
		oos.writeObject(dto);
		oos.close();
// DataStream 처럼 한개씩 보내는게 아닌 한번에 뭉쳐서 보내는 방법.
            System.out.println("-----------------------------");
		
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("result2.txt"));
		PersonDTO dto2 = (PersonDTO)ois.readObject(); // 자식 = 부모
		System.out.println("이름 = " + dto2.getName());
		System.out.println("나이 = " + dto2.getAge());
		System.out.println("키 = " + dto2.getHeight());
		ois.close();
    }
}

객체는 파일이나 네트워크로 전송이 안되기 때문에
갖고 있는 객체를 byte[ ] 바이트 배열로 조각내어 변환시켜서 전송해야한다.
Serializable

단, 파일로 들어갈 땐 뭉쳐서 보내줘야 한다.(Serializable 이것만 잡으면 자바가 알아서 해줌 )

0개의 댓글