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

[Java] 자바로 프로그래밍 입문하기: 3.2. 자료형 생성하기 (3)

이미지
복소수   복소수는 x + iy의 형태를 지닌 수입니다. x와 y는 실수이며, i는 -1의 제곱근이죠. x는 복소수의 실수부라고 하며, y는 복소수의 허수부라고 합니다. 복소수는 -1의 제곱근은 허수여야 한다는 생각으로부터 출발합니다. 실수에는 이러한 수가 없기 때문이죠. 복소수는 전형적인 수학적 추상화입니다: -1의 제곱근이 물리적으로 말이 되는지는 믿거나 말거나지만, 이는 자연 세계를 이해하는데 큰 도움이 됩니다.   복소수는 회로에서 음파, 전자기장에 이르기까지 물리 체계를 모델링하는데 쓰이고 있습니다. 이러한 모델들은 잘 정의된 수학적 연산을 기반으로 복소수를 다루기 때문에, 이러한 연산을 좀 더 쉽게 할 수 있도록 컴퓨터 프로그램을 작성해보려고 합니다. 곧, 새로운 자료형이 필요하겠네요.   복소수 자료형을 개발하는 것은 객체지향 프로그램의 모범 예제입니다. 어떤 프로그래밍 언어도 우리가 필요한 모든 수학적 추상화의 구현을 제공하지 않습니다. 하지만 자료형을 구현할 수 있는 능력은, 우리에게끔 복소수, 다항식, 벡터, 행렬 등 수많은 것들로부터 자유로워지게 됩니다.   필요한 복소수의 기본 연산들은 선형대수학의 덧셈, 곱셈과 교환법칙, 결합법칙, 분배법칙입니다. 크기(magnitude)를 계산하기 위해, 다음 등식에 따라 허수부와 실수부를 추출합니다. 다음 그림을 참고하세요.   예를 들어 a = 3 + 4i 이고 b = -2 + 3i 라면, a+b = 1 + 7i, a*b = -18 + i, Re(a) = 3, Im(a) = 4, |a| = 5입니다.   이러한 기초 정의로, 복소수 자료형을 구현하는 방법은 명쾌해졌습니다. 다음 API로 시작해봅시다. <Complex>의 API     <Complex>는 위의 API를 구현하는 클래스입니다. <Charge>, 그리고 수많은 자료형 구현들과 동일한 구성을 지녔죠. 인스턴스 변수(re와 im), 생성자, 인스턴스 메소드(plus(), times(), abs(), re(),

[Java] 자바로 프로그래밍 입문하기: 3.2. 자료형 생성하기 (2)

이미지
스톱워치   객체지향 프로그래밍의 특징 중 하나는 추상 프로그래밍 객체를 생성해 현실의 객체를 손쉽게 모델링한다는 개념입니다. 간단한 예제로, 스톱워치를 살펴보죠. 다음 API를 구현합니다. <Stopwatch>의 API   다시 말해 우리가 구현할 스톱워치는 옛날 옛적의 기본형 스톱워치입니다. 생성 시 시간이 흐르기 시작하고, elapsedTime() 메소드를 호출함으로써 생성 이후로 얼마가 지났는지만 확인할 수 있습니다. 알람이 울리는 스톱워치를 상상하셨을 수도 있겠지만, 그건 상상으로만 남깁시다. 스톱워치를 리셋하고 싶나요? 정지 및 다시시작을 하고 싶나요? 랩(구간) 타이머 기능을 추가하고 싶나요? 이러한 것들은 과제로 남겨두기로 하죠.   <Stopwatch>의 구현은 자바 시스템 메소드인 System.currentTimeMillis()를 사용합니다. 이는 현재 시각을 long 자료형 값으로 반환해주죠. 정확히는 UTC 기준으로 1970년 1월 1일 자정 이후로 지난 시간을 밀리초 단위로 반환해줍니다.    <Stopwatch>는 생성 시각을 인스턴스 변수에 담고, elapsedTime() 메소드가 호출될 때마다 현재 시각과 생성 시각의 차를 클라이언트에게 반환해주면 되는 것입니다. 이보다 더 단순할 수 있을까요? <Stopwatch>는 째깍거릴 필요가 없습니다.(물론 여러분 컴퓨터 내부의 시스템 클락이 <Stopwatch>와 그 외 수많은 자료형들을 위해 끊임없이 째깍거리고 있습니다) 단순히 클라이언트에게 시간을 재고있다는 환상을 줄 뿐이죠.   왜 클라이언트가 직접 System.currentTimeMillis()를 쓰면 안 될까요? 물론 우리는 그렇게 할 수 있죠. 하지만 스톱워치를 더 높은 단계로 추상화할수록 클라이언트는 구조를 이해하고 유지보수하기 쉬워집니다.   테스트 클라이언트는 늘 하던대로 만들면 됩니다. 두 개의 <Stopwatch> 객체를 생성하고, 서로 다른 계산을 하여

[Java] 자바로 프로그래밍 입문하기: 3.2. 자료형 생성하기 (1)

이미지
자료형 생성하기   원칙적으로는 사실 우리의 모든 프로그램들 8개의 기본 자료형들만으로 충분히 작성할 수 있습니다. 하지만 이전 절에서 체감했듯이, 높은 단계의 추상화를 담는 프로그램들을 만들기 위해 기본 자료형들만을 사용하는 것은 조금 버거운 일입니다. 그래서 자바 언어와 라이브러리에 내장된 수많은 자료형들을 사용했고, 이 또한 여전히 부족하죠. 나만의 자료형을 정의할 수 있는 능력 이 필요합니다. 나만의 자료형, 이를 곧 자바에서는 클래스(class) 라고 합니다.   자바 클래스로 자료형을 구현하는 것은, 정적 메소드를 담은 함수 라이브러리를 만드는 것과 별반 다르지 않습니다. 차이점이라 하면, 자료와 메소드의 구현이 연결된다는 것이죠.    API는 우리가 구현해야 할 필요가 있는 메소드들을 명시합니다. 하지만 그것들을 어떻게 재현할 지에 대한 것은 우리의 자유죠. 이번 절에서 우리는 스톱워치, 히스토그램, 터틀 그래픽(직교 평면에서 상대 커서를 사용하는 벡터 그래픽-옮긴 이), 스피라 미라빌리스(Spira mirabilis, 로그 나선의 응용으로 만들어진 기하학적 형태-옮긴 이), 복소수, 망델브로 집합(프랙탈의 일종-옮긴 이), 주식 계좌 등 수많은 응용을 해볼 것입니다.   자료형을 정의하는 절차를 자료 추상화 라고 합니다. 이는 2장의 함수 추상화 와 대응되는 용어죠. 자료와 자료에 구현되는 연산에 집중할 것입니다. "자료 및 해당 자료와 관련된 연산들을 명확하게 분리할 수 있다면, 그렇게 해야 합니다." 물리적 객체를 설계하거나, 수학적 추상화를 거치는 것은 간단하고 굉장히 유용하죠. 하지만 이러한 장점을 넘어선 진정한 자료 추상화의 힘은, 우리가 알고 있는 어떤 것이든 자료형으로 나타낼 수 있다는 것입니다. 자료형의 기본 요소들   자바 클래스에서 자료형을 구현하는 방법에 대해 이야기해볼까 합니다. 3.1절에서 다루었던 <Charge> 자료형에 대해서죠. 우리는 이미 클라이언트 프로그램으로 이러한 것들을 다뤄보