JRE: 자바 실행 환경
JDK: 자바 실행과 개발을 할 수 있는 환경
JVM
자바는 8개의 데이터 타입(boolean, byte, short, int, long, float, double, char)을 제외한 나머지는 모두 객체로 객체형 데이터로 객체형 데이터는 모두 힙 메모리에서 생성되서 관리된다. 객체형 데이터의 기본값은 NULL값이고 매개변수로 객체형이 전달된 경우 Call by Reference라는 방식으로 동일한 데이터 위치에 대한 값의 접근이 가능하다. 반면에 8개의 기본형 데이터의 경우 Call by Value라는 방식으로 매개변수가 전달되고 새로운 데이터가 할당되어 동일한 값만 저장되는 형태이기 때문에 서로 다른 데이터 위치에 접근하는 상황이다. 따라서 사용에 유의하여 동일한 데이터에 접근하는 과정을 의도한 경우 Wrapper Class를 사용해야 된다.
자바의 경우 String 한 번 값이 결정되면 값을 변경할 수 없는 immutable하기 때문에 +연산을 수행할 때마다 Constant Pool에 새로운 String객체가 생성되기 때문에 StringBuffer 객체를 생성한 후 append연산을 통해 mutable하게 사용이 가능하지만 일반 String보다 메모리 사용량이 많고 속도도 느리기 때문에 변경이 많은 경우에만 사용을 하는 것이 유리하다.
StringBuffer와 비슷한 StringBuilder의 경우 동일한 사용방법이지만 성능이 우수하기 때문에 멀티 스레드 환경에서 안전성을 고려해야 되는 경우에는 StringBuffer를 사용하고 동기화를 고려할 필요가 없는 상황에서는 StringBuilder를 사용하는 것이 유리하다.
String Literal로 생성을 하게되면 Constant Pool에 생성이 되고 동일한 문자열을 생성한 경우 데이터를 재사용하기 때문에 메모리 절약이 되지만 new를 이용한 생성은 동일한 문자열이어도 각자 다른 힙 메모리에 할당이 된다.
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s3 = new String("hello");
s1 == s2; //동일한 데이터 주소를 가르키기 때문에 true
s3 == s4; //서로 다른 힙데이터에 할당되기 때문에 false
자바 객체의 최상위 객체로 모든 객체들이 상속하고 있어 아래의 메소드 역시 모든 객체가 호출이 가능하다.