반응형

프로그래밍 정리 298

스트림의 원리

- 스트림이란?-> 스트림이란 빨대.-> 스트림은 빨대에 비유할 수 있음. 어떠한 음료수든 각각의 빨대만 꽂으면 음료수를 마실 수 있음.-> 야쿠르트용 빨대와 콜라용 빨대는 빨대는 꽂는 대상이 다름. 하지만 목표지점에 꽂기만 하면 그 다음부터는 빨대로 흡입하기만 하면 됨.-> 스트림으로부터 데이터 읽기=> 목표지점에 적절한 입력용 스트림을 생성.=> 스트림으로부터 데이터를 읽음.=> 스트림으로부터 필요한 만큼 계속해서 데이터를 읽음=> 스트림을 닫음-> 빨대로부터 음료수 마시기=> 적절한 빨대를 음료수에 꽂음=> 빨대로부터 음료수를 흡입.=> 빨대로부터 마시고 싶은 만큼 계속해서 음료수를 흡입=> 빨대를 제거 - 자바에서 사용하는 스트림은 방향성을 가짐. 스트림을 입력용으로 만들었다면 읽기에만 사용가능...

스트림(Stream)이란?

- 스트림(Stream)이란 장치(Device - 하드웨어 장치)로부터 데이터를 읽거나 기록할 때 사용하는 중간 매개체 역할을 하는 놈.-> 입출력 장치의 일반적인 특징=> 일반적인 입출력 장치는 대부분 데이터를 읽고 기록한다는 특징이 있음. - 어떠한 입출력 장치든 데이터를 읽고 쓰는 작업은 반드시 필요로 함. 입출력 데이터를 처리하기 위한 공통된 방법이란 바로 읽기와 쓰깅 대한 공통된 방법을 말함. 즉, 다양한 장치에 존재하는 데이터를 읽고 쓰기 위한 공통된 방법을 스트림이 제공하는 것. - 스트림의 역할-> 스트림은 데이터를 읽고 쓰기 위한 공통된 방법을 제공 - 원하는 장치에 스트림을 어떻게 개설하느냐가 문제지 스트림을 통해서 읽고 쓰는 것은 공통된 방법이기에 문제가 되지 않음.목표지점이 주어지면..

Java Stream(자바 스트림)

- 프로그램에서 사용하는 데이터는 파일일 수도 있으며 메모리일 수도 있음. 그리고 각종 하드웨어적인 입출력 장치에 존재할 수도 있음. 이렇게 다양한 장소에 존재하는 데이터들을 핸들하기 위해서는 입출력 데이터를 처리하는 공통된 방법이 있어야함.-> 입출력을 위한 공통된 방법=> 다양한 장소에 존재하는 데이터들을 핸들하기 위해서는 입출력 데이터를 처리하는 공동된 방법이 있어야함. - 만약 입출력 데이터를 처리하는 공통된 방법이 없다면 여러분은 각각의 하드웨어 장치에 직접 접근해서 데이터를 읽고 기록해야함. 키보드로부터 데이터를 읽기 위해 키보드가 동작하는 원리를 알아야 하며, 하드디스크에 있는 파일을 읽거나 기록하기 위해서 하위레벨의 하드 디스크를 알아야함. 이러한 불편을 없애기 위해서 자바에서는 스트림(S..

synchronized의 한계

- synchronized는 자동 동기화. 즉, 공유자원을 사용하면 synchronized 블록에서는 자동으로 동기화가 보장되는 것.편리하지만 미세한 동기화를 제어하기에는 약간의 한계가 있음. - 비디오 가게를 예로, 비디오 가게에 비디오 테이프가 5개 있고, 그리고 손님들이 비디오 테이프를 빌려간다는 가정하에 동기화가 보장되어야함. 두 사람이 동시에 하나의 테이프를 빌려가면 안 됨. 물론 synchronized를 사용하면 동기화는 보장 할수 있지만, 비디오를 빌린 후 비디오 테이프를 보는 동안에 동기화를 걸면, 한 사람이 비디오를 보는(시청하는) 동안 어떠한 사람도 비디오 테이프를 빌릴 수 없음. 잘못된 동기화의 예=================================================..

synchronized의 활용

- synchronized 블록을 이용할 때 안에 들어가는 객체의 멤버 변수에 대해서 동기화가 보장. 그렇다면 다음과 같이 saveMoney()와 minusMoney()의 메서드에서 synchronized 블록을 사용해도 됨.-> public void run(){synchronized(SyncMain2.myBank){SyncMain2.myBank.saveMoney(3000);}} -> public void run(){Synchronized(SyncMain2.myBank){SyncMain2.myBank.minusMoney(1000);}} - synchronized가 객체의 멤버를 상대하기 때문에 해당 객체만 명시해주면 어디서든 사용 가능. =====================================..

synchronized

- synchronized는 메서드와 블록 형태로 사용할 수 있으며, synchronized 메서드로 사용될 경우 해당 메서드 내에서 사용되는 모든 멤버 변수들은 락(Lock)이 걸리게 됨. - synchronized 메서드의 예-> public synchronized void saveMoney(int save){// .... 공유자원 - 멤버의 사용} -> synchronized 블록의 예=> 만약 블록 형태로 사용된다면 블록에서 명시한 객체의 멤버들은 모두 락(Lock)에 걸리게 됨.public void saveMoney(int save){synchronized(this){// ...공유자원 - 멤버의 사용}}// synchronized 메서드나 블록 내에서 사용되는 공유자원은 무조건 동기화가 보장됨..

공유자원의 접근

- 여러 개의 쓰레드가 생성되었을 때 하나의 자원을 이용하는 상황은 자주 발생. 공유자원을 이용할 때 문제가 발생하게 되는근본적인 이유는 동시에 작업을 진행하는 쓰레드의 특성 때문. - 공유자원이 문제가 되는 이유-> 동시에 작업을 진행하는 쓰레드의 특성 때문 - Bank라는 클래스의 객체를 NotSynMain에서 스태틱으로 생성함으로써 myBank객체는 프로그램의 하나의 메모리만 생성.-> Bank 클래스class Bank{// ...}-> NotSynMain 클래스의 static 멤버class NotSynMain{public static Bank myBank = new Bank();// ... 작업}- 그리고 다음과 같이 두 개의 쓰레드에서 NotSynMain의 myBank객체를 이용한다면 myBan..

멀티쓰레드와 문제점

- 쓰레드의 정의 : '쓰레드가 메서드가 동시에 실행되는 것'. 이 말은 동시에 메서드의 작업이 진행된다는 의미를 담고 있음.여러개의 쓰레드가 동시에 작업을 진행할 때 가장 큰 문제로 제기되는 것은 바로 공유자원(Shared Resource)의 문제 - 쓰레드가 생성되더라도 메서드 내부에 존재하는 자료만을 사용한다면 별다른 문제가 없음. 즉, 공유자원 자체가 없는 것.예를 들어 A, B, C라는 세사람이 화장실을 사용하려고 함. 각자의 방에 화장실이 하나씩 있다면 별다른 문제 없이 일을 볼 수 있음. 문제는 화장실이 하나밖에 없을 때 발생. 공용화장실, 그것도 변기가 하나밖에 없는 화장실이라면 사용상의 문제가 발생. A가 일을 보고 있을 때 B와 C는 대기해야함.만약 이것을 어기면 상상하기 힘든 문제가 ..

쓰레드 죽이기

- 쓰레드를 살아서 움직이게 하기 위해서 보통 run() 메서드 내에서 while문을 사용.조건이 만족하는 한 지속되고 반복된다는 특징 때문에 run() 메서드에서 while문이 자주 등장.쓰레드의 종료는 run() 메서드의 종료를 의미하기 때문에 일반적으로 while문의 종료가 곧 쓰레드의 종료가 되는 경우가 많음. - 쓰레드의 종료-> run() 메서드의 종료는 쓰레드의 종료를 의미-> 일반적으로 지속적인 작업을 하기 위해 run() 내에 while문을 포함하고 있으며, 이 while문이 끝나면 쓰레드가 종료되는 경우가 많음. - Deprecated된 Thread의 stop() 메서드-> public final void stop() Deprecated-> public final void stop(Th..

NotRunnable 상태 만들기

- 우선권은 어떤 쓰레드가 Run 상태를 더 많이 차지할 것인가의 문제. 즉 우선권이 높으면 그만큼 Run 상태에 자주 들어갈 수 있음. 쓰레드가 NotRunnable 상태가 될 수 있는 두가지 방법. - 쓰레드를 NotRunnable 상태로 만드는 방법-> sleep()을 이용해서 일정시간 동안만 대기시키는 방법(자동)-> wait()와 notify()를 이용해서 대기와 복귀를 제어하는 방법(수동) - sleep()과 wati()는 쓰레드를 NotRunnable 상태로 만듬. -> sleep()의 경우는 주어진 시간 만큼만 NotRunnable 상태로 보내며, 시간이 완료되면 자동으로 Runnable 상태로 복귀.-> wait()의 경우에는 사용자가 직접 wait()를 호출해서 NotRunnable 상..

반응형