728x90
데이터 타입의 분류
- 프로그램은 자료구조(데이터)와 알고리즘의 결함으로 이루어져 있다.
- 즉 프로그램이란 자료구조를 통해 데이터를 구성하고, 표현하며 알고리즘을 통해 문제를 해결
- 데이터 타입에는 크게 기본타입(primitive type)과 참조타입(reference type)으로 분류
- 기본타입은 정수, 실수, 문자, 논리 리터럴을 지정
- 참조타입은 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스 인터페이스 타입
기본타입(Primitive type)
- java에서 기본 데이터 타입이란 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입
- 정수 타입에는 byte, char, short, int, long / 실수 타입에는 float, double / 논리 타입에는 boolean
오버플로우(overflow)현상
- 변수가 사용할 수 있는 값의 범위를 초과하게 되면 오버플로우(overflow)현상이 발생
- 아래 그림을 보면 byte변수에 127의 값이 넣어져있다. 거기서 1을 더 하면 128이 되어야 하지만 오버플로우가 발생하면서 -128이 된다. 값의 범위가 -128 ~ 127인데 128은 범위에 초과 되기 때문에 -128이 된 것이다.
참조타입(Reference type)
- java에서 참조타입(reference type)이란 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 말한다.
- 기본타입과 참조타입의 차이는 저장되는 값이 무엇인가?
- 기본타입은 실제 값을 변수에 저장
- 참조타입은 선언된 변수를 메모리에 번지 값으로 갖게 된다.
- 기본 데이터 타입은 스택영역에 생성 / 참조 데이터 타입은 힙영역에 생성
메모리 사용 영역
- 프로그램(java.exe)을 실행하면 JVM(Java Virtual Machine)이 실행이 된다.
- JVM은 운영체제에서 할당받은 메모리영역(Runtime Data Area)을 메소드영역(Method Area), 스레드영역(Thread Area), 힙영역(Heap Area)과 같이 세부 영역으로 구분을 해서 사용
메소드 영역(Method Area)
- 메소드영역은 코드에서 사용되는 클래스들을 class load로 읽어 클래스 별로 런타임 상수 풀, 필드 / 메소드 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장
- 메소드 영역은 JVM이 시작될 때 생성되고 모든 스레드가 공유하는 영역
힙영역(Heap Area)
- 힙영역은 객체와 배열이 생성되는 영역
- 힙영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다.
- 참조하는 변수나 필드가없다면 의미없는 개체가 되기 때문에 이것을 쓰레기 취급하고 JVM은 Garbage Collector를 실행시켜 쓰레기 객체를 힙 영역에서 자동으로 제거
JVM 스택영역(Stack Area)
- JVM 스택영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당
- 자바 프로그램에서 추가적으로 스레드를 생성하지 않는다면 main 스레드만 존재하므로 JVM 스택도 하나
- JVM 스택은 메소드를 호출할때 마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거하는 동작을 수행
- 프레임 내부에는 로컬 변수 스택이 있는데 기본 타입변수와 참조 타입변수가 추가되거나 제거
- 변수는 선언된 블록안에서만 스택으로 존재하고, 블록을 벗어나면 스택을 제거
- 이는 메소드 if문,for문등에서 내부에서 생성된 변수는 해당 로컬 변수 스택에만 존재하여 구문을 빠져 나오게 되면 제거가 되어 외부에서는 사용이 불가능 하다는것을 말한다.
- 다만 배열 같은 경우에는 배열의 변수는 스택영역에 생성되지만 배열의 데이터 자체는 Heap영역에 생성되어 제거되지 않는다. 즉 Java에서는 배열은 객체로 취급을 한다.
728x90
'프로그래밍 > java' 카테고리의 다른 글
[Java] 의존성(Dependency) (0) | 2023.12.13 |
---|---|
[Java] Reflection (0) | 2023.12.12 |
[Java] ==, equals() 차이점 (0) | 2023.12.08 |
[Java] 얕은복사 VS 깊은복사 (0) | 2023.12.07 |
[Java] 파일 ZIP압축 (0) | 2023.12.06 |