본문 바로가기

Programming/JAVA

자바의 참조 타입과 배열

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[];	// 타입[] 배열이름[]

 

2 x 3 행렬 구조

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