자바의 타입 : 자바의 데이터 타입은 크게 기본타입과 정수타입으로 구분되며 기본타입은 정수, 실수, 논리리터럴을 저장하는 타입니다. 반면에 참조타입은 객체으 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스가 있다. 기본 타입 변수와 참조타입 변수의 차이는 저장되는 값이 무엇인지에 따라 결정된다.
기본타입 변수 : 실제 값을 변수 안에 저장한다. int age = 25; double price = 100.5;
참조타입 변수 : 메모리의 번지를 변수 안에 저장한다. String name = "김땡땡" String hobby = "음악 감상"
메모리 사용 영역 : JVM은 운영체제에서 할당받은 메모리 영역을 메소드 영역, 힙 영역, 스택 영역으로 구분해서 사용한다.
메소드 영역 : JVM이 시작할 때 생성되는 모든 스레드(스레드 : 실제로 작업을 수행하는 주체. class 틀을 스레드라고 볼 수 있음)가 공유하는 영역. 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 정적 필드/상수, 메소드 코드, 생성자 코드 등을 분류해서 저장한다.
힙영역 : 객체와 배열이 생성되는 영역(위 예시에서 String객체 "김떙땡", "독서"). 생성된 객체와 배열은 JVM스택영역의 변수나 다른 객체의 필드에서 참조한다. 만약 참조하는 필드나 변수가 없다면 JVM이 쓰레기 취급하고 자동으로 제거한다.
JVM 스택 영역 : JVM스택은 메소드를 호출할 때마다 프레임이 생성되고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행한다. 프레임 내부에는 로컬변수 스택이 있는데, 기본타입 변수와 참조타입 변수가 추가되거나 제거된다. 스택 영영에 변수가 생성되는 시점은 초기화가 될 때이며 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다. 기본타입 변수는 스택 영역에 직접 값을 가지고 있지만, 참조 타입 변수는 스택 영역에 힙 영역의 객체 주소를 가진다. 위 예시에서 스택 영역 안에 참조타입변수는 힙영역의 주소인 name은 1, hobby는 2라는 값을 가지지만 기본타입변수는 스택영역에 price = 1000과 같이 직접 값을 저장하고 있다. 이처럼 번지를 통해 객체를 참조하기 때문에 String변수를 참조 타입 변수라고 한다.
참조변수의 ==, != 연산 : ==, !=연산은 은 기본타입에서는 변수의 값을 비교하지만, 참조타입에서는 동일한 객체를 참조하는지를 비교한다. 동일한 번지값을 가지고 있다면 동일한 객체를 참조하고 있다는 의미이다. ex) if(refer1 == refer2...){...}
null : 참조타입변수는 객체를 참조하지 않는다는 뜻으로 null 값을 가질 수 있다. null값도 초기값을 사용할 수 있기 때문에 null로 초기화된 변수는 스택 영역에 생성된다.
NullPointException : 자바는 프로그램 실행 도중 발생하는 오류를 예외라고 한다. 참조 변수가 null을 가지고 있을 경우, 참조객체가 없기 때문에 변수를 통해서 객체를 사용할 수 없다. 만약 null 상태에서 존재하지 않는 객체의 데이터나 메소드를 사용하는 경우 NullPointException이 발생한다. ex) int[] intArray = null; //배열변수 -> 참조변수이므로 null로 초기화 가능. intArray[0] = 10; //intArray[0]dp 10을 저장하려고 하면 참조하는 배열객체가 없기 때문에 NullPointException 발생
String 타입 : String객체를 통해서 문자열이 생성되고 변수가 String객체를 참조하는데 이를 String변수에 문자열을 저장한다고 표현한다. 자바는 문자열 리터럴이 동일하면 String 객체를 공유하도록 되어있다. ex) String name1 = "김땡땡" String name2 = "김땡땡" -> 동일한 String객체 참조
new 연산자 : 객체생성연산자로 힙 영역에 새로운 String객체를 생성한다. 일반적으로 변수를 저장할 때 문자열 리터럴을 사용하지만, new 연산자를 사용해서 직접 String객체를 생성시키기도한다. ex) String name1 = "김땡땡" String name2 = "김땡땡" String name3 = new String("김땡땡") -> name1==name2; true name1==name3; false
equals()메소드 : String객체에 상관없이 문자열을 비교하고 싶을 때 사용한다. ex) boolean result1 = str.equals(str2); true boolean result2 = str.equals(str3); true
String변수의 초기값 null : null은 참조하는 객체가 없다는 뜻이다. 변수가 String객체를 참조한 뒤 변수에 null값을 대입하면 더이상 String객체를 참조하지 않게된다. 이후 JVM이 참조되지 않은 객체를 쓰레기 객체로 취급하여 쓰레기 수집기를 통해서 메모리에서 자동으로 제거한다.
publicstaticvoid main(String[] args) { String hobby = "여행"; System.out.println(hobby.length()); // 실행결과 : 2 hobby = null; //자바가 한가할 때 또는 메모리가 부족할 때 자바가 쓰레기 객체를 제거 } 실행결과 :