일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |
- Django REST
- 프로그래머스
- Android
- Django REST Android
- 코틀린
- Android P
- Rxjava2
- UWP
- 안드로이드 구글맵
- Python
- C
- RxAndroid
- Java
- C++
- android architecture component
- 안드로이드
- mfc
- 알고리즘
- kodility
- dart
- android push
- Django REST framework
- FLUTTER
- livedata
- flutter firestore
- RxJava
- Kotlin
- C/C++
- NDK
- Flutter TextField
- Today
- Total
목록2018/11 (13)
개발하는 두더지
[Effective Java 규칙75] 사용자 지정 직렬화 형식을 사용하면 좋을지 따져보라Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다. 기본 직렬화 형식에는 객체 안에 담긴 데이터와 객체를 통해 접근할 수 있는 모든 객체를 담긴 데이터가 들어있다. 즉 외부로 공개하지 않으려고 했던 private으로 선언한 필드들도 직렬화에 담긴다. 가장 효과적인 직렬화 형식은 논리적 데이터만 들어있어야 하며, 물리적 표현과는 무관해야 한다. 그래서 기본 직렬화 형식은 그 객체의 물리적 표현이 논리적 내용과 동일할 때만 적절하다. 예를들어, 사람의 이름을 표현하는 클래스의 경우 기본 직렬화 형식을 그대로 이용해도 된다.어떤 사람의 이름은 성, 이름, 중간 이름을 나..
[Effective Java 규칙74] Serializable 인터페이스를 구현할 때는 신중하라Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다. 클래스 선언부에 implements Serializable 만 붙이면 직렬화 가능한 객체를 만들 수 있다. 지금까지 이 키워드를 사용해서 직렬화 객체를 만들고 intent에 데이터를 보내는 용도로 사용해 왔다. 바이트 스트림으로 변경해서 전송하는 직렬화 기능에는 문제는 없다. Serializable을 구현하면 클래스의 private, package-private 객체 필드도 공개가 되어서 정보 은닉을 위해 필드의 접근 권한은 최소화해야 한다는 규칙이 깨져버리게 된다. 그리고 모든 직렬화 가능 클래스에는 고유한..
AWS 프리티어 만료기간이 거의 다되가서 안쓰는 AWS 어플리케이션들을 삭제하는 도중 S3 bucket들이 삭제가 안되는 이슈가 발생했습니다.검색해보니 권한이 없어서 생긴 문제였는데요. 아래 사진과 같이 Elasticbeantalk S3 Bucket이 삭제가 안된다면 버킷 정책에서 권한을 직접 줘서 삭제해야 합니다. 권한이 없다고 나오는 문제.. 버킷을 하나 클릭하면 페이지가 하나 나오는데 권한 - 버킷 정책 - Effect 값을 Allow로 변경 후 저장을 눌러줍니다. 이제 어떤 장소에서도 이 버킷에 접근하고 수정할 수 있는 권한이 생겼습니다.프리티어가 만료되어서 다신 안쓸 것 이므로 과감하게 권한을 주고 바로 삭제해줍니다. 이제 다시 삭제를 시도하면 정상적으로 삭제가 됩니다.저 같은 경우엔 프리티어고..
[Effective Java 규칙71] 초기화 지연은 신중하게 하라Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다. 초기화 지연(lazy initialization)은 클래스, 필드 등을 사용하는 시점에 초기화를 하는 기법입니다. 대부분의 경우에는 초기화 지연보다는 일반적으로 클래스를 생성하면서 초기화 하는 것이 좋습니다. 초기화 비용이 크고, 내부적으로 필드 사용 빈도가 적다면 초기화 지연이 적절합니다. 초기화 지연을 위해 안정적인 방법을 사용해야 합니다. 1.초기화 지연 담당 클래스 숙어( lazy initialization holder class = Initialization-on-demand holder idiom ) 는 스레드에 안전하고 동시..
[Effective Java 규칙69] wait이나 notify 대신 병행성 유틸리티를 이용하라Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다. 자바 1.5부터 고수준 병행성 유틸리티 포함되어있어서 wait과 notify를 사용해서 구현해야될 일들을 대신하게 해준다. 제목처럼 wait과 notify를 정확하게 사용하는 것이 어렵기때문에 고수준 병행성 유틸리티를 반드시 사용해야 한다. java.util.concurrent에 포함된 고수준 병행성 유틸리티들은 실행자 프레임워크(executor framework), 병행 컬렉션(concurrent collection), 동기자(synchronizer) 이다. 이미 사용하고 있는 것일 수도 있지만 이번 규칙에..
[Effective Java 규칙68] 스레드보다는 실행자와 태스크를 이용하라Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다. 작업을 순차적으로 처리하는 작업 큐가 있다고 하자. 스레드 + 큐 조합으로 만든다면 스레드에 안전하지 않게 만들어질 가능성이 높다. 이를 해결하기 위해 자바 1.5부터 java.util.concurrent 패키지에 Executor Framework라는 유연성이 높은 인터페이스 기반 태스크 실행 프레임워크라는 것이 생겼다. ExecutorService executor = Executors.newSingleThreadExecutor(); 를 만들고 실행자에 Runnable을 넘겨 실행만하면 동기화가 끝난다. executor.exe..
[Effective Java 규칙67] 과도한 동기화는 피하라 Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다. 동기화를 너무 과도하게 적용하면 성능저하, 교착상태 문제가 생길 수 있다. 예를들어 옵저버 패턴에서 0~100인 값을 발행하고 전파한다고 생각해보자.동기화 블록안의 순환문에서 등록된 옵저버에 순차적으로 값을 등록하고 전파한다. 특정 인덱스에서 전파를 받는 콜백 인터페이스 함수에서 만약 옵저버를 삭제한다면 어떻게 될까? 리스트 순회가 이루어지는 상황에서 리스트에서 원소를 삭제하려하기 때문에 ConcurrentModificationException이 발생한다. executor service를 이용하여 다른 스레드에서 구독해제를 시도한다면 어떻게..
[Effective Java 규칙66] 변경 가능 공유 데이터에 대한 접근은 동기화하라Effective Java 2/E 책과 구글링을 통해 내용을 정리하고 개인적인 견해가 포함된 글입니다. 변경 가능한 데이터를 공유할 떄는 해당 데이터를 읽거나 쓰는 모든 스레드는 동기화를 해야 합니다. 동기화를 하지 않으면 스레드간 변경 사항이 적용될 거라고 보장할 수가 없기 때문입니다. 이런 오류들은 디버깅하기 까다롭고, 간헐적으로 발생하며, 타이밍에 민감합니다. 또한 어떤 VM이냐에 따라서 극도로 다르게 동작하기도 합니다. 메서드나 변수에 synchronized 키워드를 이용해 스레드간 동기화를 시켜서 data의 thread-safe를 시켜줍니다. 현재 data를 사용하고있는 스레드를 제외하고 나머지 스레드들은 da..