상태
객체는 외부에 드러나는 행위와 행위를 지원하기 위한 상태를 묶어주는 편리한 단위다.
- 상태 - 시간에 따라 변화하는 값을 사용하여 연산
- 접근 - 상태에 대한 접근을 제한해서 유연성을 조절
- 직접 접근 - 객체 내의 상태를 직접 접근
- 간접 접근 - 좀더나은 유연성을 위해 메소드를 통해 상태에 접근
- 공용 상태 - 클래스의 모든 인스턴스에 적용되는 상태는 필드에 저장
- 가변 상태 - 같은 클래스의 인스턴스 마다 다른 상태를 유지해야 할 경우 상태를 맵에 저장
- 외재 상태 - 객체와 연동된 특수 상태는 상태의 사용자가 소유하는 맴에 저장
- 변수 - 변수는 상태 접근에 필요한 네임스페이스를 제공
- 지역 변수 - 지역 변수는 단일 범위 내에서만 유효한 상태를 저장
- 필드 - 필드는 객체가 생성될 때부터 소멸될 때까지 상태를 저장
- 파라미터 - 파라미터는 메소드가 활성화된 동안 상태를 저장
- 수집 파라미터 - 여러 개의 메소드를 통해 복잡한 결과를 얻기 위해 파라미터를 전달
- 파라미터 객체 - 자주 사용하는 긴 파라미터 목록은 객체로 만들어서 통합
- 상수 - 변하지 않는 상태는 상수로 저장
- 역활 제시형 작명 - 변수 이름은 연산에서의 역활을 반영한다.
- 선언형 타입 - 변수에 대한 일반적 타입을 선언
- 초기화 - 변수 쵝화는 가급적 선언적으로 한다.
- 열성적 초기화 - 인스턴스가 생성될 때 필드를 초기화
- 게으른 초기화 - 초기화 비용이 높은 객체의 경우, 객체가 실제 사용되기 직전에 초기화
상태
컴퓨터 분야의 선구자들이 프로그래밍에 사용할 메타포를 정할 때, 그들은 시간에 따라 변하는 상태를 생각해내었다.
함수형 프로그래밍 언어에는 변화하는 상태의 개념이 없다.
객체 지향 언어는 상태를 다루는 데 적합한 전략이다.
효과적으로 상태를 관리하기 위한 키포인트는 유사한 상태를 묶어서 관리하고 각 상태를 별도로 관리하는 것이다.
두가지 상태가 유사한지 알수있는 두가지 단서
- 두개의 상태가 동일한 연산안에서 사용
- 동일한 시점에 생성되고 소멸되는가
접근
하나의 프로그래밍 언어는 저장된 값에 대한 접근 과 계산으로 나눌 수 있다.
하지만 두가지 개념은 서로를 통해서 설명이 가능하다.
접근은 현재 저장된 값을 반환하는 일종의 계산이다.
계산은 아직 저장되지 않은 메모르 값을 읽는 일종의 값 접근이다.
객체의 목표 중 하나는 저장소를 관리하는 것이다. 객체간의 접근의 용이성을 위해 객체 간의 독립성을 포기하는 것은 바람직하지 않다.
직접 접근
데이터를 가져오거나 저장하는 것을 나타내는 가장 간단한 방법은 직접 변수 접근을 사용하는 것이다.
1 | var x = 10; |
장점
- 표현의 명확성
단점
- 유연성이 희생된다.
- 프로그래밍할 때 프로그래머가 사고하는 수준보다 낮은 수준의 세부 구현을 사용한다는것
직접 접근이 많은 코드는 원할한 커뮤니케이션을 방해하는 요소
프로그래머는 생각하고 커뮤니케이션하고 배워야한다.
간접 접근
메소드 호출을 통해 상태변화를 숨길 수도 있다.
클래스 내부에서는 직접 접근을 허용하고 클래스 외부에서는 간접 접근을 사용하는것
공용 상태
여러 연산에서 같은 데이터 요소를 사용하는 경우일때 클래스에 필드를 선언해서 사용하는 것이 좋다.
가변 상태
때로 같은 객체에서도 인스턴스에 따라 각각 다른 데이터 요소를 필요로 할때도 있다.
가변 상태는 데이터 요소의 이름을 키로 하고 값을 데이터로 하는 맵으로 표현된다
장점
- 공용상태보다 훨씬 유연하다.
단점
- 코드 커뮤니케이션이 쉽지 않다.
가능하면 공용상태를 사용하라
외재 상태
외재 상태를 사용하면 객체의 복사가 어려워진다.
외재 상태를 사용하는 경우가 많지는 않다.
변수
코드를 읽는 사람은 변수의 범위, 생명기간, 역할, 런타임 타입등에 대한 정보를 알아야 된다.
가급적이면 단순한 이름을 통해 코드를 단순화 하는 편이 낫다.
변수의 생명기간은 변수의 범위보다 작을수 있다.
선언하는 타입을 가급적 명확하게 하라