-
java transient / volatile / instanceof / native / assert대학/객체지향프로그래밍 2022. 12. 9. 22:12
- transient
자원에 대한 특별한 키워드로 오브젝트를 디스크에 저장,
또는 객체를 바이트 스트림으로 변환(직렬화)해 네트워크로 전송시 특정 변수를 제외한다.
class T { transient int a; int b; }
이 코드의 경우 a가 있다는 것은 알려줄 수 있지만, a에 어떤 값이 저장되었는지는 알려주지 않는다.
- volatile
지정된 변수가 스레드에 의해 변경될 수 있음을 표시한다.
public class SharedObject { public int counter = 0; }
기본적으로 메모리의 counter을 cpu cache에 복사한 후 스레드는 이 cpu cache에 접근한다.
따라서 두 개의 스레드는 각각 counter 복사본에 접근하기 때문에
실제 메모리에 값을 쓸 때 충돌이 발생하여 레이스 컨디션이 발생할 수 있다.
public class SharedObject { public volatile int counter = 0; }
하지만 volatile 키워드 사용시 counter를 cpu cache에 저장하지 않고 메모리에서 값을 직접 읽어오기 때문에
레이스 컨디션이 발생하지 않는다.
volatile, synchronized 모두 thread safety에 관한 키워드지만,
synchronized은 실행 제어의 관점에서 안전을 보장하지만,
volatile은 메모리 가시성의 관점에서 안전을 보장한다.
- instanceof
런타임에 오브젝트의 타입을 알고싶을 때 사용하는 예약어
class A { int i, j; } class B { int i, j; } class C extends A { int k; } class D extends A { int k; } class InstanceOf { public static void main(String[] args) { A a = new A(); B b = new B(); C c = new C(); D d = new D(); a instanceof A; // true b instanceof B; // true c instanceof C; // true c instanceof A; // true: A a = new C() 가능. a instanceof C; // false: C c = new A() 불가능. A ob = d; // A reference to d ob instanceof D; // true (ob는 A클래스의 참조 변수일 뿐, D클래스를 가리키고 있다) ob = c; // A reference to c ob instanceof D; // false (C - D는 관계 없음) ob instanceof A; // true (ob는 A클래스의 참조 변수일 뿐, C클래스를 가리키고 있다. C는 A를 상속) a instanceof Object; // true b instanceof Object; // true c instanceof Object; // true d instanceof Object; // true } }
objref instanceof type
objref가 type클래스인 경우(타입이 같을 때), type으로 캐스팅 가능한 경우(자식-부모 상속 관계일 때) true.
- native
java에서 구현 못하는 기능을 외부 라이브러리에서 동적으로 링크하여 사용하는 경우
public native int meth();
meth()는 외부에서 구현(.dll)하여 링크 시켜줘야 함.
- assert
주어진 조건식이 참이 되는지 검사 (c에서와 동일한 기능 수행)
assert condition;
condition이 true가 되야 통과하고, false시 AssertionError 예외 발생
assert를 사용하려면 런타임에 -ea 옵션을 줘야 함.
$ java -ea program
'대학 > 객체지향프로그래밍' 카테고리의 다른 글
java generic(2) (0) 2022.12.10 java generic(1) (0) 2022.12.09 java I/O (0) 2022.12.09 java 열거형 / 박싱 / 어노테이션 (0) 2022.12.09 java 멀티스레딩 (2) 2022.10.18