분류 전체보기(126)
-
11장 : 동시성
아이템 78. 공유 중인 가변 데이터는 동기화해 사용하라 - synchronizaed 는 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장 - 상태가 일관되지 않은 순간의 객체가 다른 스레드가 보지 못하게 막는 용도로만 생각 - 동기화는 배타적 실행 뿐 아니라 스레드 사이의 안정적인 통신에 꼭 필요 - volatile 선언하면 동기화를 생략해도 됨 - 배타적 수행과는 상관 없지만 항상 가장 최근에 기록된 값을 보장 - 메서드에 synchronized를 붙였으면 volatile 제거해야 - Atomic 패키지는 락 없이도 스레드 안전한 프로그래밍을 지원 - Atomic 은 원자성(배타적 실행)까지 지원 - 가장 좋은 방법은 애초에 가변 데이터를 공유하지 않는 것 - 가변데이터는 단일 스레드에서만 사..
2023.04.22 -
10장 : 예외
아이템 69. 예외는 진짜 예외 상황에만 사용하라 - 예외는 오직 예외 상황에서만 써야 한다. 절대로 일상적인 제어 흐름용으로 쓰여선 안 된다 - 잘 설계된 API라면 클라이언트가 정상적인 제어 흐름에서 예외를 사용할 일이 없게 해야 # 상태 검사 메서드, 옵셔널, 특정 값 중 하나를 선택하는 지침 1. 외부 동기화 없이 여러 스레드가 동시에 접근 가능하거나 외부 요인으로 상태가 변할 수 있다면 옵셔널이나 특정 값 사용 2. 성능이 중요한 상황에서 상태 검사 메서드가 상태 의존적 메서드의 작업 일부를 중복 수행한다면 옵셔널이나 특정 값 선택 3. 다른 모든 경우엔 상태 검사 메서드 방식이 더 나음 아이템 70. 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 - 호출하는..
2023.04.21 -
1장 : 개요
스레드 : 경량 프로세스, CPI 자원 스케줄의 기본 단위 - 하나의 스레드는 다른 스레드와 상관 없이 비동기적으로 실행 - 한 프로세스 내 모든 스레드는 같은 변수에 접근하고 같은 힙에 객체 할당 - 스레드는 서로 같은 메모리 주소 공간을 공유하고 동시에 실행되기 때문에 다른 스레드가 사용중일지도 모르는 변수를 읽거나 수정할 수도 있다. - 동기화를 충분히 해두지 않으면 여러 스레드에서 실행되는 연산의 순서가 예측할 수가 없음 # 원격 객체가 대비해야 하는 두 가지 위험 1. 먼저 다른 객체와 공유될 수 있는 상태에 접근 시 적절히 조율해야하나, 원격 객체 자체의 상테에 접근할 때도 마찬가지, 2. RMI 객체도 동시에 여러 번 호출될 수 있게 작성해야 하며 스레드에 안전해야 - 동시 수행 코드를 개발..
2023.04.15 -
9장 : 일반적인 프로그래밍 원칙
아이템 57. 지역변수의 범위를 최소화하라 - 지역변수의 범위를 줄이는 가장 강력한 기법은 역시 가장 처음 쓰일 떄 선언하기- 거의 모든 지역변수는 선언과 동시에 초기화해야(try-catch 제외)- 반복문이 종료된 뒤에도 써야 하는 상황이 아니라면 while문보다 for 쓰기 아이템 58. 전통적인 for 문보다는 for-each 문을 사용하라 ## for-each 못쓰는 상황 - 파괴적인 필터링 : 선택된 원소를 제거해야 한다면 사용 불가 - 변형 : 원소의 값 일부 혹은 전체 교체시 사용 불가 - 병렬 반복 : 병렬 순회시 사용 불가 아이템 59. 라이브러리를 익히고 사용하라 # Random 사용 시 문제점 - 나머지 연산값이 2의 제곱수라면 같은 수열이 반복 - 나머지 연산값이 2의 제곱수가 아니..
2023.04.15 -
3장 : 함수 정의와 호출
- const 추가 시 public static final 필드로 컴파일 됨 # 확장함수 - 어떤 클래스의 맴버 메서드인 것 처럼 호출할 수 있지만 그 클래스 밖에 선언된 함수 package strings fun String.lastChar() : Char = this.get(this.length - 1) - 클래스 이름(String) -- 수신 객체 타입 - 확장 함수가 호출되는 대상이 되는 값(객체, this) -- 수신 객체 - 위 코드에서 this 생략 가능 - 확장함수 안에서는 클래스 내부에서만 사용할 수 있는 private, protected 맴버를 사용할 수 없다. - 확장함수는 오버라이드 할 수 없음 - 확장한 함수와 그 클래스 맴버 함수의 이름이 같으면 확장 함수가 아니라 맴버 함수가 호..
2023.04.10 -
2장 : 코틀린 기초
- 코틀린 if는 값을 만들어내지 못하는 문장이 아니고, 결과를 만드는 식임 fun max(a: Int, b: Int) : Int { return if(a > b) a else b } - 이름이 is로 시작하는 프로퍼티는 getter에 get이 붙지 않고 setter에는 is를 set으로 바꾼 이름을 사용 # 프로퍼티 접근자 직접 작성 방법 class Rectangle(val height : Int, val width : Int) { val isSquare : Boolean get() { return height == width } } # enum, when 사용법 enum class Color (val r: Int, var g: Int, var b: Int) { RED(255,0,0), GREEN(0,..
2023.04.10