동기화 메소드와 동기화 블록 공유 객체를 사용할 때 주의할 점멀티 스레드 프로그램에서는 스레드들이 객체를 공유해서 작업해야 하는 경우가 있다.이 경우, 스레드 A를 사용하던 객체가 스레드 B에 의해 상태가 변경될 수 있기 때문에 스레드 A가 의도했던 것과는 다른 결과를 산출할 수도 있다. public class User1 extends Thread{ private Calculator calculator; @Override public void run() { calculator.setmemory(100); } public void setCalculator(Calculator calculator) { this.setName("User1"); this.calculator = calculator; } } pub..
분류 전체보기
Convert with Plain Java(String을 InputStream으로 변환) public void convertToStreamTest(){ String text = "test"; InputStream is = new ByteArrayInputStream(text.getBytes()); } 문자열을 Byte Array로 변환 후, ByteArrayInputStream을 사용하여 InputStream으로 변환한다.
7.5 함수를 이용해서 치환하기 정규표현식을 replace의 첫 번째 인자로 전달하면 단순히 고정된 문자열이 아니라 패턴에 일치하는 부분을 하나 치환한다. replace()의 강력한 기능은 고정된 문자열 대신 함수를 치환할 값으로 제공할 수 있다는 점 이다.두 번째 인자로 함수를 넘길 경우, 일치하는 부분을 찾을 때마다 다음과 같은 일련의 매개변수를 가지고 호출이 된다. 매치되는 전체 문자열 해당 매치 내에 포함된 캡처들(캡처는 배열이 아니라 각각 하나의 매개변수로 전달됨) 원본 문자열에서 매치되는 부분의 위치(index) 원본 문자열 예제) replace 사용 function upper(all, letter){return letter.toUpperCase();} // 대문자변환 console.log("..
프로세스와 스레드 멀티 프로세스들은 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적이다.멀티 스레드는 하나의 프로세스 내부에 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있어 다른 스레드에게 영향을 미치게 된다. 그렇기 때문에 멀티 스레드에서는 예외처리에 만전을 기해야 한다. 작업 스레드 생성과 실행 Thread 클래스로부터 직접 생성 Runnable 인터페이스를 구현하여 사용(아래예제를 참고 3가지 방법이 존재) public class BeepPrintExample2 { public static void main(String[] args){ // 쓰레드가 동작 Runnable beepTask = new BeepTask(); Thread threa..
왜 제네릭을 사용해야 하는가? 제네릭 타입을 이용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있다. 제네릭은 클래스와 인터페이스, 메소드를 정의할 때 타입(type)을 파라미터(parameter)로 사용할 수 있도록 한다. 장점1. 컴파일 시 강한 타입 체크를 할 수 있다. 실행시 타입 에러가 나는 것보다 컴파일 시에 미리 타입을 강하게 체크해서 에러를 사전에 방지 장점2. 타입 변환(castring)을 제거한다. 비제네릭 코드는 불필요하게 타입 변환을 하기 때문에 프로그램 성능에 악영향을 미친다. List list = new ArrayList(); list.add("hello"); String str = (String) list.get(0); // 타입 변환이 필요 List..
매치된 부분을 캡처하기 정규 표현식의 유용함은 검색한 결과를 저장(capture)해 놓고, 이를 이용해서 다른 일을 하고자 할때 빛을 발한다. 매치된 부분 캡처하기(지역, 전역) 정규 표현식의 match()메서드는 일치하는 부분을 찾아내면 캡처된 값들의 배열을 반환하고, 일치하는 부분이 없으면 null을 반환한다. match()로부터 반환된 배열에는 항상 첫 번째 인덱스에 일치하는 내용 전체가 저장되어 있고, 그 뒤에 캡처된 내용이 순서대로 저장되어 있다. g 플래그가 설정된 전역 정규 표현식을 이용하면 match()메서드는 조금 다른 값을 반환한다. 전역 정규 표현식은 지역(local)정규 표현식과 달리 첫 번째 매치되는 문자열만 찾지 않고 모두 매치되는 문자열을 찾는다. 이 때 각 매치 결과 내에 포..
정규 표현식 컴파일하기 정규 표현식은 여러 단계의 처리과정을 거친다.두 가지 주요한 단계로 컴파일(compilation) 과 실행(execution)이 있다. 정규 표현식이 처음 만들어지면 컴파일이 일어나고, 컴파일된 정규 표현식으로 문자열 내의 패턴을 찾으려고 하는 것이 바로 실행(execution)이다.일부 브라우저는 정규 표현식들의 컴파일 결과를 캐시해 두는 경우가 대부분이다. 그렇기 때문에, 복잡한 정규 표현식을 다루는 경우 나중에 사용할 표현식을 미리 정의해 두면 좋은 속도 향상을 얻을 수 있다. 컴파일된 정규 표현식을 만드는 두 가지 방법 var regex1 = /test/i; var regex2 = new RegExp("test", "i"); console.log(regex1.toString..
정규 표현식 살펴보기 1. 정규 표현식에 대한 설명정규 표현식 => 텍스트내에서 일치하는 문자열을 찾기 위해 문자열의 패턴을 표현하는 방식정규 표현식은 이런 패턴을 정의할 수 있도록 용어(terms) 와 연산(operators)로 구성된다. 정규 표현식을 생성하는 방법 정규 표현식 리터럴을 이용하는 방법 RegExp 객체의 인스턴스를 생성하는 방법 var pattern = /test/; var pattern = new RegExp("test"); 보통 개발시점에 어떤 정규식을 이용할지 알고 있는 경우에는 정규 표현식 리터럴을 사용하고, 실행 중에 문자열을 이용해서 동적 으로 정규 표현식을 생성해야 할 때는 생성자(RegExp)를 이용한다. 정규 표현식과 함께 사용할 수 있는 플래그 i - 대소문자를 구별..
정규 표현식이 멋진 이유 만약, 우리가 특정 데이터가, 미국의 우편번호 형식이 맞는지 boolean 값으로 반환하는 함수를 만든다고 생각해보자. => 99999-9999 (다섯자리 - 네자리)정규표현식을 사용하지 않고, 우편번호 형식을 검사한다면 아래와 같이 짤 수 있다. function isThisAZipCode(candidate){ if(typeof candidate !== "string" || candidate.length != 10) return false; for(var n=0; n
선형회귀 단순 선형 회귀를 위한 일반화된 예측함수ex) wave 데이터 셋x[0]은 특성(feature), 은 예측 값, b는 편향(bias), w[0]은 가중치(weight) 또는 계수(coefficient) 라고 부름 목표 데이터셋들의 특성들 (x[0], x[1], x[2], .... , x[p])과 라벨값(y) 사이의 관계를 잘 설명해낼 수 있는 적합한 특성 가중치(w[0], w[1], w[2], ..., w[p])와 b(편향)을 찾는 것 HOW? 어떻게 적절한 가중치와 편향을 찾을 까?선형 회귀는 라벨 값(y)과 예측값() 사이의 평균제곱오차(mean squared error, MSE) 를 최소화하는 파라미터 w와 b를 찾는다.(실제 라벨값과 예측값이 작으면 작을수록 예측성능이 좋은 것이기 때문에..