파일 입력(input) 파일에서 데이터를 읽어오는 것
출력(output) 데이터를 파일에 저장하는것
컴퓨터 프로그램에서 데이터를 영구적으로 보관할 때 사용
1. 데이터 영구 저장 가능
2. 대용량 데이터 처리에 용이
3. 재사용성 (작성한 데이터를 다른 프로그램이나 나중에 다시 사용 가능)
4. 백업이나 공유 가능
속도가 느리고 복잡한 코드 (메모리 접근보다 읽거나 쓰기가 상대적으로 느림 또 읽기/쓰기, 예외 처리, 경로 관리 등등 코드가 기러질 수 있음)
여러 프로그램에서 동시에 파일을 수정하면 충돌로 인해 데이터 손사이나 동시 접근이 어려울 수 있음
유출 위험 등의 보안 문제가 있음
스레드란 프로세스 내에서 독립적으로 실행되는 샐행 단위
한 프로그램 안에서 동시에 여러 일을 처리하는 것
멀티태스킹이 가능하고 자원 효율성이 좋음 (프로세스보다 메모리나 CPU 사용이 적음)
사용자 인터페이스가 작업 중에도 멈추지 않아 응답성이 향상됨
여러 스레드가 같은 데이터를 접근하면 충돌위험으로 인해 동기화 문제 발생
실행 순서가 예측이 어려워 버그 찾기가 힘듬 따라서 디버깅에도 어려움 발생
스레드를 너무 많이 생성하면 오히려 성능이 저하되기에 리소스 관리 필요
예외 처리는 프로그램 실행 중 오류가 발생했을 떄 프로그램을 강제로 종료하지 않고 처리하는 방법
대표적으로 try-catch 구문 사용
오류 발생 시 프로그램 종료를 막고 정상 동작 유지를 하기에 프로그램 안정성 향상
오류 정보를 자바 로그로 기록이 가능하기에 디버깅에 용이
사용자 친화적
try-catch 구문 때문에 코드가 길어지고 복잡해짐
모든 오류를 무작정 잡으면 버그를 숨길 수 있기 때문에 남용 위험
잦은 예외로 처리 속도 저하 가능
package class01;
import java.util.ArrayList;
public class Test02 {
public static void main(String[] args) {
int[] datas = new int[3];
// 정적 ▶ 크기가 고정
// 기능이 부족함
ArrayList al = new ArrayList();
// 동적 ▶ 크기가 고정 xxx
// 기능 多
al.add(10);
al.add(20);
al.add(30);
al.add(0, 3.14);
al.add(0, "apple");
System.out.println(al);
System.out.println(al.get(0));
System.out.println(al);
al.remove(0);
System.out.println(al);
System.out.println("length : "+al.size());
System.out.println(al.isEmpty());
al.clear();
System.out.println(al.isEmpty());
System.out.println(al);
}
}
package class02;
import java.util.ArrayList;
import java.util.Scanner;
class Student{
private int num; // PK
private String name;
private int score;
Student(int num,String name,int score){
this.num=num;
this.name=name;
this.score=score;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Student)) {
return false;
}
Student student = (Student)obj;
if(this.num == student.num) {
return true;
}
return false;
}
public String getName() {
return name;
}
public int getNum() {
return num;
}
public int getScore() {
return score;
}
public void setName(String name) {
this.name = name;
}
public void setNum(int num) {
this.num = num;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [num=" + num + ", name=" + name + ", score=" + score + "]";
}
}
public class Test02 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
ArrayList<Student> datas = new ArrayList<>();
datas.add(new Student(1001,"티모",90));
datas.add(new Student(1002,"모르가나",65));
int NUM = 1003; // PK
while(true) {
System.out.println("1.학생추가");
System.out.println("2.전체출력");
System.out.println("3.1명출력");
System.out.println("4.정보변경");
System.out.println("5.학생삭제");
System.out.println("0.프로그램 종료");
System.out.print(">> ");
int command = sc.nextInt();
if(command==1) {
System.out.print("이름입력 >> ");
String name=sc.next();
System.out.print("성적입력 >> ");
int score=sc.nextInt();
datas.add(new Student(NUM++,name,score));
}
else if(command==2) {
for(int i=0;i<datas.size();i++) {
System.out.println(datas.get(i));
}
for(Student data:datas) {
System.out.println(data);
}
}
else if(command==3) {
System.out.print("번호입력 >> ");
int num=sc.nextInt();
boolean flag = false;
for(int i=0;i<datas.size();i++) {
if(datas.get(i).getNum() == num) {
System.out.println(datas.get(i));
// datas == 학생부, 배열리스트
// datas.get(i) == 학생, 객체, datas[i]
// datas.get(i).getNum() == 학생의 번호, int, datas[i].num
flag = true;
break;
}
}
if(!flag) {
System.out.println("검색실패...");
}
}
else if(command==4) {
System.out.print("번호입력 >> ");
int num=sc.nextInt();
int INDEX=0; // scope(유효범위) 이슈
boolean flag = false;
for(int i=0;i<datas.size();i++) {
if(datas.get(i).getNum() == num) {
System.out.println(datas.get(i));
// datas == 학생부, 배열리스트
// datas.get(i) == 학생, 객체, datas[i]
// datas.get(i).getNum() == 학생의 번호, int, datas[i].num
flag = true;
INDEX = i;
break;
}
}
if(!flag) {
System.out.println("해당 번호의 학생은 없습니다...");
continue;
}
System.out.print("변경할 점수 입력 >> ");
int score=sc.nextInt();
datas.get(INDEX).setScore(score);
System.out.println("정보변경완료!");
}
else if(command==5) {
System.out.print("번호 입력 >> ");
int num=sc.nextInt();
int INDEX=0;
boolean flag = false;
for(int i=0;i<datas.size();i++) {
if(datas.get(i).getNum() == num) {
flag = true;
INDEX = i;
break;
}
}
if(!flag) {
System.out.println("해당 번호의 학생은 없습니다...");
continue;
}
datas.remove(INDEX);
System.out.println("학생삭제완료!");
}
else {
break;
}
}
}
}
package class03;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class Test03 {
public static void main(String[] args) {
String inputFileName = "D:\\KIM\\resource\\a.txt";
String outputFileName = "D:\\KIM\\resource\\b.txt";
ArrayList<String> al = new ArrayList<>();
ArrayList<Integer> datas = new ArrayList<>();
// 1. 파일을 불러온다.
try {
BufferedReader br = new BufferedReader(new FileReader(inputFileName));
while(true) {
String line = br.readLine();
if(line == null) {
break;
}
al.add(line);
}
}
catch(Exception e) {
e.printStackTrace();
}
System.out.println("파일 읽어오기 완료");
System.out.println(al);
System.out.println();
// 2-1. 읽은 파일 => String
// 2-2. String => int 형변환
// 2-3. 형변환된 데이터들을 계산
for(String v:al) {
int i=Integer.parseInt(v);
datas.add(i);
}
System.out.println("데이터 변환 완료");
System.out.println(datas);
System.out.println();
int total = 0;
for(int data:datas) {
total += data;
}
double avg = total*1.0/datas.size();
System.out.println("계산 완료");
System.out.println();
// 3. 결과를 작성한다.
BufferedWriter bw = null;
try {
bw = new BufferedWriter(new FileWriter(outputFileName));
bw.write("총합 "+total+"\n");
bw.write("평균 "+avg);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("파일 생성 완료");
System.out.println();
}
}
'수업 복습' 카테고리의 다른 글
| HTML 복습 및 코드리뷰 피드백 (0) | 2025.11.11 |
|---|---|
| Java MVC 복습 & 코드 필사 (0) | 2025.10.28 |
| Java interface 복습 (0) | 2025.10.26 |
| Java Thread & MVC (0) | 2025.10.24 |
| 복습 Java 이론 (0) | 2025.10.20 |