본문 바로가기
코딩

2022.02.23_13일차

by 흥뷰자 2022. 2. 27.

13일차 학습내용

0. 입출력 : java.io
1. File 클래스 : java.io.File
2. Stream 스트림  
3. 바이트 스트림
4. 문자스트림 
5. OS
6. Thread 스레드
7. 스레드 만들기 
8. 네트워크

 



0. 입출력 : java.io


io == I/O == Input/Output
input (사용자가 내부로 upload -> 자바 안으로 가져온다 )
output (자바에서 외부로 내보내기 -> 사용자 입장에서 download )



1. File 클래스 : java.io.File
: 파일의 크기, 생성, 삭제, 변경 등등 파일에 관련된 내용을 관리하는 기능.
입출력기능 X

1) 생성
File(String pathname) : parhname 파일 전체 경로명을 작성하여 객체 생성
File(String parent, String child): parent 디렉토리에 child이름으로 
서브 디렉토리나 파일을 작성하여 객체 생성
2) 객체 생성
File 변수명 = new File("전체경로");
File 변수명 = new File("디렉토리경로", "파일명");

* 경로나 파일명 작성시 확장자명까지 포함해서 작성.

3) 주요메서드
boolean  mkdr()  : makintdirectory 새로운 디렉토리(폴더) 생성
String[] list() : 디렉토리내의 파일과 서브디렉토리 리스트(이름)를 배열로 리턴
File[] listFiles() : 디렉토리내의 파일과 서브디렉토리를 File배열로 리턴
String  getPath() : 경로 문자열로 리턴
String  getAbsolutePath() : 절대경로를 문자열로 리턴
String getParent() : 파일이나 디렉토리의 부모디렉토리 이름 리턴
String  getName() : 파일 또는 디렉토리의 이름 리턴
boolean isFile() : 파일이면 true
boolean  isDirectory() : 디렉토리면 true
long length() : 파일크기 리턴
boolean exists() : 파일 또는 디렉토리가 존재하면 true
boolean createNewFile() : 빈 파일 생성.
boolean  delete90 : 파일 또는 디렉토리 삭제
boolean renameTo(File dest) : dest 경로명으로 파일 이름을 변경 (이동이되는거지)
long lastModified : 마지막으로 변경 시간 리턴




<10:3 파일경로 복사

* 경로 <10:16
절대 경로 : c 또는 d드라이브부터 시작하는 전체 경로
상대 경로 : 내 현재 파일을 기준으로 말하는 경로
./  : 현재 폴더
.. : 상위
/ : 안에~

c:\java\abc\test.txt
c:\java\abc\test2.txt
c:\java\def\hello.txt
c:\java\hahaha.txt

<상대경로로 표현하기 10:30
<10:42 수정시간 보기 쉽게 바꾸기
<10:47 폴더 만들어서 파일생성 테스트 (try catch)
<10:50 디렉토리만들기 (중복검사)



2. Stream 스트림  <업로드에 필요한것들 전송.. 10:54 하기 전에


// 파일에 데이터 저장 전송 파일클래스로 빈걸만들순있지만 적는건불가. 파일내 데이터를 작성해서 텍스트파일로 저장하는건 다른 클래스를 사용해야. 
: 연속적인 데이터의 흐름. -> 글자 숫자 픽셀... 데이터가 돌아다니는 통로(선)
-> 데이터를 목적지로 i/o하기 위한 방법.

- 스트림은 단방향 //so input stream , output stream i/o 양쪽 따로 있어야 함. 무전기처럼 읽기쓰기가 동시에 안된다.. 보낼때 듣기만해야. 스트림을 잘 안쓰면 데이터손실위험도생기고...
- 자바 응용프로그램은 입력스트림과 출력스트림과만 연결하고, 
  입출력장치 제어하고 실질적인 입출력을 담당하는 것은 입출력 스트림이다.

  입력장치 or 파일 ----> 입력스트림 ----> 자바 응용프로그램
  입력장치 or 파일 <---- 출력스트림 <---- 자바 응용프로그램

- 자바에서 스트림을 통해 흘러가는 기본단위는 바이트나 문자이다.
  자바스트림 객체는 바이트단위로 입출력하는 바이트 스트림과 (~stream)
  문자 단위로 입출력하는 문자 스트림으로 나뉜다. (~reader writer)
  바이트 스트림을 다루는 클래스는 공통적으로 뒤에 Stream이 붙고
  문자 스트림을 다루는 클래스는 뒤에 Reader / Writer가 붙어 구분됨.

- FIFO 입출력관련 First In First Out 선입선출... 이 형태로 만들어준 자료구조 큐. 줄서기
- LIFO Last In First Out 먼저들어간게 마지막에 나옴. 후입선출. 이 자료구조가 stack

- close() : 스트림 열었으면 사용 후 반드시 닫아줘야 누수가 안된다. 꼭해줘야. 스캐너처럼 외부객체 가져오는거니까. 
// 1:1은 문제 안되지만 1:다 는 누수 발생... 



3. 바이트 스트림


- 바이트 단위로 데이터(바이너리데이터)를 전송 .하는 통로.
쪼개서 보내니까 프로그래스바... 쪼객 바이트 앞에 편지봉투처럼 어디서 어디로보내는지 감싸서 보내야
- 다양한 클래스 제공으로 용도에 맞게 골라사용
- 이미지, 동영상 전송 가능

InputStream  OutputStream 를 구현해놓은 클래스들 아래.. 오버로딩으로 많이 
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
int read() void write(int b)
int read(byte[] b) void write(byte[] b)

1) FileOutputStream
: 파일에 출력하기 위한 클래스
파일에 바이너리 데이터 저장. (바이트로 전송..사람이 수정불가 그대로 .글자보내는게 아니라 사진같은거도보내)

<11:19 생성자 구경해영 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/FileOutputStream.html
기본생성자가 없네
#1. 생성자
FileOutputStream(File file) : 파일 객체에 출력/저장할지  (기본은 엎어쓰기)
FileOutputStream(File file, boolean append) : 파일 객체에 마지막부터 데이터 출력/저장시킬건지 (이어쓰기하려면 이값true줘야)

#2. 주요 메서드  <11:30
void write(int b)
void write(byte[] b)
void flush() : 출력스트림에 남아있는 바이너리 데이터 모두 출력
void close() : 출력스트림 닫고 관련된 시스템 자원 해제

<11:34해보기 FileOutEx01
<11:41 FileOutEx02 문자열 적어서 해보기 ㅡㅡㅡㅡㅡㅡㅡㅡㅡ너무어려운데 다시듣기

2) FileInputStream  <11:54
: 바이트 스트림으로 파일 읽는 스트림 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/FileInputStream.html

#1. 생성자 (문서 참조)
#2. 주요메서드
int read()  : 한바이트 읽어서 int로 리턴
int read(byte[] b) : b의 크기만큼 바이트 읽음
읽는 도중 EOF  end of file 내용물의 끝을 만나면 실제 읽은 바이트수를 리턴
int read(byte[] b, int off, int len) off부터 len몇개 읽어서 b에 담아
void close() 

EOF : End of File 파일의 끝 : read() 할 때 EOF를 만나면 -1을 리턴. 하는 구조로 만들어져 있음.
실제 데이터에 -1이 있다면 read는 0xFF를 만나
byte 0xFF -> int 0x000000FF 데이터의 -1
EOF  -1 int --> 0xFFFFFFFF 그냥-1 (파일의 끝)


<12:01 읽어오기 FileInEx01

<FileInEx02 12:9 한글파일읽어오기 한글 2바이트 바이트스트림은 1바이트라 한글깨짐



4. 문자스트림  <12:17 문자스트림 FileInEx03


2바이트의 유니코드 문자를 단위로 입출력하는 스트림코드
- 문자화되지 않는 바이너리 바이트값들을 처리 불가 -> 이미지 같은 것 처리 불가
// 인풋은 리더 아웃풋은 롸이터... 클래스 메서드가 바이트배열아닌 캐릭터배열사용. 바이트스트림과 사용법동일

1) InputStreamReader
: 바이트 스트림을 문자 스트림으로 연결시켜주는 역할을 하는 보조 클래스 //바이트스트림도 써야함
바이트 스트림의 데이터를 지정된 인코딩의 문자 데이터로 변환하는 작업 수행 (이거로 감싸서 해야)
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/FileInputStream.html

# 인코딩  <12:34
MS949 (default) MS사에서 만든 한글 인코딩 체계


InputReadEx01 12:39 파일안깨지게

2) OutStreamReader  <12:45
: 파일에  텍스트데이터를 저장할 때 원하는 인코딩으로 지정하여 저장
인코딩 지정안하면 OS에서 사용하는 인코딩으로 데이터 저장
(eclipse에 지정한 인코딩)
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/OutputStreamWriter.html

<12:47 OutWriteEx01



다섯개 클래스 배움 이제 스레드 I/O끝



5. OS <12:55


: 하나의 소프트웨어로, 소프트웨어들을 관리하는 소프트웨어
Windows, macOS, linux, android, iOS

자바 -> JVM 



6. Thread 스레드



1) 프로세스 process //자원 +스레드
흔히 말하는 프로그램
프로그램을 수행하는 데 필요한 데이터와 메모리 등 자원 + 스레드
싱글 프로세스 : 하나의 프로그램을 돌리기 위해 1개의 프로세스가 실행되는 것
멀티 프로세스 : 하나의 프로그램을 돌리지 위해 여러개의 프로세스가 실행되는 것

2) 멀티 태스킹
태스크 task : 프로세스가 하는 일
멀티 태스킹 : 하나의 프로세스가 여러일을 하는 것.

3) 스레드 Thread
하나의 테스크를 수행하는 아이
프로세스 = 공장(자원+일꾼), 스레드 = 일꾼
싱글 스레드 = 자원 + 일꾼
멀티 스레드 = 자원 + 일꾼 + 일꾼 ...  // 처리 속도 - 코어의 문제 1:4

4) 멀티태스킹과 멀티스레딩 구분
멀티 태스킹을 실현하기 위한 2가지 방법
- 멀티 프로세싱 : //공장 여러개 돌리는 것 , 프로세스간 변수공유 다이렉트로 안됨. 자원공유한게 아니라 ...통신으로 보내기는 가능하지만 데이터 주고받는게 어려울... 과도한 작업량 발생할 수...

- 멀티 스레딩 : 하나의 응용프로그램을 동시처리가능하게 작업 분해해서 여러 스레드에... 공장 하나에 일꾼 여러개.... 자원과 메모리 공유가 쉽지. 멀티 프로세싱까지 지원함...자바가 지원..
웹 서버 : 하드

5) 자바의 멀티스레딩  



7. 스레드 만들기  


# 개발자가 할일
1. 스레드가 할일을 코드로 작성
2. 스레드 생성해서 JVM에게 일하도록 요청 (메인스레드 말고 추가로)

 # 구현방법
1. extends) Thread클래스를 상속 (더 많이씀) 
2. implements) Runnable 인터페이스 구현 (문법상 이게 더 바람직 . 이거 쓸 때 1을 가져다 씀) 이게 부모라 더 확장성넓어 

1) Thread클래스 상속받아 thread만들기   <1:17
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Thread.html

#1. 주요 메서드  <2:30
void  run() : JVM에 의해 호출 (핵심 메서드)
오버라이딩하여 스레드가 실행할 코드 작성
void  start() : JVM에게 스레드 실행하도록 작성 (우리는 run을 부르진 않고  start만하면됨)
void  interrupt() : 스레드 강제 종료
static void  yield() : 다른 스레드에게 실행 양보.
String getName() : 스레드 이름 이런
int   getPriority() : 스레드 우선순위 값 리턴 1~10
void   setPriority(int n) : 우선순위를 n으로 지정
Thread.State getState() : 스레드의 상태값 리턴
static void sleep(long millis) : millis 시간동안 스레드 일시정지
static Thread  currentThread() : 현재 실행중인 스레드 객체 리턴
void  join() : 스레드 종료할 때까지 기다림. 

스래드클래스 만들려면 상속받아야함  ThEx01
  
start() 서로 순서 있게 실행하는 게 아니고 일꾼이 동시다발적으로 일하게됨.
run() 메인스레드만 일하는거임 
꼭 호출대서 자동등록되게 start()를 써야 함.

2:53 쓰레드 여러개 만들고 싶으면

while 로 스레드 하면 무한루프 프로그램 종료가 안되니 주의 * 



2) Runnable 인터페이스로 스레드 구현  : 랭패키지에 있는 인터페이스
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Runnable.html

Runnable 인터페이스에 추상메서드 run() 하나만 있다. 

슬립매서드(스태틱메서드)는 스레드가 가지고 있는거니까,  Thread.sleep(시간)을 추상메서드 구현할 때 넣어줘야 함.

다만 트라이 캐치로 묶어줘야 함. 슬립메서드 자체가.

스래드 구현이나 자동 호출 등 모두 다 스레드 클래스 안에 구현되어 있어서, 러너블 인터페이스로 스레드 쓸 때도 스레드 객체를 만들면서 그 안에 (new TimeRunnable())객체생성 하면서 매개변수로 던져주게 된다. 같이 씀
그래서 그냥 스레드 상속받은거랑 차이없게된....

<3:3 스레드로 소요시간? ThEx04
GUI기반의 패키지중 awt, swing패키지.. gui방식으로 입력받는 다른 방법. 문자열로만받음. 





3) 스레드 상태  
ThreadState안의 값
스레드의 생명주기 6가지
NEW  new Thread()
RUNNABLE  start()
TIMED_WATING  sleep(1000)
BLOCK  i/o작업 끝날때까지 기다려주는 상태
WATING  wate()로 재운경우 기간없이 , notify()로 깨우기 전까지 지다림
TERMINATED  종료된것.

JVM이 상태값 알아서 선택해줌. 스케줄링 할때 우선순위 높은 걸 먼저 돌게 함. 동일우선순위에서는 돌아가면서 선택 round roading

4) 스레드 종료시키는 방법
#1. run() 종료
#2. interrupt() 호출 

5) 스레드 동기화 Synchronization
멀티 스레드에서 공유 자원 혹은 공유 데이터에 동시 접근할 때 문제점이 발생할 수 있다.
스레드 동기화 방법
- synchronized 키워드로 동기화 블럭 지정해주거나 (순차적 진행을 위한)
- wait() -notify() 메서드로 스레드의 실행 순서를 직접 제어해서 

#1. 메서드전체를 임계영역으로 지정 (화장실에 한 명 들어가면 락걸어놓고 나가면 언락하는 것)
synchronized void add() { /// 이렇게 매서드 앞에 붙여줌.
... 
}
#2. 코드 블럭을 임계영역으로 지정
void execute(){
...
synchronized(this){
...
}
...
}



8. 네트워크  


1) 네트워크 : 데이터 전송을 할 수 있는 통신망, 전자장비들의 집합
노드 Node : 네트워크에 연결된 장치
호스트 Host : 노트에게 하나 이상의 서비스를 제공해주는 노드 p2p

2) OSI7계층 : 모든 네트워크 통신에서 생기는 여러가지 충돌 문제를 완화하기 위해 
국제표준기구(IOS)에서 표준화된 네트워크 구조를 제시한 기본 모델

7 응용층
6 표현층 
5 세션층
4 전송층
3 네트워크층 - 라우터작업
2 데이터링크층
1 물리층 - pc, 공유기, 랜선

3) 네트워크 유형
LAN : Local Area Network 작은망
나와 같은 네트워크간의 통신을 의미. 작은 범위로 구성 -> 스위치로 만듦.( 스위치 : 단말장비 end device pc연결해주는거 - 내부망./ nyc랜카드 tp케이블 스위치 ...장비들..) . 같은 로컬에서는 ip로 접근가능. 
통신프로토콜 : 이더넷
통신주소 lan address

WAN : Wide Area Network 
라우터들을 묶은 망 내부에서 외부로 나가는 것. isp(KT)로부터 임대선 사용 
WAN( internet)
router ---------------------------router
  | |
switch     switch
|    |    |   |
pc   pc           server  pc
통신주소 ip주소 물리적주소

4) IP (Address)
명령프로프트cmd > ipconfig (내부망에서의 주소)
바뀌는 ip주소 ipconfig -all  < 4:20

google myip 나의 실제ip

https://www.naver.com : 도메인 (DNS도메인 네임 서버를 한번 거쳐서 숫자로된ip주소로 자동변환시킨 후 서버접속됨)
https:// ip : port

nslookup www.naver.com

5) port  
: 데이터를 주고 받는 통로, 여러개의 서비스를 해줄 때
서로 충돌이 나지 않도록 포트를 구분해서 만들어 놓음.
ip = 은행 지점 / port = 은행 안의 창구

포트 번호는 개발자가 임의로 선택 사용할 수 있으나, 
기존 응용프로그램에서 사용하는 번호나 시스템 포트번호는 피하는 것이 좋다.
절 알려진 포트 번호 : HTTP = 80, HTTPS = 443, FTP = 21, Telnet = 23 등
0~1023 사이의 번호를 가지며, 사용자 지정은 이 범위를 피해서 선택하도록

내 pc에서 사용중인 port번호 확인 : cmd > netstat -a > :뒤에 포트번호 확인 

6) Protocol : 통신/전송 규칙
: IP 프로토콜 위에서 동작

#1. TCP
연결형 서비스를 제공. 신뢰도 높음
ex) download
#2. UDP 
비연결형 서비스를 제공. 빠른 전송. 신뢰도 비교적 낮음
ex) streaming service






라우터 : 중계기 번역기..- 외부서버로 연결해주는...




9. java.net  네트워크 관련 패키지
1) InetAddress 
2) 

5:5 해보기

10. 소켓프로그래밍
소켓 = 통신을 하는 두 응용 프로그램간의 통신 링크의 각 끝단 endpoint
TCP/IP 프로토콜을 따르며 

1) TCP 소켓 : 클라이언트(요청자, node)와 서버(제공자,host) 




















































댓글