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

[Java] 자바로 프로그래밍 입문하기: 3.3. 자료형 설계하기 (2)

이미지
불변성(Immutability)   자바의 String과 같은 불변 자료형은 한 번 생성되면 그 값이 절대 변하지 않는다는 특성을 가지고 있습니다. 반면, 자바의 배열과 같은 가변 자료형은 변할 가능성이 있는 객체의 값들을 다루죠. 이 장에서 다루었던 자료형들 중, <Charge>, <Color>, <Stopwatch>, <Complex>는 불변 객체이며, <Picture>, <Histogram>, <Turtle>, <StcokAccount>, <Counter>는 가변 객체입니다. 자료형을 불변으로 만들 것인지에 대한 것은 중요한 설계 결정 중 하나이며, 응용프로그램의 목적에 따라 달라집니다. 불변형(Immutable types)   많은 자료형의 목적은 변하지 않는 값을 캡슐화하고 기본 자료형과 같은 방식으로 동작하게 만드는 것입니다. 예를 들어, 한 프로그래머가 <Complex> 클라이언트를 구현한다면 아마도 코드에서 두 복소수 변수와 관해 z = z 0 와 같이 작성했을 것입니다. 이는 double형이나 int형 변수와 같은 방식이죠.   하지만 <Complex>가 가변형일 때를 생각해보죠. z의 값이 z = z 0 이라는 대입문 이후에 바뀌었다면, z 0 값 역시 바뀌게 됩니다. 왜냐하면, z와 z 0 은 같은 객체를 참조하고 있기 때문이죠! 이러한 예상치 못한 결과로 인해 흔히 앨리어싱(aliasing) 버그라고 하는 것이 발생하며, 객체지향 프로그래밍의 입문자들을 깜짝 놀라게 만드는 원인 중 하나입니다.   우리가 불변 객체를 구현하는 아주 중요한 이유 중 하나는 대입문과 함수의 인자, 반환값으로부터 그것들이 변할 가능성에 대한 걱정을 덜어낼 수 있다는 사실입니다. 가변형(Mutable types)   많은 자료형 추상화의 주된 목적은 변하는 값을 캡슐화하기 위함입니다. <Turtle, 프로그램 3.2.4>의 경우 전형

[Java] 자바로 프로그래밍 입문하기: 3.3. 자료형 설계하기 (1)

이미지
  자료형 설계하기   자료형을 생성할 수 있게 됨으로써, 모든 프로그래머들은 언어 디자이너가 될 수 있습니다. 여러분들은 내장 자료형의 굴레에서 벗어나 자신만의 자료형으로 원하는 클라이언트 프로그램을 작성할 수 있습니다.    자바는 복소수 자료형을 내장하지 않았으나, 여러분들은 <Complex>를 정의하고 <Mandelbrot> 프로그램을 작성하였죠. 자바는 터틀 그래픽을 내장하지 않았으나, 여러분들은 <Turtle>을 정의하고 다양한 클라이언트 프로그램들을 작성하였습니다.    또한 자바에서 특정 기능을 지원하더라도, 그것을 자신이 사용하기 편하게 조정하여 사용할 필요가 있습니다. 자바는 입출력에 대한 기능을 충분히 제공하지만, Std* 라이브러리를 이용해서 좀 더 편하게 사용한 것처럼 말이죠.   이제부터 우리가 프로그램을 만들 때 고민해야 할 첫번째 사항은, 우리가 필요한 자료형에 대해서 이해하는 것입니다. 이러한 행위는 곧 설계 행위입니다. 이번 절에서 우리는 어떤 프로그램의 개발이든 간에 핵심적인 단계인, API를 개발하는 것에 집중해볼 것입니다.   다양한 대안에 대해서 고민해보고, 그것이 클라이언트 프로그램과 구현에 끼치는 영향을 이해하며, 구현 전략과 클라이언트의 필요 사이에서 적절한 균형을 맞추기 위해 설계를 고쳐볼 것입니다.    이번 절에서 우리는 캡슐화 , 불변성 , 상속 에 대해 논의할 것입니다. 특히, 모듈화 프로그래밍과 디버깅을 가능케 하고, 명료하고 정확한 코드를 작성할 수 있게 만드는 자료형 설계에 집중할 것입니다.   이번 절의 마지막에는, 런타임에서 설계의 가정을 점검하기 위해 사용되는 자바의 메커니즘에 대해 이야기할 것입니다. 이러한 도구들은 신뢰성 높은 소프트웨어를 개발하는데 굉장히 큰 도움이 됩니다. API 설계하기   3.1절에서, 우리는 API를 사용하는 클라이언트 프로그램을 작성해봤습니다. 3.2절에서, 우리는 API를 구현했습니다. 이제는 API를 설계하는 방법에 대해 생각해볼