[Java] 51. 네트워크 - 프로그램(2)
·
Java/IO, Network
네트워크 - 프로그램(2)#Java/adv2/Network/네트워크 프로그램4 - 자원 정리1: 네트워크 프로그램에 try-catch-finally 도입스트림, 소켓은 여러 곳에서 닫는다 유틸리티 클래스로 뽑자close하다가 예외 발생시 단순히 로그만 남기자input, output, socket 닫는 것 각각을 메서드로 뽑아서, 각각 예외를 잡도록 하자. 하나를 닫는 과정에서 예외가 발생해도 다음 자원을 닫을 수 있다.순서에 신경쓰자(여기선 socket을 마지막에 닫자)Client자원 선언은 try 밖으로 빼고, 자원 정리 시 finally 코드 블럭에서 SocketCloseUtil.closeAll() 만 호출Ses..
[Java] 50. 네트워크 - 프로그램(1)
·
Java/IO, Network
네트워크 - 프로그램(1)#Java/adv2/Network/네트워크 프로그램1 - 예제 , /네트워크 프로그램1 - 분석Client소켓(socket)Socket socket = new Socket("localhost", PORT);서버쪽의 주소, PORT 지정내부에서 InetAddress를 사용. IP주소를 통해 TCP 접속을 시도한다 (3-way handshake)연결이 성공적으로 완료되면 Socket 객체를 반환한다.남는 포트 하나를 로컬 포트로 자동 할당 해줌(클라이언트쪽 포트)Socket 객체를 통해 서버와 통신할 수 있다.네트워크 스트림클라이언트-서버간 통신은 Socket이 제공하는 스트림을 사용한다.socket.getInputStream()socket.getOutputStream()보조 스트림..
[Java] 49. File, Files
·
Java/IO, Network
File, Files#Java/adv2파일이나 디렉토리를 다루는 객체 File 또는 Files, Path 클래스/FileFile은 파일과 디렉토리를 둘 다 다룬다.File file = new File("temp/example.txt");File directory = new File("temp/exampleDir");주요 메서드createNewFile(): 새 파일을 생성. 단순히 객체를 생성한다고 파일이 생성되는게 아니라, 이 메서드를 호출해야 생성된다.exists(): 파일이나 디렉토리의 존재 여부를 확인mkdir(): 새 디렉토리를 생성delete(): 파일이나 디렉토리를 삭제isFile(): 파일인지 확인isDi..
[Java] 48. 자바 I/O 활용
·
Java/IO, Network
I/O 활용#Java/adv2회원 데이터를 관리하는 콘솔 프로그램 예제(Create, Read)Member 클래스 정의 및 Repository 인터페이스 정의/회원 관리 예제1 - 메모리ArrayList에 저장하는 방법문제: 자바 프로그램 종료 시 모든 회원 정보가 사라진다/회원 관리 예제2 - 파일에 보관파일에 저장해서 데이터를 영구 보존해보자.한 줄 단위로 회원 데이터를 파일에 저장(ID,Name,Age)BufferedReader, BufferedWriter 보조 스트림을 이용.try-with-resource로 스트림 선언 및 해제코드 블록이 끝나면 자동으로 close()가 호출try (BufferedWriter bw = new BufferedWriter(new FileWriter(FILE_PATH,..
[Java] 47. 자바 IO 기본(2)
·
Java/IO, Network
IO 기본(2)#Java/adv2문자를 스트림에서 편리하게 사용하기/문자 다루기1 - 시작기본적으로 스트림에는 byte를 전달해야 한다 String을 byte로 변환한 다음 전달byte[] writeBytes = writeString.getBytes(인코딩)fos.write(writeBytes)String readString = new String(readBytes, UTF_8) fis.readAllBytes()문자를 byte로 변환해야하는 번거로움 문자를 byte로 변환해주는 기능을 대신 처리해주는 클래스 등장/문자 다루기2 -..
[Java] 46. 자바 IO 기본(1)
·
Java/IO, Network
IO 기본 (1)#Java/adv2/스트림 시작1: 자바 프로세스의 데이터를 외부로 입출력 입력/출력 스트림(단방향)을 사용. byte 단위 입출력/스트림 시작 - 예제1new FileOutputStream(파일경로): 파일에 데이터를 출력하는 스트림파일 없으면 자동 생성. 폴더는 자동 생성Xfos.write(int): byte 단위로 값 출력new FileOutputStream(파일경로, appned 유무):append 옵션이 true이면 기존 파일의 끝에 이어서, false(기본값)이면 지우고 처음부터 다시 작성new FileInputStream(파일경로): 파일에서 데이터 읽어오는 스트림fis.read(): by..
[Java] 45. 스레드 풀과 Executor 프레임워크(2)
·
Java/멀티스레드&동시성
[Java] 44. 스레드 풀과 Executor 프레임워크(1)
·
Java/멀티스레드&동시성
스레드 풀과 Executor 프레임워크(1)#Java/멀티스레드(복습할 때 왠만하면 강의 자료 전체를 보는게 좋긴 할듯)이전 챕터까지 우리는 Runnable 을 만들고 Thread 를 직접 생성해서 사용했다. 하지만 실무에서 직접 스레드를 생성해서 사용하면 다음과 같은 문제가 있다.스레드 생성 시간으로 인한 성능 문제스레드 관리 문제Runnable 인터페이스의 불편함1. 스레드 생성 비용으로 인한 성능 문제스레드를 사용하려면 먼저 스레드를 생성해야 한다. 그런데 스레드는 다음과 같은 이유로 매우 무겁다.메모리 할당: 각 스레드는 자신만의 호출 스택(call stack)을 가지고 있어야 한다. 이 호출 스택은 스레드가 실행되는 동안 사용하는 메모리 공간이다. 따라서 스레드를 생성할 때는 이 호출 스택을 위..
[Java] 43. 동시성 컬렉션
·
Java/멀티스레드&동시성
동시성 컬렉션#Java/멀티스레드정리이전 챕터에서 원자적 연산에 대해 배웠고, 원자적 연산이 아닌 경우에 멀티스레드 상황에서 문제가 발생할 수 있음을 확인했다.여러 스레드가 동시에 접근해도 괜찮은 경우를 스레드 세이프(Thread Safe) 하다고 한다.java.util 패키지에 소속되어 있는 컬렉션 프레임워크는 원자적인 연산을 제공할까?예를 들어서 하나의 ArrayList 인스턴스에 여러 스레드가 동시에 접근해도 괜찮을까? (= 스레드 세이프할까?)컬렉션에 데이터를 추가하는 add() 메서드를 생각해보자. 단순히 컬렉션에 데이터를 하나 추가하는 것뿐이다. 따라서 이것은 마치 연산이 하나만 있는 원자적인 연산처럼 느껴진다. 원자적인 연산은 쪼갤 수 없기 때문에 멀티스레드 상황에 문제가 되지 않는다.하..
[Java] 42. CAS - 동기화와 원자적 연산
·
Java/멀티스레드&동시성
CAS - 동기화와 원자적 연산#Java/멀티스레드정리원자적 연산이란?컴퓨터 과학에서 사용하는 원자적 연산(atomic operation)의 의미는 해당 연산이 더 이상 나눌 수 없는 단위로 수행된다는 것을 의미한다. 즉, 원자적 연산은 중단되지 않고, 다른 연산과 간섭 없이 완전히 실행되거나 전혀 실행되지 않는 성질을 가지고 있다. 따라서 멀티스레드 상황에서 다른 스레드의 간섭 없이 안전하게 처리된다.예를 들어서 다음과 같은 필드가 있을 때volatile int i = 1;다음 연산은 둘로 쪼갤 수 없는 원자적 연산이다.i = 1;왜냐하면 이 연산은 다음 단 하나의 순서로 실행되기 때문이다.오른쪽에 있는 1 의 값은 왼쪽의 i 변수에 대입한다.하지만 다음 연산은 원자적 연산이 아니다.i = i + 1;..