-- volatile --
- 변수를 선언할 때 앞에 volatile을 붙이면, 컴파일러는 해당 변수를 최적화에서 제외하여 항상 메모리에 접근하도록 한다.
- 즉, volatile 변수를 참조할 경우 레지스터에 로드된 값을 사용하지 않고 매번 메모리를 참조한다.
*(unsigned int *)0x8C0F = 0x8001;
*(unsigned int *)0x8C0F = 0x8002;
*(unsigned int *)0x8C0F = 0x8003;
*(unsigned int *)0x8C0F = 0x8004;
*(unsigned int *)0x8C0F = 0x8005;
위 코드를 부면 5번의 메모리 쓰기가 모두 같은 주소인 0x8C0F에 이루어짐을 알 수 있다. 따라서 이 코드를 수행한 수에는 최종적으로 0x8C0F 주소에 0x8005값만 남아있을 것이다. 이 경우 컴파일러는 최적화를 위해 이전의 코드를 실행 안하고 맨 마지막 코드만 실행 시키는데, 일반적인 코드라면 이런 최적화를 통해 수행 속도 면에서 이득을 보게 된다.
-- final --
원시타입 : 로컬 원시 변수에 final로 선언하면 한번 초기화된 변수는 변경할 수 없는 상수값이 된다.
public void test_final_primitive_variables() {
final int x = 1;
//x = 3; //한번 assign되면 변경할 수 없음.
}
객체타입 : 그 변수에 다른 참조 값을 지정할 수 없다.
public void test_final_reference_variables() {
final Pet pet = new Pet();
// pet = new Pet(); //다른 객체로 변경할수 없음
pet.setWeight(3); //객체 필드는 변경할 수 있음
}
메서드인자 : 메소드 안에서 변수값을 변경 할 수 없다.
public class Pet {
int weight;
public void setWeight(final int weight) {
// weight = 1; //final 인자는 메서드안에서 변경할 수 없음
}
}
static이냐 아니냐에 따라, 초기화 시점이 달라집니다.
'개발언어 > JAVA' 카테고리의 다른 글
안드로이드 fragment 생명주기 tag 넣기 (0) | 2022.02.18 |
---|---|
MVVM 패턴 (0) | 2021.06.20 |
안드로이드 메모 + 음성녹음 앱 (2) | 2021.03.13 |
안드로이드, 자바 개념 정리2 (0) | 2021.02.09 |
운영체제 6(FCFS, RR) (0) | 2021.01.27 |