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

JeongheeKim·2023년 6월 5일

TIL

목록 보기
5/66

학습계획


  • java에서는 new 예약어가 아닌 literal 방식으로 String을 생성하는 이유 정리
  • Java 동작 방식 정리 보완
  • 연산자 정리

Today I Learned


❓ java에서는 new 예약어가 아닌 literal 방식으로 String을 생성하는 이유?
https://www.javatpoint.com/java-string

https://www.javatpoint.com/java-string
literal방식으로 String 생성하는 경우 JVM은 stirng constatnt pool을 먼저 체크한다. String객체가 이미 존재한다면, String 인스턴스 참조값이 리턴된다. String 객체가 존재하지 않는다면 String 인스턴스를 constant pool에 생성한다.

자바는 메모리 오버헤드를 줄이기 위해위와 같은 방식을 사용한다.

  • memory overhead

    • 작업을 하기위해 소요되는 처리 시간 및 메모
    • 예) CS에서 A라는 작업을 하기 위해 필요한시간이 10초에다가 부가적인 처리 B까지할 경우 5초가 더 걸린다면 오버헤드가 5초이다.
  • String contant pool(String Intern Pool이라고도 한다)

  • String test = “welcom”이 String constant pool에 객체가 생성되고, 참조값은 stack영역에 저장된다.

    • 아래 코드를 통해 동일한 String 리터럴값에 대해 주소값이 똑같은것을 확인 할 수 있다.

      public class ProfilePrint {
      	public static void main(String[] args) {
      		String s1 = "HelloWorld";
      		String s2 = "HelloWorld";
      		String s3 = "Greeting";
      		String s4 = new String("Greeting");
      		String s5 = "HelloWorld";
      
      		if(s1 == s2) {
      			System.out.println("s1 s2 same instance");
      		}
      
      		if(s3 == s4) {
      			System.out.println("s3 s4 same instance");
      		} else {
      			System.out.println("s3 s4 NOT same instance");
      		}
      	}
      }
      s1 s2 same instance
      s3 s4 NOT same instance
  • String이 immutable하기 때문에 heap space를 많이 차지하는데 String pool을 통해 공간 java heap 공간을 절약할 수 있다.

    (String을 immutable하게 설계해서 효율적으로 사용하기 위해 String contant pool이 생긴거 같다.)

    • String은 immutable하다.
      • multi thread 환경에서 thread-safe하고 synchronized 키워드를 붙일 필요없다.
      • Strings are used in java classloader and immutability provides security that correct class is getting loaded by Classloader. → 이부분은 아직 이해가지않는다..
  • String constant Pool은 HashMap을 사용한다.

  • hashMap의 동일한 버킷에는 동일한 hashcode의 String값이 존재한다.

  • 예전 버전 자바에서는 고정된 사이즈의 pool을 사용하여 “Could not reserve enough space for object heap” 에러를 자주 보았다고 한다.

  • JDK7에서는 constant pool이 permgen space영역에 있었는데, JDK8 main heap 메모리 영역으로 편입되었다.

JAVA 동작방식정리

  1. 작성한 소스파일(.java)를 java 컴파일러(javac)가 바이트코드(.class)로 변환
  2. JVM이 실행되면 바이트코드 실행에 필요한 것들을 클래스 로더가 로딩
    1. 메모리에 로딩된 클래스의 구조, 메서드 등 일련 정보들을 JVM내부에 저장
  3. 로딩된 클래스의 바이트 코드를 JVM의 실행 엔진이 해석, 실행
    1. 인터프리터를 통해 해석과 동시에 실행
    2. 추후에 자주 사용되는 메서드 등을 JIT 컴파일러를 통해 네이티브 코드로 변환
  4. 실행 준비가 모두 완료되면 JVM은 메인 메서드(Entiry Point)를 호출
  5. 호출된 메인 메서드를 실행할 메인 스레드가 생성되며 메인 스레드의 JVM stacks이 생성됨
  6. 그 후 생성된 메인 스레드 JVM stacks에 메인 메서드 스택 프레임이 생성됨
  7. 이후 앱이 실행되며 필요한 시점마다 필요한 처리를 수행하며 메모리 확보 및 데이터 저장
    1. 클래스, 메서드 정보를 Method Area에 저장
    2. Heap에 해당 인스턴스 할당
    3. Frame 생성
    4. JNI 스택 생성
  8. JVM은 실행되는 java 앱에 대해서 메모리, 스레드 등 관리

연산자

  • 기본 자료형 중 boolean을 제외한 나머지 타입에서 연산자 사용이 가능하다.
    연사자 종류수행하는 연산
    +덧셈
    -뺄셈
    *곱하기
    /나누기 (몫)
    %나누기(나머지)
  • 복합 대입 연산자
    연산자 종류수행하는 연산
    +=기존값에 우측항의 값을 더함
    -=기존값에 우측항의 값을 뺌
    *=기존값에 우측항의 값을 곱함
    /=기존값에 우측항의 값으로 나눔
    %=기존값에 우측항의 값으로 나눈 나머지
  • 단항 연산자
    • ++를 앞에 붙이면 변수를 참조하기 전에 1을 더한다.
    • ++를 뒤에 붙이면 변수를 참조 후 1을 더한다.

        public class Increment {
        	public static void main(String[] args) {
        		Increment increment = new Increment();
        		increment.increment();
        	}

        	public void increment() {
        		int intValue = 1;
        		System.out.println(intValue++);//1
        		System.out.println(intValue);//2
        		System.out.println(++intValue);//3
        		System.out.println(intValue);//3
        	}
        }
       
연산자 종류수행하는 연산
+변수 * 1
-변수 * (-1)
++변수 1만큼 증가
변수 1만큼 감소
!boolean 타입에서만 사용 가능. true, false의 결과를 반대로 뒤집는다.

0개의 댓글