일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- JavaScript 내장객체
- TIL
- tdd
- javascript
- js
- 자바프로그래밍
- mybatis
- CSS
- springaop
- 스프링
- maven
- progressive web app
- 프로그레시브웹앱
- HTML
- 메이븐
- sql
- 국비지원
- web
- sqldeveloper
- 자바스크립트
- TodayILearned
- 서브쿼리
- framework
- javaprogramming
- PWA
- 오라클
- Oracle
- 생활코딩
- 프레임워크
- SpringMVC
- Today
- Total
1cm
자바 프로그래밍_Day_21_네트워크(Network), 스레드(Thread) 본문
2021.09.14
> 네트워크(Network)
-> 여러 대의 컴퓨터를 통신 회선으로 연결한 것(홈 네트워크, 지역 네트워크, 인터넷 등이 해당) -> 쉽게 말하자면 공유기를 연결해서 컴퓨터, 스마트폰 등 기계들을 사용하는 것이라고 보면 된다.
-> *홈 네트워크 : 집에서 공유기로 유선, 무선으로 연결한 것
-> *지역 네트워크 : 홈 네트워크끼리, 회사와 회사 등 특정한 곳과 통신회선으로 연결한 것
> 서버와 클라이언트
-> 네트워크로 연결된 컴퓨터간의 관계를 역할(role)로 구분한 개념이다.
-> 서버는 서비스를 제공하는 프로그램(컴퓨터)으로 클라이언트의 연결을 수락하고, 요청 내용을 처리 후 응답을 보내는 역할을 한다.
-> 클라이언트는 서비스를 받는 프로그램(컴퓨터)으로 네트워크 데이터를 필요로 하는 모든 어플리케이션이 해당 된다.
> IP주소
-> 네트워크 상에서 컴퓨터를 식별하는 번호로 네트워크 어댑터(랜카드)마다 할당 되어 있다.
-> 공유기에서 랜카드를 할당해주고, ip주소는 xxx.xxx.xxx.xxx형식으로 0~255까지의 정수로 설정된다.
-> ip주소를 다 외울 수 있기 때문에 '도메인 주소'라는 것을 사용해서 도메인이 연결된 ip주소를 통해 서버에 접근할 수 있다.
-> * DNS(Domain Name System) : 도메인이나 호스트 이름을 숫자로 된 IP주소로 해석해주는 TCP/IP 네트워크 서비스를 통해 도메인 이름을 IP 주소로 변환해주는 역할을 해주고, 인터넷에 연결된 컴퓨터를 구별해 준다.
> 포트(Port)
-> 같은 컴퓨터 내에서 프로그램을 식별하는 번호로 클라이언트는 서버 연결 요청 시 IP주소와 포트 번호를 알아야 한다.
-> 서버역할을 하는 동시에 실행이 가능하다.(웹서버, DDS) -> 하나의 ip를 가지고 0 ~ 65535까지 설정이 가능하다. 대부분 0 ~ 1023까지는 시스템 포트(시스템에서 쓰는 포트), 그 외 1024 ~ 65535는 우리가 임의로 사용을 해도 되는 포트라고 생각하면 된다.
-> * 포트 바인딩 : 포트 바인딩은 메시지를 송수신하는 위치와 방법을 결정하는 구성 정보다. 포트 바인딩은 그 유형에 따라 실제 위치, 파이프라인 또는 다른 오케스트레이션을 참조할 수 있다.
> InetAddress 클래스
-> IP주소를 다루기 위해 자바에서 제공하는 클래스이다.
메소드 | 설명 |
byte[] getAddress() | IP주소를 byte배열로 리턴한다. |
static InetAddress[] getAllByName(String host) | 도메인 명에 지정된 모든 호스트의 IP주소를 배열에 담아 반환한다. |
static InetAddress getByAddress(byte[] addr) | byte배열을 통해 IP주소를 얻는다. |
static InetAddress getByName(String host) | 도메인 명을 통해 IP주소를 얻는다. |
String getCanonicaHostName() | FQDN(Full Qualified Domain Name)을 얻는다. |
String getHostAddress() | 호스트의 IP주소를 반환한다. |
String getHostName() | 호스트의 이름을 반환한다. |
static InetAddress getLocalHost() | 지역호스트의 IP주소를 반환한다. |
boolean isMulticastAddress() | IP주소가 멀티캐스트 주소인지 알려준다. |
boolean isLoopbackAddress() | IP주소가 loopback 주소(127.0.0.1)인지 알려준다. |
> 소켓 프로그래밍
-> 소켓을 이용한 통신 프로그래밍
> 소켓
-> 네트워크 상에서 컴퓨터와 서버를 연결해서 데이터를 주고 받을 수 있는 소프트웨어 장치로, 프로세스(프로그램) 간의 통신에 사용되는 양쪽 끝 단(접속 끝 부분)을 말한다.
> TCP
-> 데이터 전송 속도가 느리지만 정확하고 안정적으로 전달할 수 있는 연결 지향적 프로토콜이다.
-> 통신 프로토콜 : 데이터를 주고받을 때 정해진 약속
-> 인터넷 상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜
> UDP
-> 데이터 전송 속도가 빠르지만 신뢰성 없는 데이터를 전송하는 비연결 지향적 프로토콜
-> 일방적으로 통신하는 방식 : ex.Streaming
-> 데이터를 데이터그램 단위로 처리하는 프로토콜
> TCP 소켓 프로그래밍
-> 클라이언트와 서버간의 1:1 소켓 통신 (각자 소켓을 생성해서 그 소켓으로 데이터를 서로 주고받는다)
-> 서버가 먼저 실행 되어 클라이언트의 요청을 기다려야 하고, 서버용 프로그램과 클라이언트용 프로그램을 따로 구현해야 한다.
-> 자바에서는 TCP 소켓 프로그래밍을 위해 java.net 패키지에서 ServerSocket과 Socket클래스를 제공해준다.
> 서버용 TCP 소켓 프로그래밍 순서
-> 1. 서버의 포트번호 정하기
-> 2. 서버용 소켓 객체 생성
-> 3. 클라이언트 쪽에서 접속 요청이 오길 기다림
-> 4. 접속 요청이 오면 요청 수락 후 해당 클라이언트에 대한 소켓 객체 생성
-> 5. 연결된 클라이언트와 입출력 스트림 생성
-> 6. 보조 스트림을 통해 성능 개선
-> 7. 스트림을 통해 읽고 쓰기
-> 8. 통신 종료
> 클라이언트용 TCP 소켓 프로그래밍 순서
-> 1. 서버의 IP주소와 서버가 정한 포트번호를 매개변수로 하여 클라이언트용 소켓 객체를 생성
-> 2. 서버와의 입출력 스트림 오픈
-> 3. 보조 스트림을 통해 성능 개선
-> 4. 스트림을 통해 읽고 쓰기
-> 5. 통신 종료
-> * 통신의 오류가 생기면 ConnectException이 발생할 수 있음
> 네트워크(Network) 코드 실습과 출력 결과
> Network_Client.tcp.Clinet
> Network_Client.Application
> Network_Server.tcp.Server
> Network_Server.Application
-> 서버 시작 후 클라이언트에서 내용을 보내면 아래처럼 통신 메세지가 기록된다.
-> 127.0.0.1은 내 컴퓨터의 ip주소.
> 프로세스(Process)
-> 간단한 의미로 실행중인 프로그램을 말한다.
-> 프로세스는 프로그램이 실행될 때 마다 개별적으로 생성된다.
-> 하나의 프로세스는 프로그램을 수행함에 있어 필요한 데이터와 메모리 등의 할당 받은 자원, 그리고 하나 이상의 스레드로 구성된다.
-> * 다중 프로세스 : 두 개 이상의 작업을 하는 것, 멀티태스킹은 사용자로 하여금 다수의 프로세스가 동시에 실행되는 것 처럼 보이게 한다.
> 스레드(Thread)
-> 순차적으로 실행하는 코드(프로그램 실행 흐름)
-> 프로세스 내에서 할당된 자원을 이요해 실제 작업을 수행하는 작업 단위로, 모든 프로세스는 하나 이상의 스레드를 가지며 각각 독립적인 작업 단위를 가진다.
-> 메인 흐름에서 추가적으로 다른 실행 흐름을 만드는 것.
> 메인 스레드(main thread)
-> 모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하며 시작된다.
-> main() 메소드의 첫 코드부터 아래로 순차적으로 실행되고, return을 만나면 종료된다.
-> 필요에 의해 작업 스레드들을 만들어서 병렬 코드를 실행이 가능하다.(멀티 스레드를 이용한 멀티 태스킹)
> 프로세스 종료
-> 싱글 스레드의 경우 메인 스레드가 종료되면 프로세스도 종료되지만, 멀티 스레드의 경우 실행중인 스레드가 하나라도 있다면 프로세스가 종료되지는 않는다.
> 멀티 프로세스 VS 멀티 스레드
-> 멀티 프로세스 : 각각의 프로세스를 독립적으로 실행하는 것.
-> 멀티 스레드 : 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것.(동시에 병렬적으로 수행함)
> 싱글 스레드와 멀티 스레드
-> 싱글 스레드 : 메인 스레드 하나만 가지고 작업을 처리한다. -> 한 작업씩 차례대로 처리해 나간다.
-> 멀티 스레드 : 메인 스레드 외의 추가적인 스레드를 이용하여 병렬적으로 작업을 처리한다.
> 멀티 쓰레드(Multi Thread) 장점
-> 자원을 보다 효율적으로 사용 가능
-> 사용자에 대한 응답성 향상
-> 애플리케이션의 응답성 향상
-> 작업이 분리되어 코드가 간결해짐
-> CPU 사용률 향상
> 멀티 쓰레드(Multi Thread) 단점
-> 동기화(Synchronization)에 주의해야 함
-> * 동기화(Synchronization) : 시스템의 한정적인 자원에 여러 쓰레드가 동시에 접근해서 사용하려고 하면 문제가 발생할 수 있다. 이런 문제를 방지하기 위해 쓰레드들에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조정해주는 기법 -> 여러 개의 스레드가 공통적으로 작업해야될 경우 동기화를 통해서 같은 형태의 객체를 사용할 수 있다.
-> 교착상태(dead-lock)가 발생하지 않도록 주의해야 함
-> * 교착상태(膠着狀態, dead-lock) : 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태 (대기가 끝나지 않는 상태)
-> 프로그래밍 시 고려해야 할 사항이 많음
> 스레드(Thread) 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
스레드(Thread) 생성
1. Thread 클래스를 상속받는 방법
public class 클래스명 extends Thread{
// 상속 처리 후, run() 메소드 오버라이딩
@Override
public void run(){
// 작업하고자 하는 코드 작성
}
}
----------------------------------------
public class Run{
public static void main(String[] args){
클래스명 레퍼런스 = new 생성자(); //Thread를 상속한 객체 생성
레퍼런스.start();
}
}
2. Runnable 인터페이스를 구현하는 방법
public class 클래스명 implements Thread{
// 상속 처리 후, run() 메소드 오버라이딩
@Override
public void run(){
// 작업하고자 하는 코드 작성
}
}
----------------------------------------
public class Run{
public static void main(String[] args){
클래스명 레퍼런스 = new 생성자(); //Thread를 상속한 객체 생성
Thread thread = new Thread(레퍼런스);
레퍼런스.start();
}
}
|
cs |
> run(), start()
-> 1. run() 호출
-> 2. start() 호출
> 스레드(Thread) 실습 코드와 출력 결과
> com.kh.chap1.thread.Thread1
> com.kh.chap1.thread.Thread2
> com.kh.chap1.Application
'국비지원_Java > Java Programming_1' 카테고리의 다른 글
자바 프로그래밍_Day_23_네트워크 프로그래밍 구현 평가 (0) | 2021.09.25 |
---|---|
자바 프로그래밍_Day_22_스레드(Thread)2 (0) | 2021.09.25 |
자바 프로그래밍_Day_20_제네릭스(Generics) (0) | 2021.09.21 |
자바 프로그래밍_Day_19_컬렉션(Collection) (0) | 2021.09.21 |
자바 프로그래밍_Day_18_입출력(IO) (0) | 2021.09.21 |