상수(constant)

  • final 키워드 사용
    • final은 다른 주소를 가리킬 수 없는 것이기 때문에
    • reference type의 변수에서는 그 대상 인스턴스 객체 값 수정 가능
    • final한 참조 타입 변수는 다른 주소를 가리킬 수 없을 뿐, 그 대상 인스턴스 객체의 값을 수정하지 못한다는 의미가 아니다.
    • final 배열은 값 변경, 정렬 가능
  • final int score = 00;
  • 선언과 동시에 초기화 되어야 한다.
  • 상수는 전부 대문자 사용한다 + Snake notation(_ 사용)
    • final int MY_SCORE=100;
  • 1. 변수 앞에 붙으면 상수 처리
  • 2. class 앞에 붙으면 상속 불가능
  • 3. method 앞에 붙으면 오버라이딩 불가능
final class Car { // 이 클래스는 상속을 통해 서브 클래스를 생성할 수 없음.
    final int VAR; // 이 필드는 상수화되어 값을 변경할 수 없음.
    final void brake() { // 이 메소드는 오버라이딩을 통해 재정의할 수 없음.
        final double MAX_NUM = 10.2; // 이 지역 변수는 상수화되어 값을 변경할 수 없음.
    }
}

 

String

  • String class : reference type 
  • primitive type 처럼 사용 가능
// 실행 fn + command + shift + f11
public class Student{
	// fields (변수)
	String stuName; // String -> class -> reference Type -> 문자
	String stuNum; // 학번(00231123) : 연산이 필요하면 int, 아니면 사용하기 편한 String
	int stuAge; // 나이 - 숫
	
	// methods (함수)
	public static void main(String args[]) {
		System.out.println("hello");
	}
}

 

StringBuffer, String, StringBuilder

  • String : 힙 영역에 있는 String Constant pool에 문자열이 저장된다. += 연산을 통하여 새로운 값으로 정의될 때, 기존의 값을 메모리에 유지하고 새로운 메모리 주소에 저장된다.
    • string은 immutable하기 때문에 멀티스레드 환경에서 안전성 보장
  • StringBuffer : 내부적으로 버퍼(buffer)라고 하는 독립적인 공간을 가진다. append를 통하여 새로운 값으로 정의되면, 기존의 값이 있는 주소에 버퍼에 있는 값을 메모리에 저장한다.
    • method별로 동기화 지원 -> 멀티스레드 환경에 적합
  • StringBuilder : StringBuffer와 내부 동작은 동일하지만, 동기화 보장 X
@Override
@IntrinsicCandidate
public StringBuilder append(String str) {
    super.append(str);
    return this;
}

@Override
@IntrinsicCandidate
public synchronized StringBuffer append(String str) {
    toStringCache = null;
    super.append(str);
    return this;
}

 

String 생성 방식 

  • 1. new 연산자
  • 2. 리터럴
    • String Constant pool(상수 풀)
      • Java 8부터 Perm(Permanent Generation) 영역에서 Heap 영역으로 이동
      • Java 8부터 Perm 영역 삭제 후 MetaSapce 영역이 대신하고 있다.
      • Perm 영역은 실행 시간(Runtime)에 가변적으로 변경할 수 없는 고정된 사이즈이기 때문에 intern 메소드 호출은 저장할 공간이 부족하게 만들 수 있었다. -> out of memory
        • intern() : String 클래스의 메소드. String과 동등한 객체가 이미 상수풀에 존재하면 그 객체를 그대로 리턴한다.
      • heap 영역으로 들어가게 된 상수풀은 Garbage Collection의 대상이 되었다.

 

+ Recent posts