1. 기본형, 참조형 변수의 차이
- Java 에서는 Primitive Type과 Reference Type이 있다.
- 기본형(Primitive Type)
- 변수에 값 자체를 저장, Stack 영역에 저장된다.
- 사용하기전 반드시 선언되어야 하며, 초기화 미진행시 기본값이 들어간다
- OS에 따른 저장공간 차이가 발생하지않는다.
- 정수(byte, short, int, long), 실수(double, float), 문자(char), 논리(boolean)
- 참조형(Reference Type)
- 기본형을 제외한 모든것.
- 메모리상에 객체가 존재하는 주소값을 저장, heap영역에 저장된다.
- 클래스, 인터페이스, 배열형 이 있다.
2. JAVA의 String
- Java 에서 Sting 참조변수형은 굉장히 자주 사용되며, 2가지 생성방식을 지님
- new() 연산자를 이용한 방식
- 리터럴을 이용한 방식.
public static void main(String[] args) {
// TODO Auto-generated method stub
String literal = "JAVA";
String object = new String("JAVA");
System.out.println(literal == object);// false
System.out.println(literal.equals(object));// true
}
String 비교
- 위의 코드에서 '==' 비교연산과 String.equals('String') 의 비교연산값이 다른건 확인할수 있다.
- '==' 비교연자는 객체의 주소값을 비교하기 때문에 일반객체처럼 생성된 String 객체와 리터럴방식으로 생성된 String 객체는 주소값이 다르기 때문이다.
- String.equals('String')의 메소드는 문자열의 내용 자체를 비교하기에 true 값이 나온다.
why?
- String을 리터럴로 선언시 내부적으로 String Class의 intern()이라는 메소드가 자동으로 실행된다.
intern() : 주어진 문자열이 String Pool에 존재하는지 검색 후 있다면 주소값을 없다면 새로운 주소값을 반환한다.
String은 왜 불변성인가?
- String Pool 을 활용한 메모리 재사용성
- 보안성 증가 : 메서드의 파라미터를 String 으로 받을시 호출자의 인한 값 변환을 차단한다.
- 동기화 : 객체가 불변성을 띌시 스레드환경에서 안전하기 때문에
- Hashcode Caching : 값이 불변일경우 hash code 또한 1번만연산하면 재사용이가능.
- 성능이 좋음
출처 : https://starkying.tistory.com/entry/why-java-string-is-immutable
String, StringBuilder, StringBuffer 의 차이.
- String :
- 불변성을 가지기 때문에 '+' 연산, concat 연산시 원본이 변경되지않고 새로운 String 객체를 생성한다.
- JDK 1.5부턴 StringBuilder로 변경.
- 문자열연산이 적고, 조회가 많은 상황에서 사용.
- StringBuilder, StringBuffer :
- 공통점
- String과 다르게 가변성이다.
- 문자열연산시 새로운 객체를 생성하지 않고, 처음에 만들어진 객체를 활용해 변경연산을 진행한다.
- 문자열 연산이 자주 발생하는상황에서 유리하다.
- 차이점
- StringBuilder : Thread-Safe 하지 않다. 멀티쓰레드 지원 X
- StringBuffer : Thread-Safe 하다. 멀티 쓰레드 지원 O