728x90

-ArrayList : 수정과 삭제가 불가. 데이터값이 인접해있어서 전체를 출력할 때 주로 사용됨. ->중간에 데이터값을 삽입하면 그 값이 바뀜. 원래 있던 값은 뒤로밀려나는 것이 아니라 삭제됨.

-LinkedList : 서로 연결되어 있다.  수정과 삭제에 용이, 실제 데이터값이 이동할 필요가 없다.

 

 

List vs 배열 : 자신이 잘 구현하는 것을 사용하기. => List가 더 편하고 간편함. list관련 메소드가 자바api로 있기 때문에

큐->배열로 하면 원통형이 되고 코드가 길어짐

그래서 큐는 list사용

 

★★자료구조 : 효율적인 데이터 관리

List ->순서o, 중복허용

Map -> key와 value(한 쌍), 순서x

Set -> 중복허용x, 순서x

 

배열 ->List

구현방법 : 

  1. 객체 생성(제네릭 판단) ->구축됨

  2. 데이터추가(add, put) -count쓸필요xx

  3. 데이터 출력

    1. for문 list.size만큼 -> get()

    2. 향상된 for문

    3. Iterator - while (hasnext()) .next

        4.데이터 검색 -> get메소드

        5. 수정 : get ->add

        6.삭제 -> remove

 

arraylist vs. linkedlist

-전체를 순회할 때(메모리가 인접해서) 

 -비일비재로 수정삭제가 이루어질 때(메모리의 주소값이 연결되어 있어서)->스택과 큐를 이용(linkedlist)

 

정렬 -> Comparable (최초의 정렬) : compareTo() 오버라이딩

Comparator(정렬기준 변경) - compare() 오버라이딩

 

자바끝나고 필기, 실기시험 침 => 자가테스트

 

10장. 파일 입출력에 사용되는 자바 클래스들 

 

입출력은 클래스가 너무 많고 예외가 너무 많음.

입출력 클래스가 많은 이유는 : 데이터종류가 너무 많아서.

 

스트림 = 배관이라 생각하기

스트림 : 데이터를 운반하는데 사용되는 연결통로이다.

*3가지 카테고리

  1. 문자스트림(문자)/바이트(이미지, 파일),

  2. 입/출력 

  3. 노드스트림(원본에 연결하는것)/필터스트림(노드스트림을 연결시킴) : 노드스트링에서 하지 못했던 것을 더 연결해서 사용.

String -> Byte : getBytes()** 데이터타입 바꾸는 메소드 중요함

java.io 자바api이용

문자스트림 : Reader&Writer

바이트스트림 : Input&Output 클래스 

 

 

-FileReader

1단계 : 파일을 엽니다.

FileReader reader = new FileReader("poem.txt");

2단계 : 파일을 읽습니다.

data = reader.read(); -아스키코드 정수값 ->아스키코드 문자값

3단계 : 파일을 닫습니다.

reader.close();

예외처리할 때 -> catch문 하나만 해줘도 됨.

finally는 예외가 발생하든 안발생하든 실행되므로 reader.close를 이 안에다 넣어줌

 

방법1

int data = reader.read();//문자하나하나에 대한 아스키코드값 읽어옴.

                                if(data==-1)break;

                                char ch = (char)data;//아스키코드 -> 문자하나

                                System.out.print(ch);

다음 문자가 없을 때까지 반복 while(true) -if(data==-1)탈출조건 문

방법2

char arr[] = new char[50]; //위의 코드를 배열로 만듦.

                        reader.read(arr);

                        System.out.println(arr);

방법3(배열크기가 작을때)

FileReader reader = null;

                char arr[] = new char[5];

                

                try {

                        reader = new FileReader("poem.txt");

                        while(true) {

                                int data = reader.read(arr);

                                if(data == -1) {

                                        break;

                                }

                                System.out.print(arr);

                        }

 

-FileWriter

                FileWriter writer = null;

                Scanner sc = new Scanner(System.in);

                

                System.out.println("입력 :");

                String str = "";

                String poem = "";

                

                while(!(str=sc.nextLine()).equals("q")){

                        poem += str;

                        poem += "\n";

                }

                try {

                        writer = new FileWriter("poem2.txt");

                        writer.write(poem);

                } catch (Exception e) {

                        e.printStackTrace();

                }finally {

                        try {

                                writer.close(); //close를 안하면 완성이 안됨.

                        } catch (Exception e2) {}

                }

poem2파일에 나는바보다 생성됨.

 

-CopyExam

//poem.txt => poem3.txt copy

                

                FileReader reader = null;

                FileWriter writer = null;

                char arr[] = new char[50];

                

                try {

                        reader = new FileReader("poem.txt");

                        writer = new FileWriter("poem3.txt");

                        reader.read(arr);

                        writer.write(arr);

                        System.out.println("복사완료");

                }

                 catch (Exception e) {

                        e.printStackTrace();

                }finally {

                        try {

                                writer.close();

                                reader.close();

                        } catch (Exception e2) {}

                }

 

-노트스트림 & 필터스트림

inputStream : byte스트림  -> 키보드 문자(바이트)로부터 문자열을 얻고싶어함.

//Scanner 외에 입출력 스트림 이용해서 데이터 입력을 구현

//System.in => Inputstream 바이트=> InputStreamReader바이트 =>BufferedReader문자열(최초의 키보드내용을 가지게됨)

//BufferedWriter(문자열) -> FileWriter(바이트)

               

                InputStream in = System.in;

                InputStreamReader isr = new InputStreamReader(in);

                BufferedReader br = new BufferedReader(isr);

 

br = new BufferedReader(new InputStreamReader(System.in)); //위 세줄 한줄로가능

 

BufferedReader br = null;

                BufferedWriter bw = null;

                String str = "";

                

                try {

                        br = new BufferedReader(new InputStreamReader(System.in));

                        bw = new BufferedWriter(new FileWriter("output.txt",true));//추가로 정보를 넣을 수 있게.));

                        

                        System.out.print("입력 : ");

                        while((str=br.readLine())!=null) {   //멈추려면 ctrl+z하기

                                str += "\n";

                                bw.write(str);

                        }

                } catch (Exception e) {

                        e.printStackTrace();

                }finally {

                        try {

                                bw.close();

                                br.close();

                        } catch (Exception e2) {

                        }

                }

아침

점심

저녁

zz

bb

 

-ObjectInputStream/ObjectOutputStream : 내용물이 객체가 주고받음

out2.writeObject(obj); ->프로그램에 있는객체를 스트림(외부파일)으로 만드는 것을 직렬화(serialization)라고 한다.

외부파일에 있는 것을 자바파일로 가져오는 것 : 역직렬화

다만 모든 대상이 직렬화대상이 되는 것은 아니다.

 

---17장. 객체직렬화(serialization인터페이스)

serialization을 인터페이스 구현가능한 얘들만 객체직렬화가능.

arraylist 직렬화가능

Person 의 arraylist가 시리얼라이즈 구현해도 Person이 구현을 안하면 직렬화불가능

Person안의 연관관계에 있는 클래스들도 시리얼라이즈 구현해줘야 함.

 

ObjectOutputStream : 객체를 밖으로 뽑아낼때 사용하는 스트림(객체직렬화를 위한 스트림)

 

  1. 객체직렬화는 무엇인가

  2. Serialization인터페이스하기

  3. ObjectOutputStream과 ObjectInputStream사용하기

-Member

package Kosta.io;

import java.io.Serializable;

public class Member implements Serializable {

        private String name;

        private int age;

        

        public Member() {}

        public Member(String name, int age) {

                super();

                this.name = name;

                this.age = age;

        }

        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;

        }

        @Override

        public String toString() {

                return "Member [name=" + name + ", age=" + age + "]";

        }

        

        

}

 

-SerialMain

package Kosta.io;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

public class SerialMain {

        Member m;

        

        //직렬화

        public void write() {

                m = new Member("홍길동",20); //직렬화 가능 객체

                ObjectOutputStream oos = null;

                try {

                        oos = new ObjectOutputStream(new FileOutputStream("object.ser"));   //객체스트림 하나생성

                        oos.writeObject(m);   //스트림으로 직렬화되어 파일에 저장됨.                

                } catch (Exception e) {

                        e.printStackTrace();

                }finally {

                        try {

                                oos.close();

                        } catch (Exception e2) {

                                

                        }

                }

        }

        

        //역직렬화

        public void read() {

                ObjectInputStream ois = null;

                try {

                        ois = new ObjectInputStream(new FileInputStream("object.ser"));

                        m= (Member) ois.readObject(); //m은 멤버변수

                } catch (Exception e) {

                        e.printStackTrace();

                }finally {

                        try {

                                ois.close();

                        } catch (Exception e2) {}

                        

                }

        }

        public static void main(String[] args) {

                SerialMain se = new SerialMain();

                

                se.write();  //직렬화

                se.m = null;   //할당한 메모리를 삭제함.m은 주소값만 가지고 있음. 메모리가 삭제된 것은  아님. 하지만 자바는 가비지컬렉션을 가지고 있지. 자동으로 메모리가 삭제되도록

                se.read();//역직렬화

                

                System.out.println(se.m); //이 값은 파일에 있는 것을 역직렬화해서 가져온 것.

        }

}

 

Mission phoneinfo 7.저장 8. 불러오기 구현하기

 

 

-File클래스

자바api가 사용하는 정보를 손쉽게 가져올 수 있다.

아예 파일을 객체화시켜버리자! 파일에 대한 정보를 손쉽게 가져올 수 있다.

재귀함수를 이용해 file.listFiles하면 파일들의 내용을 다 불러올 수 있다.

 

File file1 = new File(); 파일이라는 클래스로 객체화 한 것. 새로운 파일을 하나 생성한 것이 아니다.

file1.createNewFile(); ->파일하나생성

file2.delete(); ->파일삭제

.classpath                    588 2020-07-01 23:36:56

.project                      911 2020-07-01 23:37:04

.settings                 <DIR> 2020-07-01 23:37:04

build                     <DIR> 2020-07-01 23:36:55

object.ser                     86 2020-07-22 15:44:39

output.txt                     27 2020-07-22 12:24:32

poem.txt                       47 2020-07-22 10:36:00

poem2.txt                      16 2020-07-22 10:55:23

poem3.txt                      78 2020-07-22 12:20:03

src                       <DIR> 2020-07-18 10:21:34

WebContent                <DIR> 2020-07-01 23:36:56

 

 

★★오늘 해야할 일 : 1. phoneinfo배열 list바꾸는 것 완벽구현하기,  7,8 구현

                                2. FileMission

 FileMission (폴더에 있는 리스트목록 출력하기)       

public static void repeat(File file) {

                

            File[] arr = file.listFiles();

            for(int i=0;i<arr.length;i++) {

                if(arr[i].isDirectory()) {//폴더가있나요

                    System.out.println();

                    System.out.println("["+arr[i].getName()+"]");

                          repeat(arr[i]);

                        } else {

                    System.out.println("-"+arr[i].getName()+"-");

                        }

                }

        }

       public static void main(String[] args) {

                //재귀함수로 디렉토리를 찾으면 그 안에 계속 들어가서

                //모든 폴더의 모든 문서를 출력

                String path = "C:\\Users\\mhee4\\Desktop";

                File f = new File(path);

                    if(f.exists() && f.isDirectory()) {

                    repeat(f);

                   }

        }

                                3. 읽기/쓰기 복습

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

+ Recent posts