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
타입[] 변수;
//예시
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
'Language > [Java] 혼자 공부하는 자바' 카테고리의 다른 글
[혼자공부하는자바] chapter 06-2. 필드 (0) | 2021.07.19 |
---|---|
[혼자공부하는자바] chapter 06-1. 객체 지향 프로그래밍 (0) | 2021.07.19 |
[혼자공부하는자바] chapter 04-2. 반복문: for, while, do-while (0) | 2021.07.18 |
[java] 난수 얻기_Math.random() 메서드 (0) | 2021.07.18 |
[혼자공부하는자바] chapter 04-1. 조건문: if문, switch문 (0) | 2021.07.17 |