[오늘 공부한 부분]
1. Java 참조 타입과 참조 변수
2. Java 배열
1. 참조 타입
- 참조 타입(reference type) : 객체(object)의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스를 말한다.
- 기본 타입(primitive type)인 byte, char, short, int, long, float, double, boolean 변수는 실제 값을 변수 안에 저장한다.
- 하지만 참조 타입 변수는 메모리의 번지를 변수 안에 저장한다. = 번지를 통해 객체를 참조한다는 뜻 !
- 정리하자면, 기본 타입의 변수와 객체는 스택 영역에 한번에 저장되고, 참조 타입은 변수는 스택영역에 그리고 객체는 힙 영역에 저장된다고 생각하면 된다.
2. 메모리 사용 영역(Runtime Data Area)
※ Some of the memory areas allocated by JVM are:
1. ClassLoader : It is a component of JVM used to load class files.
2. Class (Method) Area : It stores per-class structures such as the runtime constant pool, field and method data, and the code for methods.
3. Heap : Heap is created a runtime and it contains the runtime data area in which objects are allocated.
4. Stack : Stack stores local variables and partial results at runtime. It also helps in method invocation and return value. Each thread creates a private JVM stack at the time of thread creation.
5. Program Counter Register : This memory area contains the address of the Java virtual machine instruction that is currently being executed.
6. Native Method Stack : This area is reserved for all the native methods used in the application.
① 메소드 영역 (Method Area) : JVM이 시작할 때 생성, 모든 스레드가 공유하는 영역
② 힙 영역 (Heap Area) : 객체와 배열이 생성되는 영역. 객체를 참조하는 변수나 필드가 없다면 그 객체를 쓰레기로 취급하고 쓰레기 수집기(Gabage collector)를 실행시켜 자동으로 제거한다. 따라서 개발자는 따로 객체를 제거할 필요가 없다.
③ JVM 스택 영역 (JVM Stack) :
- 메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행.
- 변수는 선언된 블록 안에서만 스택에 존재하고 블록을 벗어나면 스택에서 제거된다.
- 기본 타입 변수는 스택 영역에 직접 값을 가지고 있지만, 참조 타입 변수는 스택 영역에 힙 영역의 객체 주소를 가진다.(다시 한번)
3. 참조 변수의 ==, != 연산
- 기본 타입 변수의 ==, != 연산은 변수의 값이 같은지 아닌지를 조사하지만
- 참조 타입 변수의 ==, != 연산은 동일한 객체를 참조하는지 다른 객체를 참조하는지 알아볼 때 사용된다.
- 참조 타입 변수 값 = 힙 영역 객체의 주소 (따라서 번지 값을 비교하는 것.)
4. null 과 NullPointerException
- null(널) 값 : 참조 타입의 변수가 힙 영역의 객체를 참조하지 않는다는 뜻
- null 값도 초기값으로 사용할 수 있기 때문에, null로 초기화된 변수는 스택 영역에 생성된다.
- 예외(Exception) : 자바 프로그램 실행 도중 발생하는 오류
- NullPointerException는 가장 많이 발생하는 예외 중 하나 - 참조 변수를 잘못 사용했을 때 발생!
예를 들면, 참조 변수의 값이 null이라면 객체가 존재하지 않기 때문에 필드나 메소드를 사용하는 코드를 실행하면 발생한다.
int[] intArray = null;
intArray[0] =10; // NullPointerException 발생 !
String[] str = null;
System.out.println("총 문자수:" + str.length()); //NullPointerException 발생 !
5. String 타입
- 자바는 문자열 리터럴(값)이 동일하다면 String 객체를 공유하도록 되어있다.
- 만약 문자열이 같은 새로운 객체를 만들고 싶다면 객체 생성 연산자인 new 연산자를 사용한다.
- 아래의 예시와 같이 문자열 리터럴로 생성하느냐 new 연산자로 생성하느냐에 따라 비교 연산자의 결과는 달라진다.
- 동일한 String 객체이건 다른 String 객체이건 상관 없이 내부 문자열을 비교하고 싶을 때에는 equals()메소드를 사용한다.
String name1 = "신용권";
String name2 = "신용권";
String name1 == String name2 (true)
String name3 = new String("신용권");
String name4 = new String("신용권");
String name1 == String name2 (false)
String name3 == String name4 (false)
name3.equals(name4) (true) // 문자열 값 자체는 같기 때문에 !
※ equals() vs hashCode() vs System.identityHashCode() 비교
- equals() : equel은 두 객체의 참조값을 비교하는 Method
- hashCode() : 객체의 해시코드(정수로 구성된 주소값)를 반환하는 Method, 객체의 주소를 int로 변환해서 반환한다. 그러나 문자열이 같은 경우 같은 정수값을 도출한다.
- System.identityHashCode() : 객체 번짓수 값을 확인해주는 Method. 객체 자체를 비교하려면 이 메소드를 사용하는 것이 좋다.
[정리 !]
- String 타입의 변수가 서로 다른 객체를 가지더라도 문자열만 같으면 hashCode() 값이 같다.
- String 타입 변수의 주솟값 즉, 번짓수는 System.identityHashCode()를 통해 분별할 수 있으므로, 이 함수를 적용해야 서로 다른 객체를 갖고있는지 판단 할 수 있다.
Object's hashCode() method does not have a unique value for each object because it can be overridden in subclasses. This method can be overridden to express that the properties of the objects are the same. For example, if the hashcode of a String is, it means that the string is the same even if the objects are different.
On the other hand, System.identityHashCode() cannot be overridden and returns a unique hashCode of the object. It is recommended to use this method if you want to compare the objects themselves.
[ 출처 ]
https://codechacha.com/ko/java-hashcode/
https://codechacha.com/en/java-system-identityhashcode/
'Coding > Java' 카테고리의 다른 글
[08] Java 열거 타입 (0) | 2022.11.12 |
---|---|
[07] Java 배열 (0) | 2022.11.11 |
[05] Java 조건문과 반복문 (0) | 2022.11.11 |
[04] Java 연산자와 연산 (0) | 2022.11.11 |
[03] Java 시작하기(설치), 변수와 타입 (1) | 2022.11.11 |