-개요
JAVA의 타입은 크게 기본 타입(Primitive Type)과 참조 타입(Reference Type)으로 나눌 수 있다.
- 기본 타입(Primitive Type)
- 실제의 값을 변수 안에 저장한다.
- 정수 타입 : byte, char, short, int, long
- 실수 타입 : float, double
- 논리 타입 : boolean
- 참조 타입(Reference Type)
- 실제값이 변수 안에 저장되는 것이 아니라 변수 안에는 실제값이 있는 메모리의 주소를 저장한다.
- 기본 타입을 제외한 모든 타입을 참조 타입이라고 한다.
- 배열, 열거, 클래스 등이 있다.
-메모리 사용 영역
JAVA에서는 메모리를 7개의 영역으로 나눈다. 그중 가장 많이 사용되는 메모리 영역이 3가지 있다.
런타임 환경에서 코드를 실행하면서 코드가 스택에 쌓이고 인스턴스 생성 시 힙 영역에 저장이 되며 인스턴스의 constructor, method 등을 사용할 때 메서드 영역의 클래스의 내용이 불러와진다.
- 메서드(Method)
- JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역
- 클래스
- 정적 필드
- 상수
- 생성자
- 메서드
- 코드 등을 분류해 클래스별로 저장
- 클래스
- 힙(Heap)
- 객체와 배열이 생성되는 영역 / new로 인스턴스 생성 시 힙 영역에 저장이 된다.
- 기본자료형을 제외한 모든 자료형(Reference Type)이 이곳에 생성된다.
- JVM 스택(Stack)
- 메서드가 호출되면 프레임이 추가되고, 메서드가 종료되면 프레임이 제거된다
- 자료구조의 스택과 동일하게 생각하면 된다.
-연산
참조변수의 연산 시 ==,!= 할 때 원하는 결괏값이 나오지 않을 것이다.
String str1 = "안녕";
String str2 = "안녕";
System.out.println(str1 == str2);
바로 뒤에 포스팅에 나오지만 true를 출력한다.
원하는 결괏값이지만 ==연산의 사용등은 아래와 뒤의 포스팅을 참고하자.
String은 기본 타입 변수가 아니기 때문에 변수에 저장되어 있는 값은 "안녕"이라는 글자 자체가 아닌 "안녕"이 저장되어 있는 주소의 주소 값이다.
그럼 str1과 str2의 보이는 값이 둘 다 "안녕"이므로 같은 주소에 저장이 되어있을까?
아니다 String자체는 다시 작성을 해보면
String str1 = new String("안녕");
String str2 = new String("안녕");
이렇게 작성이 된다. 위의 코드처럼 바로 선언을 하는 것과 new를 사용하는 것은 같은 코드이다.
그렇다면 조금 이해가 될 수도 있다.
str1과 str2는 new키워드가 붙어있다. 그러면 각각 새로 생긴 주소 값이 부여가 될 것이다.
그러면 == 혹은!= 연산자를 사용했을 때 생각한 것과 결과가 다를 것이다.
만약 같은 주소의 "안녕"을 str2에 넣어주고 싶다면
String str1 = "안녕";
String str2 = str1;
이렇게 작성을 해준다면 같은 주소의 값을 가진 str2를 생성할 수 있다. 하지만 이렇게 복사를 한다면 후에 문제가 생길 수도 있다. 나중에 얕은 복사 등을 알아볼 때 다시 보도록 하자
-Null, NullPointerException
Null : 값이 없음을 나타내 줌
NullPointerException : null값을 참조하고 있다는 Erorr
인스턴스 생성 시 new가 아닌 null값을 넣어주게 될 때 NullPointerException이 발생한다.
Random rnd = null;
rnd.nextLine();
널 포인터를 참조하고 있다는 뜻이고 위의 코드와 같이 참조할 객체(인스턴스)가 없는 상태에서 내부의 메서드를 사용하기 위해서 접근을 할 때 오류가 나타난다.
'Back-end > JAVA' 카테고리의 다른 글
12. 참조 타입(Reference Type) - Array 기본 (0) | 2021.06.18 |
---|---|
11. 참조 타입(Reference Type) - String (0) | 2021.06.17 |
9. 반복문(for, while, do-while) (0) | 2021.06.15 |
-컴파일러 에러 (0) | 2021.06.15 |
8. 조건문(if, else, else if, switch) (0) | 2021.06.14 |