전체 글
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsxaCD%2FbtroWodm6Yz%2FjhKHy9ZfxKXhG5omZWFIP0%2Fimg.png)
[Android] 안드로이드 스튜디오 GradleView Tasks 미노출시
Gradle View의 Tasks 기능을 사용할 기능이 있어서 봤더니 아무리 찾아봐도 Tasks가 없었다. 4.2 이후 버전에서는 성능 향상때문에 task 리스트들이 숨겨지는 게 기본값으로 설정되어 있다고 한다. Preferences -> Experimental로 가서 'Do not build Gradle task list during Gradle sync' 체크박스를 해제하면 된다. 해제 후에는 'Sync Project with Gradle Files'를 한번 실행해주자.
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFXc4l%2Fbtro14du4dj%2FjGhc1KbOWM8qgK7c1Y0pq0%2Fimg.png)
[Android] Gradient 배경 만들기
Drawable xml을 아래와 같이 정의하여 Gradient Background를 정의할 수 있다. gradient의 속성 값들에 대한 설명은 아래와 같다.- type : linear(기본값), radial, sweep - angle : gradient의 기준 방향을 나타내며 원하는 각도를 정의함. - endColor : gradient의 끝 색상 - centerColor : gradient의 중간 색상 - startColor : gradient의 시작 색상 - gradientRadius : gradient의 반지름 값. type이 'radial'인 경우에만 적용 가능.
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FusbiC%2FbtroYkt03CU%2FfEs9xjrbKgC1mXzTRXaLg1%2Fimg.png)
[클린 코드] 함수(2)
오류 코드 대신 예외 사용하기 명령 함수에서 오류 코드를 반환하는 형태의 처리는 명령/조회 분리 규칙을 모호하게 위반할 수 있다. 왜냐하면 if문에서 명령을 표현식으로 사용하기 쉬운 구조가 되기 때문이다. if(deletePage(page) == OK){ ... } 위 코드는 여러 단계로 중첩되는 코드를 발생시킨다. 오류 코드를 반환하면 호출자는 오류 코드를 곧바로 처리해야 하기 때문이다. if (deletePage(page) == OK) { if(registry.deleteReference(page.name) == OK) { if(configKeys.deleteKey(page.name.makeKey()) == OK){ logger.log("Page deleted"); }else{ logger.log("..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnZaCe%2FbtroT5dy7me%2F7D418LzTijt8T39kLPZaA1%2Fimg.png)
[클린 코드] 함수(1)
명령과 조회 명확히 분리하기 함수는 무엇인가를 수행하거나, 답하거나 둘 중 한가지만을 해야한다. 객체의 상태를 변경하거나, 객체의 정보를 반환하거나 둘 중 하나만 해야한다는 말이다. 예를 들어 다음 함수를 예를 들어 보자. fun set(attr: String. value: String): Boolean { ... } 위 set 함수는 이름이 attr인 속성을 찾아 값을 value로 바꾼 후 성공한다면 true를 실패한다면 false를 리턴한다. 문제는 이런 메소드를 사용하면 아래와같은 어색한 형태의 코드가 나온다. if(set("name", "MJ")){ ... } 이런 형태의 메소드가 가지는 단점은 누군가가 이 코드를 볼때 "name"이 "Tom"으로 설정 되어있는지 체크하는 코드인지, 아니면 "na..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSQ5Yf%2FbtroTlUZNRd%2FzQNOv7WKiuMyVHbv7vCFH0%2Fimg.png)
[Java] volatile 키워드
특징 keyword로 Java 변수를 Main Memory에 직접 저장한다. 변수의 값을 Read 할 때마다 CPU Cache에 저장된 값이 아닌 Main Momory에서 직접 읽는다. 변수의 값을 Write할 때마다 Main Memory에 직접 작성한다. 필요성 멀티 스레드 환경에서 하나의 스레드가 Read&Write 하고 다른 스레드에서 Read 할 때, 해당 변수에 대한 최신 값을 보장한다. 예시 class Object { public int count = 0; } 위 Object를 공유하는 두 개의 스레드 A, B가 있다고 가정하자. 스레드 A는 count의 값을 읽고 1씩 증가시키는 연산(Read&Write)을 하고 스레드 B는 count를 읽는 연산만 수행한다(Read). A는 count값을 ..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAZgxO%2FbtrEYga82j0%2FKExsOvuPhMKL3Rf6XeF0d1%2Fimg.png)
임계 영역 동시접근 해결 방안
Lock 정의 하나의 프로세스 혹은 스레드가 임계 영역(critical section)에 진입할 경우 Lock을 획득하고, 임계 영역에서 빠져나올때 Lock을 되돌려줌으로써 두 개 이상의 프로세스나 스레드가 동시에 임계영역에 진입할 수 없도록 하는 방법이다. 문제점 A라는 스레드가 Lock 함수를 실행하다 변수의 값을 변경하기 전에 인터럽트가 발생하여 값을 변경하지 못하고 B 또는 다른 스레드가 추가로 Lock 함수에 들어오면 두 개의 스레드가 임계 영역에 동시 접근해버리는 상황이 발생한다. 해결방법 더 이상 쪼개지지 않는 하드웨어 명령어로 구현, 인터럽트를 disalbe 하고 enable 하는 방법이 있다. Semaphore 정의 세마포어는 '수기 신호' 라는 뜻으로 프로세스의 동기화 도구이다. 세마포..