Cute Running Puppy

Language/[Java] 혼자 공부하는 자바

[혼자공부하는자바] chapter 05. 참조 타입

R.silver 2021. 7. 18. 17:35
반응형

05-1. 참조 타입과 참조 변수

기본 타입과 참조 타입

기본 타입  참조 타입
byte, char, int, boolean 변수 등등 배열, 열거, 클래스, 인터페이스 변수
실제 값을 변수 안에 저장 메모리의 번지를 변수 안에 저장

참조 타입: 번지를 통하여 객체를 참조한다. 

참조 변수의 ==, != 연산

기본 타입 변수에서 ==, != 연산은 값이 같은지를 판단한다. 

그러나 참조 변수의 ==, != 연산번지 값을 비교하여

동일한 객체를 참조하고 있는지를 판단하는 연산이다.

null과 NullPointerException 

NullPointerException : 참조 타입의 변수를 잘못 사용할 때 발행하는 오류

참조 변수는 초기값으로 null값을 가질 수 있다.

그러나 참조 변수가 null 값을 가지고 있을 때는 변수를 통해 객체를 사용할 수 없다. 

이때 NullPinterException 오류가 발생한다. 

(∵ 참조할 객체가 없으므로)

예시

int [] intArray = null;
intArray [0] = 10;

//intArray를 참조할 객체가 없으므로 오류가 난다. 

String 타입

String 타입 변수에 문자열을 저장하기 위해서는 문자열을 큰따옴표(")로 감싸야 한다.

//String 변수에 문자열을 저장하는 방법
변수 = "문자열";

 

java에서 문자열 리터럴이 동일하다면 같은 String 객체를 공유한다. 

//아래 두 변수의 이름은 다르지만 문자열 리터럴이 동일하므로 같은 String 객체를 참조한다. 
String name1 = "다람쥐";
String name2 = "다람쥐";

//여기서 ==연산자를 사용하여 name1 변수와 name2 변수를 비교한다면 true가 된다. 
//힙 영역에 새로운 객체를 만들고 싶다면 new 연산자를 사용한다. 
//new 연산자를 사용하면 문자열 리터럴이 동일하더라도 다른 객체를 참조하게 된다. 
String name1 = new String("다람쥐");
String name2 = new String("다람쥐");

//여기서 ==연산자를 사용하여 name1 변수와 name2 변수를 비교한다면 false가 된다. 

 

만약 객체가 같은지와 상관없이 내부 문자열을 비교하고 싶다면 

equals() 메서드를 사용하면 된다. 

//name1 변수의 내부 문자열과 name2 변수의 내부 문자열이 같은가?
boolean result = name1.equals(name2);

05-2. 배열

배열이란?

같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여한 자료구조 

배열의 특징

  1. 같은 타입의 데이터만 저장할 수 있다. 
  2. 한 번 생성된 배열의 길이를 변경할 수 없다.

배열 선언 

//배열 변수 선언 방법 1
타입[] 변수;

//예시
int[] intArray;
double[] doubleArray;
//배열 변수 선언 방법 2
타입 변수[];

//예시
int intArray [];
double doubleArray[];

 

참조할 배열 객체가 없다면 배열 변수는 null로 초기화된다. 

배열 변수가 null 값을 가질 때 배열 변수의 값을 읽거나 저장하면 

NullPointerException 오류가 발생한다. 

배열 생성

값 목록을 사용하거나 new 연산자를 사용하여 배열 객체를 생성할 수 있다. 

1. 값 목록으로 배열 생성 

//값 목록으로 배열을 생성하는 방법
타입[] 변수 = {값0, 값1, 값2, ...};

 

<주의>

배열 변수를 이미 선언한 뒤에는 중괄호를 사용하여 배열을 생성할 수 없다. 

//컴파일 에러
타입[] 변수;
변수 = {값0, 값1, 값2, ...}; //변수를 선언한 뒤 중괄호 사용하여 배열 생성 불가 

 

배열 변수를 선언한 뒤 배열을 생성하려면 new 연산자를 사용하면 된다. 

//new 연산자를 사용하여 값 목록을 생성하기 
변수 = new 타입[] {값0, 값1, 값2, ...};

//예시
String[] names = null;
names = new String[] {"다람쥐", "토끼", "강아지"};

2. new 연산자로 배열 생성 

값 목록을 가지고 있지는 않지만 배열을 미리 만들고 싶을 때 사용

//new 연산자로 배열을 생성하는 방법
타입[] 변수 = new 타입[길이];

 

배열 변수가 선언된 뒤 배열을 생성하고 싶다면 new 연산자를 활용하면 된다. 

//배열 변수가 선언된 뒤 new연산자를 사용하여 배열을 생성하는 방법
타입[] 변수 = null;
변수 = new 타입[길이];

//예시
int[] intArray = null;
intArray = new int[3];

배열 길이 

.length를 사용하면 배열을 길이를 알 수 있다. 

//배열의 길이를 받는 방법
배열 변수.length;

//예시
int[] intArray = {1, 2, 3};
int num = intArray.length;

다차원 배열 

//다차원 배열 생성 방법
타입[][] 변수 = {{값1, 값2}, {값1, 값2}};

배열 복사 

배열은 길이를 변경할 수 없다. 

만약 더 큰 저장공간이 필요하다면 새로운 배열을 만들고 이전 배열의 값을 복사해야 한다. 

이때 for 문을 사용하여 배열의 값들을 복사하거나 System.arraycopy() 메서드를 사용하면 배열을 값을 복사할 수 있다.

//System.arraycopy() 메서드 사용하는 방법
System.arraycopy(원본 배열, 복사 시작 인덱스, 새 배열, 붙여넣을 시작 인덱스, 복사할 개수)

예제 1.

1. for문을 사용하여 배열의 값들을 복사하기 

 

public static void main(String[] args) {

	String[] names1 = {"다람쥐", "토끼", "강아지"};
	String[] names2 = new String[5];

	for (int i = 0; i < names1.length; i++)
	{
    	//for 문을 돌며 각 인덱스의 값을 복사
		names2[i] = names1[i]; 
	}

	System.out.print("names2 = ");
	for (int i = 0; i < names2.length; i++)
	{
		System.out.print(names2[i] + ", ");
	}

}

실행 결과 

names2 = 다람쥐, 토끼, 강아지, null, null,

예제 2. 

2. System.arraycopy()로 배열의 값들을 복사하기 

 

public static void main(String[] args) {

	String[] names1 = {"다람쥐", "토끼", "강아지"};
	String[] names2 = new String[5];

	//System.arraycopy() 메서드를 사용하여 
	//names1의 배열의 0번지부터
	//names1,lenght의 수 만큼 복사하여
	//names2의 0번지부터  붙여넣기 
    
	System.arraycopy(names1, 0, names2, 0, names1.length);

	System.out.print("names2 = ");
	for (int i = 0; i < names2.length; i++)
	{
		System.out.print(names2[i] + ", ");
	}

}

실행 결과

names2 = 다람쥐, 토끼, 강아지, null, null,

향상된 for 문

배열이나 컬렉션을 쉽게 처리하기 위해 자바에서 제공하는 for문

루프 카운터 변수와 증감식을 사용하지 않는다. 

//향상된 for문 사용 방법
for (타입 변수: 배열)
{
    실행문;
}

예제

향상된 for문을 사용하여 배열의 값들의 총합을 구하는 코드를 작성하라

작성 코드 

public static void main(String[] args) {

	int[] nums = {1, 2, 3, 4, 5};
		
	int sum = 0;
	for (int num: nums)
	{
		sum += num;
	}
		
	System.out.printf("배열 값의 합: %d\n", sum);
		
}

실행 결과

배열 값의 합: 15

 

반응형