3월, 2021의 게시물 표시
{{ label!='' ? 'Label : ' : (q!='' ? '검색 : ' : '전체 게시글') }} {{ label }} {{ q }} {{ ('('+(pubs|date:'yyyy-MM')+')') }}

[Java] 자바로 프로그래밍 입문하기: 2.2. 라이브러리와 클라이언트 (3)

이미지
  표준 통계(Standard statistics)   다음은 과학 및 공학 응용프로그램에서 사용되지만 표준 자바 라이브러리에 구현되어 있지 않은, 수학 계산과 간단한 시각화 도구 라이브러리를 구성해볼까 합니다. 이는 통계 내에서 각 숫자들을 다루는데 사용되는 것들입니다. 현대 과학자들이 직면하고 있는 문제 중 하나는 자료들에 대한 분석입니다. 기초적인 자료 분석을 위해, 다음 API를 구현해 볼 것입니다. 자료 분석을 위한 정적 메소드들의 API 기초 통계   N개의 수치가 있다고 해봅시다. 이 수치들의 평균(mean)은 모든 수치들의 합을 N으로 나누어서 계산됩니다. 우리는 평균을 보고 수치들을 짐작할 수 있습니다. 이렇게 우리가 갖고있는 수치 값들에 대해 평가할 수 있는 여러 함수들이 있습니다. 최솟값, 최댓값, 중간값, 분산, 표준편차와 같은 것입니다.    프로그램 2.2.4: Data analysis library public final class StdStats { public static double max ( double [] a ) { double max = Double . NEGATIVE_INFINITY ; for ( int i = 0 ; i < a . length ; i ++) { if ( Double . isNaN ( a [ i ])) return Double . NaN ; if ( a [ i ] > max ) max = a [ i ]; } return max ; } public static double mean ( double [] a ) { if ( a . length == 0 ) return Double . NaN ; double sum = sum ( a ); return sum / a . length ; } publ

[Java] 자바로 프로그래밍 입문하기: 2.2. 라이브러리와 클라이언트 (2)

이미지
  난수(Random numbers)   우리는 Math.random()을 사용하는 프로그램을 작성해본 경험이 있습니다. 우리는Math.random()에서 제공하는 0부터 1 사이의 무작위 실수를, 우리 프로그램이 사용하고자 하는 숫자의 유형으로 바꿔서 사용했었습니다.(예를 들어 동전을 던지기 위해 난수를 boolean으로 바꾸었고, 카드를 섞기 위해 카드 뭉치 개수만큼의 무작위 정수로 바꾸었었죠)    이는 사실 효율적인 사용은 아닙니다. 우리 코드의 재사용성을 좀 더 늘리기 위해, '무작위 실수를 우리가 원하는 숫자 유형으로 바꾸는 것' 또한 라이브러리로 구성해볼까 합니다. <프로그램 2.2.1>은 <StdRandom> 라이브러리를 사용합니다. <StdRandom>은 다양한 무작위의 숫자를 생성하게끔 오버로딩 되어 있습니다. 난수에 대한 정적 메소드 라이브러리의 API   이들은 API의 짧은 설명만으로도 각자 무엇을 하는 메소드인지 알기에 충분합니다. Math.random()을 통해 다양한 자료형의 난수를 생성하는 이 메소드들은 <StdRandom.java>로 통합되었으며, 많은 프로그램에서 사용되는 난수 생성의 방법을 이 파일 하나로 집중할 수 있게 되었습니다.  더 나아가, 이 메소드들을 이용하는 프로그램은 Math.random()을 사용하는 것보다 더 명쾌한데, <StdRandom>의 메소드를 사용함으로써 어떤 형태의 난수를 생성하는지 잘 드러나기 때문입니다. 프로그램 2.2.1: Random number library public final class StdRandom { public static double uniform ( double lo , double hi ) { return lo + Math . random () * ( hi - lo ); } public static boolean bernoulli ( dou

[Java] 자바로 프로그래밍 입문하기: 2.2. 라이브러리와 클라이언트 (1)

이미지
라이브러리와 클라이언트   여러분이 이제껏 작성했던 프로그램들은 하나의 .java 파일에 작성되었습니다. 규모가 작으니 상관은 없지만, 규모가 큰 프로그램에서 모든 코드를 한 파일 안에 적는 것은 제한적이고 불필요합니다. 다행히도 자바에서 다른 파일에 정의된 메소드를 사용하는 것은 굉장히 쉬운 일입니다. 이는 우리에게 두 가지 중요한 능력을 부여해줍니다.   첫째, 코드 재사용 을 가능하게 합니다. 이미 작성된 프로그램의 코드를 복사하는 대신 단순히 참조하는 것만으로도 재사용을 할 수 있습니다. 코드를 정의하고 재사용하는 것은 현대 프로그래밍의 필수적인 부분입니다.   둘째, 모듈화 프로그래밍 을 가능하게 합니다. 2.1절에서 한 것처럼 정적 메소드를 이용해 작업을 나누는 것뿐만 아니라, 응용프로그램의 필요에 따라 서로 다른 파일에서 관리될 수 있습니다. 모듈화 프로그래밍은 프로그램의 부분부분을 독립적으로 개발, 컴파일, 디버깅을 할 수 있도록 합니다.    이는 각 모듈들에 대해 그 세부사항을 걱정할 필요 없이 나중에 가져다 쓰기만 하면 된다는 것입니다. 예를 들어, 여러분들은 실제 터미널에 어떤 과정으로 글자가 출력되는지 자세히 알 필요 없이 StdOut.print()를 통해 쉽게 출력할 수 있었습니다. 실제 내부의 동작은 굉장히 복잡하죠.   자바의 Math 라이브러리와 우리의 입출력을 위한 Std* 라이브러리는 우리가 이제껏 써왔던 라이브러리들입니다. 여러분들은 나만의 라이브러리를 정의하는 것이 얼마나 쉬운 것인지 알게 될 것입니다. 라이브러리를 정의할 수 있다는 것은, 그 라이브러리를 사용함으로써 많은 프로그램의 복잡한 작업들을 구성할 수 있다는 것입니다.   여지껏 자바 프로그램은 단순히 어떤 순서로 배치된 일련의 구문들에 불과하였습니다. 자바 프로그램은 메소드의 집합으로 구성된 클래스라고 생각하는 것, 더 나아가서 여러분들은 자바 프로그램을 메소드의 집합으로 이루어진 독립적 모듈인 클래스의 집합으로 생각할 준비가 될 것입니다.   각 메소드는 다른

[Java] 자바로 프로그래밍 입문하기: 2.1. 정적 메소드(Static methods) (2)

이미지
  수학 함수 구현하기   자바에서 이미 정의해놓은 정적 메소드들을 가져다쓰기만 하면 될까요? <Newton>에서 굳이 sqrt() 메소드를 구현해서 사용하는 것보다는, 자바 라이브러리에 있는 Math.sqrt()를 사용하는 것이 더 합리적입니다. 하지만 안타깝게도, 세상에는 무궁무진하게 수학 함수들이 많다는 것입니다. 자바에서는 아주 간단한 수학 함수들만 지원해줄 뿐이죠.   예를 들어보죠. 100만명의 학생이 대학교에 입학하기 위한 시험을 치릅니다. 점수는 400점부터 1600점까지 다양한 선택 과목으로 시험을 봅니다. 체육 특기생은 820점을 넘겨야 하고, 특정 장학금을 받으려면 1500점을 넘겨야 된다고 해보죠. 체육 특기생이 될 수 없는 학생들의 비율은 얼마일까요? 또, 장학금을 받을 수 있는 학생들의 비율은 얼마일까요?   두 개의 함수만 있다면 이 질문에 답변 할 수 있습니다. 가우시안(정규) 분포 함수는 종 모양의 그래프를 그리며,  ϕ ( x ) = e − x 2 / 2 / √2π 의 형태로 이루어집니다. 누적 정규분포 함수  Φ ( z )    는 정규 분포에서 수직선 x=z 왼쪽에 있는 넓이를 의미합니다.  이 함수들은, 우리의 예제에서 시험 점수의 분포를 정확하게 표현해냅니다.    하지만 자바의 Math 라이브러리에선 이런 정규 분포를 계산할 수 있는 메소드들을 지원하지 않으며, 우리는 필요에 의해 우리만의 메소드들을 만들어야 할 것입니다. 닫힌 형태(Closed-form,  방정식의 해를 해석적으로 표현할 수 있는 것, 예를 들어 2차방정식의 해는 근의 공식으로 표현될 수 있다.-옮긴 이)   우리는 닫힌 형태의 수학 공식들을 쉽게 구현할 수 있습니다.  ϕ 를 구하는 것은, 자바 라이브러리의 지수 함수와 제곱근 함수를 이용해서 쉽게 구현할 수 있습니다. 따라서 정적 메소드 pdf()는 꽤나 구현하기 쉽죠. 닫히지 않은 형태(No closed-form)   반면, 함수값을 계산하기 위해 우리는 꽤나 복잡한 알고리즘을 사용해야