IO Stream (데이터가 흘러가는 길을 만드는 것)
Stream - 파이프라인
Application ← 키보드통해 데이터 들어오고
→ 화면을통해 데이터 나감 (즉, 콘솔통해서)
파일입출력(보관용/통계 구할 때 - AI인공지능) 빈도수구할 때
DBMS(데이터 관리 운영) - Oracle, MySQL
입출력처리 Input / Output
1. byte 단위 → 8bit → 영문자 → 한글 1자(2byte)
InputStream
OutputStream
2. 문자 단위 → char-2byte
Reader
Wtriter
출력시 파일 없으면 자동으로 파일 생성
입력시 파일 없으면 Error (FileNotFoundException)
객체 직렬화
: 객체는 파일이나 네트워크로 전송이 안된다.
: 객체를 byte[] 변환시켜서 전송해야한다.
: Serializable
Application(자바파일) → 파일로 데이터를 보낼때 byte[] 단위로 쪼갠다. → 쪼갠걸 객체로 묶어버린다.
Serializable만 걸어주면 알아서 쪼개주고 알아서 묶어준다.
ObjectMain.java
PersonDTO.java
데이터 수가 10개면 10번 write 10번 read → 번거롭다.
객체로 묶는다. 묶어진 클래스를 PersonDTO로 한다.
Serializable 인터페이스인데 추상메소드가 하나도 없다.
버퍼로 나가는데 객체로 묶어서 나가고 파일로 나간다.
package io;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class ObjectMain {
public static void main(String[] args) throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("result2.txt"));
//생성자로 데이터를 묶는다.
PersonDTO dto = new PersonDTO("홍길동", 25, 185.3);
oos.writeObject(dto);
oos.close();
}
}
NotSerializableException
public class PersonDTO implements Serializable
package io;
import java.io.Serializable;
public class PersonDTO implements Serializable{
private String name;
private int age;
private double height;
public PersonDTO() {}
public PersonDTO(String name, int age, double height) {
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;
}
}
11_io에 커서두고 F5 눌러주면 result2.txt
읽어올 때는
ObjectInputStrean FileInputStream
readeObject로 가져오면 Object로 받아온다
Object ob = ois.readObject(); 하면 되지만 밑에처럼 해줘야한다.
PersonDTO dtos = (PersonDTO)ois.readObject();
부모는 자식에 있는거 함부로 못가져오므로 캐스팅
package io;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
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();
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();
}
}
System.out.println("이름 = " + dto2.getName());
System.out.println("나이 = " + dto2.getAge());
System.out.println("키 = " + dto2.getHeight());
이렇게 하기 싫으면 DTO에 toString()해서 만들어서 해주면 됨.
이름 = 홍길동
나이 = 25
키 = 185.3
oracle database express download
https://www.oracle.com/kr/database/technologies/xe-downloads.html
Oracle Database 21c Express Edition Download Description Oracle Database 21c Express Edition for Windows x64 (1,967,615,483 bytes - October 08, 2021) [Sha256sum: 939742c3305c466566a55f607638621b6aa7033a183175f6bcd6cffb48e6bc3f] Oracle Database 21c Express Edition for Linux x64 ( OL8 ) (2,339,651,768...
www.oracle.com
Oracle Database 21c Express Edition for Windows x64
D:
Oracle
lib
파일 다운로드
편집기 필요
메모장, Eclipse, IntelliJS
JDK
설치 위치 C:\Program Files\Java\jdk-17
OracleXE213_Win64.zip CMD, sqldeveloper
설치 위치 C:\app\bitcamp\product\21c~
oracle express 21c 삭제
sql developer download
https://www.oracle.com/database/sqldeveloper/technologies/download/
SQL Developer 23.1.1 Version 23.1.1.345.2114 - December 15, 2023 Release Notes Documentation Forum Support Oracle Free Use License Platform Download Notes SQL Developer Extension for VSCode Download Requires VS Code version 1.82.0 or higher Available for Win64, OSX (intel/arm), Linux (intel/arm) Win...
www.oracle.com
* 프로세스(process)
: 현재 실행중인 프로그램
ctrl + alt + delete 작업관리자 → 프로세스 돌고있는거 확인가능
한 꺼번에 여러개가 떠있는걸 멀티프로세스 / 멀티태스킹
* 멀티프로세스 (멀티태스킹)
: 하나의 cpu에 여러 개의 응용프로그램을 동시에 실행
: 시분할 시스템
핸드폰 하나인데 동시에 쓸 수 있는 방법은 없다.
Cpu
메모장 이클립스
0.2초 0.2초 왔다갔다하는것 우리 눈에는 동시에 실행하는 것처럼 보이는 것이다.
동시실행은 못한다.
시간차로 잘라놓는 것을 시분할 시스템이라고 한다.
메모장 내용을 우리가 처리하는데 멈추고 다른거 하면 하던거 기억하고 넘어가야한다.
적당량 시간을 해줘야한다. 너무빨리 움직여도 안되고 너무 느리게 움직여도 안된다.'
여러개 프로세스를 동시에 실행하는 것을 멀티프로세스, 멀티태스킹 !!
* Thread
main쪽에서 프로그램을 짠다.
공격 프로그램
프로그램을 잘라야한다. 단위단위로 잘라놓은 것 - 스레드
방어 프로그램
공격과 방어가 같이 돌아야한다. 왔다갔다 움직여야한다.
웹사이트 로그인할 때 한 사람이 끝나야 다른 사람하고 이러면 안됨. 동시에 할 수 있게 - 스레드 지원함
* Thread
단위 프로그램
main 메소드도 하나의 스레드이다.
PC방 주차장 식당어플 → 각자 따로 각각의 프로그램으로 돌려야되는것 - 멀티스레드
하나의 프로그램에서 여러 개의 스레드(단위프로그램)을 동시에 수행하는 것을 의미한다.
멀티스레드
- 생성방법
Thread 클래스로 상속
Runnable 인터페이스를 이용
2. 처리
스레드 생성
스레드 시작 start()
스레드 실행(운영체제가 알아서 처리) run()
대기자가 들어간다. 시작 start()하면 대기실로 들어가서 사장님이 부를 때까지 기다렸다 들어갈 수도 있고 바로 들어갈 수도 있음.
즉 실행하는 것은 운영체제가 불러드리는 것
평생 사는게 아니고 나갔다 들어갔다 하는 것
사장님 볼일보러 가면 다시 대기상태로 갔다가 돌아가고 하는 것
start() 내가 시작을 거는 것
실행은 운영체제 마음이다.
sleep() 내가 할 수 있다.
wait / notify - 서로가 서로를 견제하고 들어간다는 것
스레드 생성 (나는 이 프로그램을 스레드로 하겠다.)
- 스레드 클래스 상속받으세요 → 자바는 다중상속이 안되므로 피하는게 좋음
- Runable 이용
달리기 선수 5명 착출 - 스레드 생성 - 5명의 달리기 선수 모아놓음
t1 t2 두 개를 스레드로 생성
start()라인에 세움 - 뛸 준비 시작
t1 t2 스레드 뛸 준비
Runnable 안에
Running 상태 운영체제에의해서 t1 t2 0.2초 0.2초 왔다갔다 왔다갔다
run() 메소드 수행하면서 계속 움직인다.
Java Project : 12_thread
Package : thread
Class : SnackMain.java
package thread;
public class SnackMain {
private String str;
public SnackMain(String str) {
this.str = str;
}
public void run() {
for(int i=1; i<=5; i++) {
System.out.println(str+ "\t" + "i=" + i + "\t" + Thread.currentThread());
}
}
public static void main(String[] args) {
SnackMain aa = new SnackMain("새우깡");
SnackMain bb = new SnackMain("포카칩");
SnackMain cc = new SnackMain("수미칩");
aa.run();
bb.run();
cc.run();
}
}
새우깡 i=1 Thread[main,5,main]
새우깡 i=2 Thread[main,5,main]
새우깡 i=3 Thread[main,5,main]
새우깡 i=4 Thread[main,5,main]
새우깡 i=5 Thread[main,5,main]
포카칩 i=1 Thread[main,5,main]
포카칩 i=2 Thread[main,5,main]
포카칩 i=3 Thread[main,5,main]
포카칩 i=4 Thread[main,5,main]
포카칩 i=5 Thread[main,5,main]
수미칩 i=1 Thread[main,5,main]
수미칩 i=2 Thread[main,5,main]
수미칩 i=3 Thread[main,5,main]
수미칩 i=4 Thread[main,5,main]
수미칩 i=5 Thread[main,5,main]
하나가 끝나야 다음께 시작하고 순차적으로
새우깡 5개가 끝나야 포카칩 5개 수미칩 5개
main 안에서 스레드 돌리고 있다.
과자들을 스레드로 처리하고싶다.
상속받는게 가장 쉽다.
public class SnackMain extends Thread {
package thread;
public class SnackMain extends Thread {
private String str;
public SnackMain(String str) {
this.str = str;
}
public void run() {
for(int i=1; i<=5; i++) {
System.out.println(str+ "\t" + "i=" + i + "\t" + Thread.currentThread());
}
}
public static void main(String[] args) {
SnackMain aa = new SnackMain("새우깡");//스레드 생성
SnackMain bb = new SnackMain("포카칩");//스레드 생성
SnackMain cc = new SnackMain("수미칩");//스레드 생성
aa.start(); //스레드 시작 → 운영체제가 알아서 스레드를 실행해준다.(운영체제가 알아서 run() 호출, 콜백메소드)
bb.start();
cc.start();
}
SnackMain aa = new SnackMain("새우깡");//스레드 생성
SnackMain bb = new SnackMain("포카칩");//스레드 생성
SnackMain cc = new SnackMain("수미칩");//스레드 생성
start()라인에 세우려면 시작합니다. 해줘야한다.
스레드 시작할 준비를 한다. → 운영체제가 알아서 스레드를 실행해준다.
운영체제가 run() 메소드를 알아서 호출해준다. → 콜백메소드(뒤에서 운영체제가 알아서 호출해준다.)
우리가 run() 직접적으로 호출하면 안됨.
생성자는 강제호출이 안된다. new하면 알아서 불려지는 것처럼
aa.start(); //스레드 시작 → 운영체제가 알아서 스레드를 실행해준다.(운영체제가 알아서 run() 호출, 콜백메소드)
bb.start();
cc.start();
새우깡 i=1 Thread[Thread-0,5,main]
포카칩 i=1 Thread[Thread-1,5,main]
수미칩 i=1 Thread[Thread-2,5,main]
포카칩 i=2 Thread[Thread-1,5,main]
새우깡 i=2 Thread[Thread-0,5,main]
포카칩 i=3 Thread[Thread-1,5,main]
새우깡 i=3 Thread[Thread-0,5,main]
포카칩 i=4 Thread[Thread-1,5,main]
수미칩 i=2 Thread[Thread-2,5,main]
포카칩 i=5 Thread[Thread-1,5,main]
새우깡 i=4 Thread[Thread-0,5,main]
수미칩 i=3 Thread[Thread-2,5,main]
새우깡 i=5 Thread[Thread-0,5,main]
수미칩 i=4 Thread[Thread-2,5,main]
수미칩 i=5 Thread[Thread-2,5,main]
값들을 계속해서 기억하고 있다.
Thread - 0 스레드 이름
aa.setName("새우깡"); //스레드 이름 주는 것
bb.setName("포카칩");
cc.setName("수미칩");
public static void main(String[] args) {
SnackMain aa = new SnackMain("새우깡");//스레드 생성
SnackMain bb = new SnackMain("포카칩");//스레드 생성
SnackMain cc = new SnackMain("수미칩");//스레드 생성
aa.setName("새우깡"); //스레드 이름 주는 것
bb.setName("포카칩");
cc.setName("수미칩");
새우깡 i=1 Thread[새우깡,5,main]
포카칩 i=1 Thread[포카칩,5,main]
새우깡 i=2 Thread[새우깡,5,main]
수미칩 i=1 Thread[수미칩,5,main]
포카칩 i=2 Thread[포카칩,5,main]
새우깡 i=3 Thread[새우깡,5,main]
포카칩 i=3 Thread[포카칩,5,main]
새우깡 i=4 Thread[새우깡,5,main]
수미칩 i=2 Thread[수미칩,5,main]
포카칩 i=4 Thread[포카칩,5,main]
수미칩 i=3 Thread[수미칩,5,main]
새우깡 i=5 Thread[새우깡,5,main]
수미칩 i=4 Thread[수미칩,5,main]
포카칩 i=5 Thread[포카칩,5,main]
수미칩 i=5 Thread[수미칩,5,main]
하나의 동작이 끝날 때까지 기다리는게 아니라 움직이면서 왔다갔다 하는 것
aa.start(); //스레드 시작 → 운영체제가 알아서 스레드를 실행해준다.(운영체제가 알아서 run() 호출, 콜백메소드)
try {
aa.join();
} catch (InterruptedException e) {
e.printStackTrace();
} //스레드 깨버림 끝날 때까지 나머지는 대기상태에 있어야함.
bb.start();
cc.start();
aa.join(); //스레드 깨버림 끝날 때까지 나머지는 대기상태에 있어야함.
try {
aa.join();
} catch (InterruptedException e) {
e.printStackTrace();
} //스레드 깨버림 끝날 때까지 나머지는 대기상태에 있어야함.
새우깡 다먹을 때까지 나머지는 못 돌아감 → join이라고함 스레드 깨버리는 것
새우깡 i=1 Thread[새우깡,5,main]
새우깡 i=2 Thread[새우깡,5,main]
새우깡 i=3 Thread[새우깡,5,main]
새우깡 i=4 Thread[새우깡,5,main]
새우깡 i=5 Thread[새우깡,5,main]
포카칩 i=1 Thread[포카칩,5,main]
수미칩 i=1 Thread[수미칩,5,main]
포카칩 i=2 Thread[포카칩,5,main]
수미칩 i=2 Thread[수미칩,5,main]
포카칩 i=3 Thread[포카칩,5,main]
수미칩 i=3 Thread[수미칩,5,main]
포카칩 i=4 Thread[포카칩,5,main]
포카칩 i=5 Thread[포카칩,5,main]
수미칩 i=4 Thread[수미칩,5,main]
수미칩 i=5 Thread[수미칩,5,main]
JoinMain.java
package thread;
class JoinTest implements Runnable {
@Override
public void run() { //Call-Back /운영체제가 알아서 호출하기 때문에 run 부르면 안됨. start만 걸어주면 됨.
for(int i=1; i<=5; i++) {
System.out.println(i);
}//for
}
}
//----------------
public class JoinMain {
public static void main(String[] args) {//상속은 진짜 받은거고 인터페이스는 틀만 제공한 것
JoinTest joinTest = new JoinTest(); //스레드X
Thread t = new Thread(joinTest); //스레드 생성
System.out.println("스레드 시작");
t.start(); //스레드 시작 → 운영체제가 알아서 스레드를 실행해준다.(운영체제가 알아서 run() 호출, 콜백메소드)
}
}
스레드 시작
1
2
3
4
5
1~5 찍는건 금방 찍음
System.out.println("스레드 시작");
t.start(); //스레드 시작 → 운영체제가 알아서 스레드를 실행해준다.(운영체제가 알아서 run() 호출, 콜백메소드)
System.out.println("스레드 종료");
스레드 시작
스레드 종료
1
2
3
4
5
CPU는 메인 먼저 실행한다. 스레드시작 스레드 종료 먼저 처리하고 스레드로 넘어간다.
메인 스레드 처리하고 끝나야 위에가 처리된다.
Thread.sleep(1000); //단위는 1/1000초 / 1초 쉬려면 1000을 주면 됨.
@Override
public void run() { //Call-Back /운영체제가 알아서 호출하기 때문에 run 부르면 안됨. start만 걸어주면 됨.
for(int i=1; i<=5; i++) {
System.out.println(i);
try {//단위는 1/1000초 / 1초 쉬려면 1000을 주면 됨.
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}//for
}
class Super{
public void sub(){}
}
class Sub extends Super{
publuc void sub() throws IOException{}
}
error - 부모도 걸어줘야되므로
@Override
public void run() throws InterruptedException{
자식한테 걸면 부모한테도 걸어줘야하므로 Override된 애들한테는 throws 안된다.
try-catch로 걸어줘야한다.
//메인이 끝나도 스레드는 종료되지 않는다.
//메인이 끝나도 백그라운드에서 스레드는 돌아간다.
try {//스레드 파괴
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
스레드 강제로 종료시켜줌
스레드 시작
1
2
3
4
5
스레드 종료
Clock.java
package thread;
import java.awt.Frame;
public class Clock extends Frame{
public Clock() {
//setSize(300, 400);
setBounds(900, 300, 300, 400);
setVisible(true);
}
public static void main(String[] args) {
new Clock();
}
}
public Clock() {
//setSize(300, 400);
setBounds(900, 300, 300, 400);
setVisible(true);
while(true) {
}
}
시계는 무한루프로 돌면 안 된다. 스레드 이용해야한다.
스레드 없이 while문 돌리면 끝도 없이 돌아간다.
public class Clock extends Frame implements Runnable{
오버라이드 해줘야 함.
@Override
public void run() {
while(true) {
}//while
}
Clock 갔다가 run 갔다가 하길 바라는
콘솔창이 아닌 우리가 만든 Frame에 그리게 하려
//Call Back 메소드
//Frame에 그려준다.
@Override
public void paint(Graphics g) {
g.drawString("시계", 100, 100);
}
시간 나오게 하는
SimpleDateFormat
Calendar
package thread;
import java.awt.Frame;
import java.awt.Graphics;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Clock extends Frame implements Runnable{ //run 메소드라고 부르기만 했지 수행은 안 한 상태이므로 repaint()가 실행 안된다.
public Clock() {
//setSize(300, 400);
setBounds(900, 300, 300, 400);
setVisible(true);
}
@Override
public void run() {
while(true) {
repaint(); //다시 그려주세요.
}//while
}
//Call Back 메소드
//Frame에 그려준다.
@Override
public void paint(Graphics g) { //paint는 콜백이므로 강제 호출할 수 없다.
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
//현재 시스템에 있는 날짜
Date date = new Date();
g.drawString(sdf.format(date), 100, 100);
}
public static void main(String[] args) {
new Clock(); //Frame이 생성되고, paint()호출
}
}
run 메소드라고 부르기만 했지 수행은 안 한 상태이므로 repaint()가 실행 안된다.
Clock extends Frame - Clock은 프레임이다.
new Clock(); //Frame이 생성되고, paint()호출 - 한 번만 수행되고 다시 수행 안된다.
그래서 시간이 한 번 호출되고 끝이다.
스레드 생성해야 run()이 작동된다.
Thread t = new Thread(new Clock());
이렇게 하면 프레임이 2개 만들어진다.
new Clock(); 여기서 만든 객체값을 가지고 있는 애는 this
Thread t = new Thread(this);//스레드 생성
나를 스레드로 생성해주세요.
아래 코드와는 다른 것 확인
JoinTest joinTest = new JoinTest(); //스레드X
Thread t = new Thread(joinTest); //스레드 생성
@Override
public void run() {
while(true) {
repaint(); //다시 그려주세요.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}//while
}
Thread.sleep(1000); 클래스명이 바로왔다는것은 static으로 선언됐다.
글자 크기 바꾸기
setFont(new Font("Consolas", Font.BOLD, 25));
색들은 그림판에서 보고 고르면 된다~!
배경화면 색 정하기
setBackground(new Color(255, 217, 255));
글자색 바꾸기
setForeground(new Color(113, 192, 252));
모든 인터페이스는 implements가 기본이지만 추상메소드가 너무 많을 때는 이 모든 추상 클래스를 오버라이드 해주는 클래스가 있다.
종료하기
this.addWindowListener(new WindowAdapter() {
});
addWindowListener는 추상메소드 7개 - 대신해주는 메소드 찾음
new WindowAdapter()가 역할을 하고있다. - 추상클래스
추상클래스는 생성이 안된다.
하나만 오버라이딩해서 강제종료하는 메소드를 작성한다.
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//강제 종료(프로세스 종료)
System.exit(0);
}
});
package thread;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Clock extends Frame implements Runnable{ //run 메소드라고 부르기만 했지 수행은 안 한 상태이므로 repaint()가 실행 안된다.
public Clock() {
setFont(new Font("Consolas", Font.BOLD, 25));//글꼴, 크기
setForeground(new Color(113, 192, 252)); //글자색
setBackground(new Color(255, 217, 255)); //배경색
//setSize(300, 400);
setBounds(900, 300, 300, 400);
setVisible(true);
Thread t = new Thread(this);//스레드 생성
t.start();//스레드 시작 -> 스레드 실행(운영체제가 run() 호출)
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//강제 종료(프로세스 종료)
System.exit(0);
}
});
}
@Override
public void run() {
while(true) {
repaint(); //다시 그려주세요.
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}//while
}
//Call Back 메소드
//Frame에 그려준다.
@Override
public void paint(Graphics g) { //paint는 콜백이므로 강제 호출할 수 없다.
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
//현재 시스템에 있는 날짜
Date date = new Date();
g.drawString(sdf.format(date), 90, 100);
//System.out.println(sdf.format(date));
}
public static void main(String[] args) {
new Clock();//Frame이 생성되고, paint()호출
}
}
'JAVA' 카테고리의 다른 글
DAY 12 - 접근제한자 / 중첩클래스 (2024.07.18) (0) | 2024.08.12 |
---|---|
DAY 13 - Collection / Generic / Interface / Exception / 입출력처리 (2024.07.19) (0) | 2024.08.12 |
DAY 15 - Thread / Synchronized (2024.07.23) (0) | 2024.08.09 |
DAY 16 - LOMBOK / 시퀀스 객체 / JDBC / DB 연결 (2024.07.24) (0) | 2024.08.09 |
DAY 17 - MEMBER (2024.07.25) (0) | 2024.08.08 |