# IO_ Objectdao
package com.kh.chap04_assist.part02_object.model.dao;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.kh.chap04_assist.part02_object.model.vo.Book;
public class ObjectDao {
//프로그램 --> 외부매체(파일)
//출력
- ObjectOutputStream
=> 객체단위를 파일에 출력하고자 할 때 필요한 보조 스트림
public void fileSave(String fileName) { //메인메소드에서 파일 이름을 입력받아서 파일 생성하기
Book b = new Book("해리포터", "조앤", "영국", 20000);
//1단계. 기반스트림 => FileOutputStream
//2단계. 보조스트림 => ObjectOutputStream
//3단계. 객체데이터를 파일에 출력 => writeObject()
//4단계. 자원 반납 => close
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));){
//3단계. 객체데이터를 파일에 출력 => writeObject()
oos.writeObject(b);
}catch(IOException e) {
e.printStackTrace();
}
//객체로 파일로 출력했더니 NotSerializableException 직렬화가 안됨
//잘 담겼나 확인해보려면? -> 다시 입력받아서 콘솔에 찍어보기
//프로그램 <-- 외부매체
//입력
}
public void fileRead(String fileName) {
//FileInputStream : 기반 스트림
//ObjectInputStream : 객체 단위로 파일로부터 읽어 올때 사용하는 보조스트림
FileInputStream fin = null;
ObjectInputStream ois = null;
//1.기반스트림생성
//2.보조스트림생성
//3.읽어오기 => readObject()
//4.자원반납
try { //실행할 코드 예외발생할 수도 있고 안 할 수 도 있음
//1. 기반 스트림 생성
fin = new FileInputStream(fileName);
//2. 보조 스트림 생성
ois = new ObjectInputStream(fin);
//3.읽어오기 readObject()
//역직렬화는 readObject()가 알아서 해줌
Book b = (Book)ois.readObject(); //우항은 원래 Object형으로 => Book은 Object를 상속받고 있기때문(무엇을 읽어올 지 모르기때문에)
System.out.println(b);
//Book [title=해리포터, author=조앤, publisher=영국, price=20000]
} catch(IOException e ) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally{
try {
ois.close();
fin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
# Vo_Book
- implements Serializable{ //직렬화 인터페이스 구현 (상수필드, 추상메소드 하지 않아도 직렬화 해줌)
package com.kh.chap04_assist.part02_object.model.vo;
import java.io.Serializable;
public class Book implements Serializable{ //직렬화 인터페이스 구현 (상수필드, 추상메소드 하지 않아도 직렬화 해줌)
private String title;
private String author;
private String publisher;
private int price;
public Book() {
}
public Book(String title, String author, String publisher, int price) {
this.title = title;
this.author = author;
this.publisher = publisher;
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Book [title=" + title + ", author=" + author + ", publisher=" + publisher + ", price=" + price + "]";
}
}
# ObjectRun
package com.kh.chap04_assist.part02_object.run;
import com.kh.chap04_assist.part02_object.model.dao.ObjectDao;
public class ObjectRun {
public static void main(String[] args) {
ObjectDao od = new ObjectDao();
//od.fileSave("book.txt");
od.fileRead("book.txt");
}
}
# Collection_List
- ArrayList_Vo
package com.kh.chap01_list.part01_arrayList.model.vo;
public class Music {
private String title;
private String artist;
public Music() {
}
public Music(String title, String artist) {
this.title = title;
this.artist = artist;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
@Override
public String toString() {
return "Music [title=" + title + ", artist=" + artist + "]";
}
}
- ListRun
package com.kh.chap01_list.part01_arrayList.run;
import java.util.ArrayList;
import java.util.List;
import com.kh.chap01_list.part01_arrayList.model.vo.Music;
public class ListRun {
public static void main(String[] args) {
* 컬렉션(Collection)
: 자료구조가 내장되어있는 클래스 -> 자바에서 제공하는 "자료구조"를 담당하는 "프레임워크"이다.
- 자료구조: 데이터들을 효율적으로 다룰 때 (조회, 정렬, 추가, 수정, 삭제)필요한 개념
- 프레임워크: 효율적인 기능들이 이미 정의되어있는 틀
* 정리해보면,
데이터들이 새롭게 추가되거나, 삭제되거나, 수정 되는 기능(알고리즘)들이 이미 정의되어있는 틀 == 컬렉션
* 배열과 컬렉션의 차이점
- 배열의 단점
1. 한 타입의 데이터들만 저장 가능
2. 배열을 쓰고자 할 때 먼저 크기를 지정해야 함
- 한 번 지정된 크기는 변경이 불가능
- 새로운 값을 추가하고자 할 때 크기가 넘쳐나니까 새로운 크기의 배열을 만들고, 기존의 내용들을 복사하는 코드를 직접짜야 함
3. 배열 중간 위치에 새로운 데이터를 추가하거나 삭제하는 경우
- 기존의 값들을 땡겨주거나, 밀어주는 코드를 직접 짜야 함.
- 컬렉션의 장점
1. 기본적으로 여러 타입의 데이터들을 저장 가능
=> 같은 타입의 데이터들만 묶어서도 저장가능
(제네릭 설정을 통해 한 타입의 데이터들만 묶을 수 있게끔도 만들 수 있음)
2. 크기에 제약이 없음
=> 굳이 크기 지정을 하지 않아도 된다. (기본적으로 10칸, 5칸을 채우면 2.5칸이 자동으로 늘어남)
=> 만약 내가 크기 지정을 했고, 크기를 넘어서는 값을 더 추가하고자 할 때 알아서 크기가 늘어난다.
3. 중간에 값을 추가하거나 삭제하는 경우 값을 땡겨주거나 밀어주는 코드가 이미 메소드를 정의되어있음.
=> 그 때 마다 필요한 메소드들을 호출해서 사용할 수 있음.
* 방대한 데이터들을 담아만 두고 "조회"만 할 목적 => 배열 (공간적인 효율이 좋음)
* 방대한 데이터들을 추가, 수정, 삭제 할 경우 => 컬렉션
* 3가지 종류의 컬렉션(계열 간의 사용법은 모두 같음)
- List 계열: 담고자하는 값(Value)만 저장 / 저장 시 순서를 유지(Index), 중복값을 허용
예) ArrayList, LinkedList, Vector
ArrayList가 가장 많이 쓰임
- Set 계열: 담고자하는 값(Value)만 저장 / 저장 시 순서 유지 X, 중복값 허용X
예) HashSet, TreeSet => HashSet에 대해서 배울것
- Map 계열: 키(Key) + 값(Value) 세트로 저장 / 저장 시 순서 유지 X, 중복키 허용X / 중복값 허용
예) HashMap, HashTable, TreeMap, Properties
=> HashMap, Properties에 대해서 배울 것
ArrayList의 선언 방법
[표현법]
ArrayList 객체이름 = new ArrayList();
1. 크기를 따로 지정 안 하는 방법
ArrayList 객체이름 = new ArrayList(크기);
2. 크기 지정, 크기의 범위를 벗어날 경우 자동으로 크기가 늘어남
ArrayList list = new ArrayList(3);
=> 내부적으로 크기가 3의 ArrayList를 만들겠다.
System.out.println(list); //toString 오버라이딩 //[]출력
1. 비어있는 list에 추가 => Music객체를 만들어서 추가해보자
add(E e): 해당 리스트의 마지막에 인자로 전달된 요소를 추가해주는 메소드
E --> element: 제네릭(오브젝트)
list.add(new Music("다함께차차차", "설운도"));
list.add(new Music("땡벌", "남진"));
list.add(new Music("아기상어", "핑크퐁"));
//순서가 유지되면서 저장된다(Index개념있음)
list.add("끝");
//크기가 자동으로 늘어남
//다른 자료형을 넣어도 잘 실행됨
//담은 순서 그대로 진행
System.out.println(list); //toString 오버라이딩 , 넣은 순서대로 입력됨.
// [Music [title=다함께차차차, artist=설운도], Music [title=땡벌, artist=남진], Music [title=아기상어, artist=핑크퐁], 끝]
// add 메소드 사용 시 오버로딩된 형태를 사용해보자
- add(int index, E e): 리스트의 인덱스 자리에 전달된 e를 추가시켜주는 메소드
list.add(0, "시작");
list.add(3, new Music("어텐션", "뉴진스"));
// 중간에 값 추가 시 알아서 기존의 값들을 뒤로 한 칸씩 밀어주는 작업이 내부적으로 진행됨.
System.out.println(list);
//[시작, Music [title=다함께차차차, artist=설운도], Music [title=땡벌, artist=남진], Music [title=어텐션, artist=뉴진스], Music [title=아기상어, artist=핑크퐁], 끝]
2. 값을 추가해보았으니, 수정을 해보자.
- set(int index, E e) : 리스트의 index자리에 값을 전달된 e로 변경해주는 메소드
list.set(0, "시이이작");
list.set(1, new Music("아파트", "김건모"));
System.out.println(list);
//[시이이작, Music [title=아파트, artist=김건모], Music [title=땡벌, artist=남진], Music [title=어텐션, artist=뉴진스], Music [title=아기상어, artist=핑크퐁], 끝]
3. 값을 삭제해보자.
- remove(int index) : 리스트의 index자리에 담긴 값을 삭제해주는 메소드
list.remove(0);
//list.remove(5);//IndexOutOfBoundsException : index 5 발생 => 4번까지 있어서
//인덱스의 값을 잘 고려해서 삭제해야 함
String str = (String)list.remove(4); //우항의 자료형이 제네릭(Object)이기 때문에 String으로 형변환해줌
Music m = (Music)list.remove(1);
System.out.println(str);
//끝
System.out.println(list);
//[Music [title=아파트, artist=김건모], Music [title=어텐션, artist=뉴진스], Music [title=아기상어, artist=핑크퐁]]
System.out.println("삭제된 음악: " + m);
//삭제된 음악: Music [title=땡벌, artist=남진]
4. list의 크기를 반환해보자.
- size() : 리스트의 크기를 반환해주는 메소드 == 담겨있는 요소의 개수
System.out.println("리스트에 담긴 요소의 개수: " + list.size());
//리스트에 담긴 요소의 개수: 3
System.out.println("리스트의 마지막 인덱스 번호: " + (list.size()-1));
//리스트의 마지막 인덱스 번호: 2
list.remove(list.size()-1); //리스트의 마지막 인덱스 삭제하고 싶을 때
System.out.println(list);
//[Music [title=아파트, artist=김건모], Music [title=어텐션, artist=뉴진스]]
list.add(0, new Music("붉은노을", "이문세"));
list.add(3, new Music("좋은날", "아이유"));
System.out.println(list);
//[Music [title=붉은노을, artist=이문세], Music [title=아파트, artist=김건모], Music [title=어텐션, artist=뉴진스], Music [title=좋은날, artist=아이유]]
5. 리스트의 해당 인덱스에 담긴 요소를 반환해주는 메소드
//get(int index) : E
Music music = (Music)list.get(0); //강제형변환
//1번 인덱스의 곡 제목을 알고 싶다.
System.out.println(music);
//Music [title=붉은노을, artist=이문세]
System.out.println("1번 인덱스의 곡 제목: " + ((Music)list.get(1)).getTitle());
1번 인덱스의 곡 제목: 아파트
//index개념 + get메소드 => 반복문
//출력예제
//1번째 곡 : 붉은 노을
//2번째 곡 : 아파트
//3번째 곡 : 어텐션
//4번째 곡 : 좋은 날
for(int i = 0; i<list.size(); i++) {
System.out.println((i+1) + "번째 곡: " + ((Music)list.get(i)).getTitle());
}
//향상된 for문 => 값을 조회하는 목적으로 사용이 가능
//for(값을 받아줄 변수: 순차적으로 접근할 배열 또는 컬렉션)
for(Object c:list) {
System.out.println(c);
}
6. 리스트의 부분만 추출
//subList(int index1, int index2) : List
//index1부터 index2까지의 데이터 값들을 추출해서 새로운 리스트로 반환
List sub = list.subList(1, 3);
System.out.println(sub); //import java.util.List; => arrayList가 아닌 List에 있음.
7. 리스트 + 리스트
//addAll(Collection c) : 해당 리스트에 다른 컬렉션에 있는 데이터들을 통째로 추가해주는 메소드
list.addAll(sub);
System.out.println(list); //데이터(Value)의 중복 저장 가능
8. 리스트가 비어있는 지 확인하는 메소드 ******중요*******
//isEmpty(): 비어있으면 true, 채워져있으면 false
System.out.println(list.isEmpty());
9. 해당 리스트를 통째로 비워주는 메소드
//clear()
list.clear();
System.out.println(list);//[]
System.out.println(list.isEmpty()); //ture
}
}
- GenericRun
package com.kh.chap01_list.part01_arrayList.run;
import java.util.ArrayList;
import com.kh.chap01_list.part01_arrayList.model.vo.Music;
public class GenericRun {
public static void main(String[] args) {
* 제네릭(Generic) <E>
: 컬렉션 안에서 다룰 타입들을 미리 지정해주는 역할 => 명시적으로 <Music>, <String>
=> 내가 사용하고 싶은 타입만 사용할 수 있게 해준다.
=> 객체의 형변환을 사용할 필요가 없다.
* 별도의 제네릭 제시 없이 컬렉션 객체 생성 시 (E == Object)
* 다양한 타입의 값이 담길 수 있음
* vs
* 제네릭을 제시 <Music> (E==Music)
* 제네릭을 쓰는 이유
* 1. 저장한 타입의 제한을 두기 위해서
* 2. 매 번 형변환 하는 절차를 없애기 위해서
//컬렉션 생성 시 제네릭을 설정
[표현법]
ArrayList<E> list = new ArrayList();
ArrayList<Music> list = new ArrayList(); //부모 클래스인 List를 사용해주는 게 더 좋음
//ArrayList<Music,String> list = new ArrayList(); => 할 수 있는 컬렉션이 따로 있음
System.out.println(list); //[]
//값 추가
//list.add("시작"); // Music타입만 넣도록 지정했기 때문에 String형은 넣을 수 없음
list.add(new Music("1", "2"));
list.add(1, new Music("5", "6"));
list.set(1,new Music("3","4")); //값 수정
System.out.println(list); //[Music [title=1, artist=2], Music [title=3, artist=4]]
Music m = list.get(0); //따로 형변환을 해주지 않아도 됨
System.out.println(list.get(0).getTitle());//1
//향상된 for문
for(Music m1 : list) {
System.out.println(m1); //Music 그대로 자료형을 사용 가능
// Music [title=1, artist=2] Music [title=3, artist=4]
}
}
}
# MVC
- model_vo
package com.kh.list.mvc.model.vo;
public class Music {
//필드부
private String title;
private String artist;
//생성자부
public Music() { //객체생성하기위해
}
public Music(String title, String artist) { //객체생성과 동시에 초기화하기 위해
this.title = title;
this.artist = artist;
}
//메소드부
public String getTitle() { //조회, 호출한 곳으로 반환
return title;
}
public void setTitle(String title) { //입력, 수정
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
@Override //어노테이션
public String toString() {
return "Music [title=" + title + ", artist=" + artist + "]";
}
}
- MusicView
package com.kh.list.mvc.view;
import java.util.ArrayList;
import java.util.Scanner;
import com.kh.list.mvc.controller.MusicController;
import com.kh.list.mvc.model.vo.Music;
//view: 시각적인 요소, 입/출력
public class MusicView {
private Scanner sc = new Scanner(System.in); // 필드에 있으므로 private 해주기
private MusicController mc = new MusicController();
//메인화면
public void mainMenu() { //하나의 메소드는 하나만 실행
while(true) { //ArrayList
System.out.println("*** 음악은 역시 소리바다 ***");
System.out.println("1. 새로운 곡 추가"); //add() //2. 어떤 기능이 필요한 지 정하기
System.out.println("2. 전체 곡 조회"); //반복문 or toString
System.out.println("3. 특정 곡 검색"); //반복문 + get() => 찾은 것을 반환
System.out.println("4. 특정 곡 삭제"); //반복문 + remove()
System.out.println("5. 특정 곡 수정"); //반복문 + set()
System.out.println("0. 프로그램 종료"); //1. 저장소고르기 => ArrayList
System.out.println("메뉴를 입력해주세요>");
int menu = sc.nextInt();
sc.nextLine();
switch(menu) {
case 1 : insertMusic();
break;
case 2 : selectMusic();
break;
case 3 : searchMusic();
break;
case 4 : deleteMusic();
break;
case 5 : updateMusic();
break;
case 0 : System.out.println("프로그램이 종료되었습니다.");
return;
default : System.out.println("잘못누르셨습니다.");
}
}
}
1. 새로운 곡을 추가시킬 수 있는 화면
public void insertMusic() {
System.out.println("=====새로운 곡 추가=====");
System.out.println("새로운 곡의 제목을 입력해주세요. > ");
String title = sc.nextLine();
System.out.println("새로운 곡의 가수명을 입력해주세요.>");
String artist = sc.nextLine();
//요청 => 플레이리스트에 title이라는 제목을 가지고 artist라는 가수명을 가진 음악을 추가 => controller의 역할
mc.insertMusic(title, artist);
}
2. 전체곡 조회 기능
public void selectMusic() {
System.out.println("=====전체 곡 조회=====");
//요청
ArrayList al = mc.selectMusic();
if(al.size() == 0) { //list.isEmty (비어있으면 true)
System.out.println("플레이리스트에 담긴 곡이 없습니다.");
} else {
for(int i = 0; i<al.size(); i++) { //향상된 for문 (Music m : list) {m출력}
System.out.println(al.get(i));
}
}
}
3. 특정 곡 검색
public void searchMusic() {
System.out.println("=====특정 곡 검색=====");
System.out.println("검색어를 입력해주세요.>");
String keyword = sc.nextLine();
ArrayList<Music> list = mc.searchMusic(keyword);
System.out.println("검색결과");
if(list.isEmpty()) {
System.out.println("조회된 결과가 존재하지 않습니다.");
}else {
for(Music m : list) {
System.out.println("조회결과는 " + list.size() + "건입니다.");
System.out.println("곡명: " + m.getTitle()+ "/n가수명: " + m.getArtist());}
}
}
4. 특정 곡 삭제할 수 있는 화면
public void deleteMusic() {
System.out.println("=====곡 삭제=====");
System.out.println("삭제하고 싶은 곡명을 입력해주세요.(단, 곡명을 정확히 입력해야합니다.)>");
String title = sc.nextLine();
int result = mc.deleteMusic(title);
if(result > 0) {
System.out.println(title + "이(가) 삭제되었습니다.");
} else {
System.out.println("입력한 곡명과 일치하는 곡이 없습니다.");
}
}
//기존 곡 명을 입력받아서 수정할 곡명, 수정할 가수명으로 수정하기
5. 특정 곡을 수정할 수 있는 화면
public void updateMusic() {
System.out.println("=====곡 수정=====");
System.out.println("수정하고싶은 기존 곡명을 입력해주세요."); //검색목적
String title = sc.nextLine();
System.out.println("수정하고싶은 새로운 곡명을 입력해주세요."); //수정목적
String newTitle = sc.nextLine();
System.out.println("수정하고싶은 새로운 가수명을 입력해주세요.");
String newArtist = sc.nextLine();
//요청
int result = mc.updateMusic(title, newTitle, newArtist);
if(result > 0) {
System.out.println("수정에 성공하였습니다.");
} else {
System.out.println("수정할 곡을 찾지못하였습니다.");
}
}
}
- MusicController
package com.kh.list.mvc.controller;
import java.util.ArrayList;
import com.kh.list.mvc.model.vo.Music;
//Controller : 사용자의 요청을 받아서 처리해주는 클래스 처리 결과를 view에게 반환해줘야 함.
public class MusicController {
//음악 리스트 생성
private ArrayList<Music> list = new ArrayList();
{//초기화 블록: 객체 생성 시 무조건 수행되는 블록
list.add(new Music("강남스타일", "싸이"));
list.add(new Music("마카레나", "로스델리오"));
}
- 사용자가 새로운 곡을 추가 요청 할 때 실행되는 메소드
public void insertMusic(String title, String artist) {
//저장소에 사용자가 입력한 title과 artist를 가진 Music객체를 추가
list.add(new Music(title, artist));
System.out.println();
System.out.println("곡 추가에 성공하였습니다.");
}
- 전체 곡 조회 요청 시 실행되는 메소드
public ArrayList<Music> selectMusic() {
return list;
}
- 특정 곡 검색 요청이 있을 때마다 실행되는 메소드
public ArrayList searchMusic(String keyword) {
// 검색된 결과가 담길 ArrayList<Music>
ArrayList<Music> searched = new ArrayList();
//조회 => 맞는 키워드만 searched에 추가
1. list의 길이만큼 반복하면서
2. 요소 하나하나씩 비교(키워드가 요소의 곡명에 포함이 되어있는지)
3. 포함이 되어있으면 요소를 searched에 추가
for(int i = 0; i < list.size(); i++) {
if((list.get(i)).getTitle().contains(keyword)) { //문자열.contains(포함되어있는지 궁금한 문자열)
//해당 문자열이 포함되어있으면 true, 없으면 false반환
searched.add(list.get(i));
}
}
return searched;
}
- 특정 곡 삭제 요청 시 실행할 메소드
public int deleteMusic(String title) {
int result = 0; //결과를 담을 변수를 먼저 생성, 삭제가 진행될 횟수
//처리
// 전체 곡 목록 중에서(반복문)
// 곡 제목이 사용자가 입력한 그 무언가가 동일하다면 (조건문)
// 그 곡을 제거한다(remove())
for(int i = 0; i < list.size(); i++) {
if((list.get(i).getTitle()).equals(title)){
list.remove(i);
result++;
}
} return result; //result가 0이라면 삭제가 이루어지지 않았다.
}
- 특정 곡 수정 요청 시 실행할 메소드
public int updateMusic(String title, String newTitle, String newArtist) {
//결과를 담을 변수 먼저 생성
int result = 0;
//처리
for(int i = 0; i < list.size(); i++) {
if(list.get(i).getTitle().equals(title)) {
//방법1.
//list.get(i).setTitle(newTitle);
//list.get(i).setartist(newArtist);
//방법2.
list.set(i, new Music(newTitle, newArtist));
result++;
}
} return result; // 0이면 수정이 이루어지지 않았음
}
}
- Run
package com.kh.list.mvc.run;
import com.kh.list.mvc.view.MusicView;
public class MusicRun {
public static void main(String[] args) {
//MVC패턴을 적용한 음악 관리 프로그램
// M: model, 데이터를 담당하는 역할 (model.vo: 값을 담는다, model.dao: 값을 처리한다)
// V: view, 사용자가 보는 화면을 처리 (입력, 출력)
// => view가 아닌 다른 곳에서 입/출력문 사용 자제
// C: controller, 사용자가 화면을 통해서 요청한 것을 받아서 처리하고, 결과를 돌려주는 역할
//MusicView mv = new MusicView();
//mv.mainMenu();
new MusicView().mainMenu();
//메소드 체이닝
}
}
'클라우드 융합 Full-stack 웹 개발자 양성과정 > Java' 카테고리의 다른 글
프로그래밍 언어응용-Collection(set), Map(hashMap, properties) (0) | 2022.09.25 |
---|---|
프로그래밍 언어응용 - API(String, Math, Wrapper), IO (1) | 2022.09.25 |
프로그래밍 언어응용-추상화, 인터페이스, 예외처리 (1) | 2022.09.25 |
프로그래밍 언어응용-다형성 (1) | 2022.09.25 |
프로그래밍 언어응용-상속 (1) | 2022.09.25 |