상수(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의 대상이 되었다.
- String Constant pool(상수 풀)
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 클래스, 상속, 동적 바인딩, 추상 메소드, 인터페이스, super (1) | 2022.10.03 |
---|---|
[Java] 형변환(Casting), static(클래스 변수, 메소드), this (0) | 2022.10.03 |
[Java] 자바 프로그램 실행 과정, JVM, 가비지 컬렉터(GC) (2) | 2022.10.03 |
[Java] 자바 - call by value & reference, 자바 특징, Java 8, primitive &reference type (1) | 2022.10.03 |
[Java] 접근 제어자, 래퍼 클래스, 제너릭, 컬렉션, 스트림, 람다식, Optional (0) | 2022.10.02 |