1. 데이터 타입 분류
데이터타입 |
기본 타입 (primitive type) |
정수타입 | byte |
char | |||
short | |||
int | |||
long | |||
실수타입 | float | ||
double | |||
논리타입 | boolean | ||
참조 타입 (reference type) |
배열 타입 | ||
열거 타입 | |||
클래스 | |||
인터페이스 |
-기본 타입(primitive type)
: 정수, 실수, 문자, 논리 리터럴을 저장하는 타입으로 선언된 변수는 실제 값을 변수 안에 저장한다.
-참조 타입(reference type)
: 객체(Object)의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스 타입을 말하고, 이를 이용해 선언된 변수는 메모리의 번지를 값으로 갖는다.
참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null(널) 값을 가질 수 있다.
/* 기본 타입 변수 */
int age = 5;
double weight = 4.5;
/* 참조 타입 변수 */
String name = "박알콩";
String hobby = "산책"
->age와 weight는 직접 값을 저장하고 있지만 String 클래스 변수인 name과 hobby는 힙(heap) 영역의 객체 주소 값을 가지고 있다.
2. 메모리 사용 영역
: java.exe로 JVM이 시작되면 JVM은 운영 체제로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받는다.
-메소드(Method) 영역
: 자바 프로그램에서 사용되는 클래스에 대한 정보와 함께 클래스 변수가 저장되는 영역이다.
JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일 (*. class)를 읽어 들여, 해당 클래스에 대한 정보를 메소드 영역에 저장한다.
-힙(Heap) 영역
: 객체와 배열이 생성되는 영역으로 자바 프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역이다.
힙 영역에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조하는데 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 이것을 쓰레기 취급하고 JVM은 쓰레기 수집기(Garbage Collector)를 실행시켜 힙 영역에서 자동으로 제거한다.
힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
- 스택(Stack) 영역
: 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역이다.
스택 영역은 각 스레드마다 하나씩 존재하며 스레드가 시작될 때 할당되며, 스택 영역은 푸시(push) 동작으로 데이터를 저장하고 팝(pop) 동작으로 데이터를 인출한다. 이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작한다.
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
char v1 = 'A'; // 스택 영역에는 v1만 존재
if(v1 == 'A'){ // 스택 영역에는 v1, v2, v3가 존재
int v2 = 100;
double v3 = 3.14;
}
boolean v4 = true; // 스택 영역에는 v1과 v4만 존재
int scores[] = {50, 60, 70}; // scores는 스택영역에 생성 50, 60, 70을 갖는 배열은 힙 영역에 생성
※참조 변수의 ==, != 연산
: 기본 타입 변수의 ==, != 연산은 변수의 값이 같은지, 아닌지를 조사하지만 참조 타입 변수들 간의 ==, != 연산은 동일한 객체를 참조하는지, 다른 객체를 참조하는지 알아볼 때 사용된다.
3. String 타입
: 문자열은 String 객체로 생성되고 변수는 String 객체를 참조한다.
String name1 = "박알콩";
String name2 = "박알콩";
String name3 = new String("박알콩"); // new를 이용해 새로운 String 객체 생성
-> name1과 name2는 동일한 문자열 리터럴로 생성된 객체를 참조하기 때문에 name1 == name2는 true이지만 name3은 new 연산자로 String 객체를 별도로 생성했기 때문에 name2 == name3는 false이다.
※equls() 메소드
: 동일한 String 객체이건 다른 String 객체이건 상관없이 문자열을 비교할 때 사용하는 String 객체의 메소드로 원본 문자열과 매개 값으로 주어진 비교 문자열이 동일한지 비교 후 true/false를 리턴한다.
boolean result = name1.equls(name3); // name1(원본 문자열)과 name2(비교 문자열)를 비교
4. 배열(array)
:같은 타입의 변수들로 이루어진 유한 집합으로 정의할 수 있다. 배열을 구성하는 각각의 값을 배열 요소(element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 한다. 자바에서 인덱스는 0부터 시작하며 0을 포함한 양의 정수만을 가질 수 있다.
-배열 선언
/* 첫번째 방법 */
int[] intArray;
double[] doubleArray;
String[] strArray;
/* 두번째 방법 */
int intArray[];
double doubleArray[];
String strArray[];
-> 대괄호 []는 배열 변수 선언 기호로 사용되는데, 타입(데이터의 타입) 뒤에 붙을 수도 있고 변수 뒤에 붙을 수도 있다.
-배열 생성
int[] intArray = { 1, 4, 6, 7, 10 }; // 데이터타입[] 변수 = { 값0, 값1, 값2, ... };
-> 중괄호 {}는 주어진 값들을 항목으로 가지는 배열 객체를 힙에 생성하고, 배열 객체의 번지를 리턴한다.
int[] intArray = new int[3]; // 타입[] 변수 = new 타입[길이];
intArray[0] = 1; // 인덱스를 이용한 배열의 초기화
intArray[1] = 3;
intArray[2] = 10;
intArray[4] = 21; // ArrayIndexOutOfBounds 예외 발생
-> 값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들 경우에는 길이를 지정하여 생성해준다.
intArray는 intArray[0]부터 intArray[2]까지 3개의 값이 저장될 수 있는 공간을 확보하고, 타입의 기본값으로 저장된다.
※배열 객체 생성 시 주의할 점
: 배열 변수를 이미 선언한 후에 다른 실행문에서 중괄호를 사용한 배열 생성 불가하다.
int[] intArray;
intArray = { 10, 20, 30, 40, 50 }; // 컴파일 에러
intArray = new int[] { 10, 20, 30, 40, 50 }; // new 연산자를 사용
->배열 변수를 이미 선언한 후, 값 목록들이 나중에 결정되는 상황일 경우 new 연산자를 사용해서 값 목록 지정해준다.
마찬가지로 메소드의 매개값이 배열일 경우에도 new 연산자를 사용해야 한다.
-배열 길이
: 배열에 저장할 수 있는 전체 항목 수를 말한다. 배열 length 필드를 읽기 위해서는 배열 변수에 도트(.) 연산자를 붙이고 length를 적으면 된다.
int[] intArray = { 10, 20, 30 };
int num = intArray.length; // 3 저장
-> length는 읽기 전용 필드이기 때문에 값을 바꿀 수 없다.
-다차원 배열(multi-demenstional array)
: 2차원 이상의 배열을 의미하며, 값들이 행과 열로서 구성된 배열을 2차원 배열이라고 한다.
-다차원 배열 선언
/* 2차원 배열 선언 방법 */
int[][] intArray; // 타입[][] 배열이름
double doubleArray[][]; // 타입 배열이름[][]
String[] strArray[]; // 타입[] 배열이름[]
int[][] scores = new int[2][3]; // 2x3 행렬을 만들기 위한 코드
※배열의 선언과 동시에 초기화 하는 방법
int[][] intArray = {
{ 10, 20, 30 },
{ 40, 50, 60 }
}
-배열 복사
: 배열은 한 번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하면 보다 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야 한다.
배열을 복사하는 방법으로는 for문을 사용하거나 System.arraycopy() 메소드를 이용하는 방법이 있다.
1. for문
int oldIntArray[] = {1, 2, 3};
int newIntArray[] = new int[5];
for(int i=0; i <oldIntArray.length; i++){
newIntArray[i] = oldIntArray[i];
}
for(int i=0; i <newIntArray.length; i++){
System.out.println(newIntArray[i] + ", ");
}
2. System.arraycopy()
String[] oldStrArray = { "java", "array", "copy" };
String[] newStrArray = new String[5];
// ( 원본 배열, 원본 배열에서 복사할 항목의 시작 인덱스, 새배열, 붙여넣을 시작 인덱스, 복사할 개수)
System.arraycopy( oldStrArray, 0, newStrArray, 0, oldStrArray.length );
for(int i=0; i <newStrArray.length; i++){
newIntArray[i] = newStrArray[i];
}
'Programming > JAVA' 카테고리의 다른 글
자바의 접근 제한자 (0) | 2019.12.30 |
---|---|
자바의 클래스 (0) | 2019.12.27 |
BufferedReader, BufferedWriter를 이용한 빠른 입출력 (0) | 2019.12.20 |
자바의 제어문 (조건문과 반복문) (0) | 2019.12.19 |
자바의 연산 (0) | 2019.12.17 |