[F-Lab 모각코 챌린지 7일차] TIL

JeongheeKim·2023년 6월 7일

TIL

목록 보기
7/66

학습계획


  • 변수마다 scope이 존재하는 이유
  • wrapper타입
  • AutoBoxing
  • java 메모리 모델과 메모리 누수

Today I Learned


❓전역변수를 제외한 나머지 스코프의 변수 종류는 쪼개져 있나?

참조 범위를 줄여서 여러군데서 접근할 경우 발생 할 수 있는 사이드 이펙트를 줄이기 위해

인스턴스 변수의 경우 객체를 생성하는것이라 메모리 점유를 하기때문에 무분별한 객체생성을 피해야한다.

❓final키워드 없이 상수값을 변수로만 선언했다면 어떤 일이 발생할 수 있나?

멀티스레드 환경에서 상수로 선언하지 않은 경우 다른 스레드에서 접근해서 값의 변경이 일어나 변수가 스레드 세이프 하지않을 수 있다.

→ 꼭 멀티스레드 환경이 아니더라도 런타임 시 값에 대한 변경이 이루어 지지 않았다는것을 보장할 수 없다.

❓wrapper타입은 무엇이고 wrapper 타입의 기본값과 기본 자료형의 기본값은?

기본 타입 데이터를 객체 타입으로 포장하는 클래스

클래스 파일이므로 기본값은 null이다.

primitive type을 사용해야하는 경우라면 primitive type을 사용하는것을 권장한다. wrapper타입을 사용했을 경우 NullPointerException에 대한 위험이 있기때문이다. 또한 primitive type은 원시적인 값을 가지고 연산하고 wrapper타입의 경우 객체의 참조값을 들고있다보니 연산이 불가하다. 그렇다면 autounboxing작업을 진행하게되는데 이 또한 객체를 primitive type으로 한번 더 변환하다보니 원시적인값만 가지고 연산하는것보다 시간이 소요하게 된다.

**The Integer class wraps a value of the primitive type int in an object.**
**An object of type Integer contains a single field whose type is int.**

In addition, this class provides several methods for converting an int
to a String and a String to an int, as well as other constants and methods 
useful when dealing with an int.

Integer클래스의 java doc을 봤을때 int → String으로 변환한다는 얘기가 있다. 평소에는 아무생각없이 썼었는데 primitive type → object로 변경하기 때문에 Integer클래스에 구현된거같다.

int intValue = 1;
Integer.toString(intValue);

불필요한 객체 생성을 피하자 예시 : AutoBoxing

  • primitive type → Wrapper 타입으로 변경 : AutoBoxing
  • Wrapper 타입 → primitive type으로 변경 : UnBoxing
  • 기본타입과 박싱된 Wrapper타입을 섞어서 사용하면 변환과정에서 불필요한 객체가 생성 될 수 있다.
private static long sum() {
		Long sum = 0L;
		for (long i = 0; i <= Integer.MAX_VALUE ; i++) {
			sum += i;
		}
		return sum;
	}
	public static void main(String[] args) {
		long start = System.nanoTime();
		long x = sum();
		long end = System.nanoTime();
		System.out.println((end - start) / 1000000 + "ms");//7236ms
		System.out.println(x);

	}
private static long sum() {
		long sum = 0L;
		for (long i = 0; i <= Integer.MAX_VALUE ; i++) {
			sum += i;
		}
		return sum;
	}
	public static void main(String[] args) {
		long start = System.nanoTime();
		long x = sum();
		long end = System.nanoTime();
		System.out.println((end - start) / 1000000 + "ms");//797ms
		System.out.println(x);

	}

java 메모리 모델과 메모리 누수

Memory Consistency & Memory Visibility

  • 메모리 일관성
    • 서로 다른 스레드가 하나의 데이터에 접근할 때 일관적인 상태를 보장하는 속성
      • 메커니즘을 파헤치기 보다는 피하기 방법을 익히는 것이 중요
    • 데이터를 읽을 때 마지막 데이터를 읽지만 아무도 데이터의 일관성을 보장해주지 않음
    • 메모리 일관성 에러
      • 여러 스레드가 동일 데이터를 읽을 때 일관적이지 않은 값을 읽는 경우 발생
      • 대표적인 예시로 int타입의 변수에 대한 증감 연산이 있음
  • 메모리 가시성
    • 멀티스레드 환경에서 한 스레드에서 변경한 값을 다른 스레드에서 언제 보게될지를 정의한것
    • 어떤 스레드에 의해 값이 변경되었을 때 다른 스레드가 가장 최신 값을 읽을 수 있도록 하는 속성
  • final field
    • Final 필드는 별도의 동기화 처리가 필요 없기 때문에 세이프한 불변 객체 구현을 지원하며 JIT 컴파일러는 레지스터에 최종 캐시 값을 유지할 수 있음
    • final필드는 스레드 간 레이스 컨디션 상황에서도 모든 스레드에서 불변으로 간주됨
    • 생성자 호출이 완료되면 객체의 초기화 되었다고 간주 초기화가 완료된 객체의 참조만 볼 수 있는 스레드는 올바르게 초기화 된 final 필드를 볼 수 있음
    • 생성자가 다른 생성자를 연이어 호출한 상황에서 호출된 생성자가 final 필드를 초기화 하면 필드에 초기화는 호출된 생성자가 끝나면서 확장됨

0개의 댓글