다른 언어들 보다 안정성이 높다
가변성을 제한하는 것에 대한 장점
1.프로그램을 이해하고 디버그하기 힘들어 집니다 - 예상치 못한 상황이나 오류를 발생 시키는 경우 큰 문제가 됩니다.
2.코드의 실행을 추론하기 힘들어 집니다. - 한 시점에서 확인한 값이 동일하게 유지되는지 확신할 수 없습니다.
3.멀티스레드 프로그램일 때는 적절한 동기화가 필요합니다. - 변경 부분에서 충돌 발생할 수 있습니다.
4. 테스트하기 어렵습니다 - 변경이 많으면 더 많은 조합을 테스트 해야 합니다.
5.상태 변경시 변경부분을 알릴 때 예 리스트에 가변 부분이 있다면 변경이 일어날 때 마다 리스트 전체를 다시 정렬해야 합니다
일관성,복잡성 증가 문제 예시
멀티스레드를 활용해서 프로퍼티 수정시 충돌로 인해 일부 연산이 실행 되지 않습니다
코틀린 코루틴을 활용하면, 더 적은 스레드가 관여되므로 충돌과 관련된 문제가 줄어들지만 문제가 사라지는 것은 아닙니다
일부 연산이 충돌 되어 사라지므로 적절하게 추가로 동기화 구현을 해야 합니다
thread , coroutine 차이
process : 보조 기억장치에 프로그램이 메모리 상으로 적재되어 실행 되는 ,힙 할당
힙: 독립된 메모리 영역
thread : 같은 프로세스 내부에서 실행 되는 작업의 흐름 단위 , process 하위에 종속 되어있는 작은 단위이며 스택을 갖는다 . 다른 thread에 스택 메모리 공유할 수 없다 하지만 process의 힙 속한 thread 공유 가능하다
스택: 독립된 메모리 영역
동시성 : 시분할 기법을 사용하여 여러 작업을 조금씩 나누어 실행 한다
병렬성 : 시분할 없이 여러 작업을 동시에 진행 cpu 코어가 여러개 일때 가능
thread : 각 테스크에서 스택을 할당 받는다 그리고 여러 작업을 동시에 수행할 때 os는 어떤 작업을 먼저 수행 할지 어떤 thread를 더 많이 사용해야 효율적인지 선점 스케쥴링 해야 한다 -- context switching , 블로킹
블로킹:a가 b의 결과가 나올때 까지 기다려야 한다면 결과 나올 때까지 a을 못쓴다
coroutine : Lightweight Thread라고 부른다 작업 하나하나를 분배해서 동시성을 보장하는 것을 목표로 하지만 thread 할당이 아닌 object를 할당해 object를 자유롭게 스위칭 하면서 비용을 대폭 줄인 것이다 -- programmer switching, suspend(non blocking) - thread를 더 잘개 쪼개어 사용 가능한 기법
코틀린 가변성 제한하는 방법
val , 가변 컬렉션과 읽기 전용 컬렉션 구분하기 , 데이터 클래스의 copy
immutable 객체 사용시 유리한점
1. 한 번 정의된 샅애가 유지되므로 코드를 이해하기 싶다
2. immutable 객체는 공유했을 때도, 충돌이 따로 이루어지지 않으므로, 병렬처리를 안전하게 할 수 있습니다
3. immutable 객체에 대한 참조는 변경되지 않으므로, 쉽게 캐시할 수 있습니다.
4. immutable 객체는 방어적 복사본을 만들 필요가 없습니다. 또한 객체를 복사할 때 깊은 복사를 따로 하지 않아도 됩니다.
5. immutable 객체는 다른 객체를 만들 때 활용하기 좋습니다. 또한 객체는 실행을 더 쉽게 예측할 수 있습니다.
6. immutable 객체는 set,map의 키로 사용할 수 있습니다. mutable에서는 사용할 수 없는데 그 이유는 set,map이 내부적으로 해시 테이블을 사용하고 해시 테이블은 처음 요소를 넣을 때 요소의 값을 기반으로 버킷을 결정하기 때문입니다 따라서 요소의 수정이 일어나면 해시 ㅔ이블 내부에서 요소를 찾을 수 없게 되어 버립니다