본문 바로가기

Languages/JAVA

[JAVA] 자바 자료형 알아보기 #6 - 배열을 이해해보자 / clone() / 확장 for 문 등

자바 데이터 타입들을 알아봅시다 #6 😀


자바에는 무수히 많은 데이터 타입들이 존재합니다. 오늘은 그 중에서도 배열에 대해 알아봅시다.

 

[ 자바 자료형 링크 ]

1. [JAVA] 자바 자료형 알아보기 #1 - byte, short, int, long

2. [JAVA] 자바 자료형 알아보기 #2 - float,double
3. [JAVA] 자바 자료형 알아보기 #3 - boolean
4. [JAVA] 자바 자료형 알아보기 #4 - char, String

5. [JAVA] 자바 자료형 알아보기 #5 - 래퍼 클래스(Wrapper class)


 

배열이란 ,

한가지 타입을 가진 데이터들을 연속된 공간에 저장하기 위한 자료구조입니다.


배열을 선언하는 방법 2가지

  1. 배열에 넣을 데이터를 배열을 선언할때 정의하는 방법
  2. 데이터를 미리 정의하지 않고 배열의 크기만 정의하는 방법

이렇게 두가지가 존재합니다.

 

1. 배열에 넣을 데이터를 배열을 선언할때 정의하는 방법

DataType[] 배열이름 = { 데이터1, 데이터2 , 데이터3 , ... };
int[] nums = {10,20,30,40,50};
double[] nums2 = {10.1,10.2,10.3,10.4,10.5};
boolean[] truth = {true,false,false,true,true};
String[] names = {"이00","김00","최00","박00"};
Speaker[] speakers = {new Speaker(),new Speaker(),new Speaker()}; // 자신이 만든 클래스로도 가능

 

이 방법은 데이터들의 값을 알고 있을때 사용하면 편리합니다.

 

2. 데이터를 미리 정의하지 않고 배열의 크기만 정의하는 방법

DataType[] 배열이름 = new DataType[배열 크기];
int[] nums = new int[5]; // 0으로 초기화
String[] names = new String[10]; // null로 초기화
Car[] cars = new Car[5];

데이터들을 모를때 배열의 크기만 정의하는 방법이 있습니다.


이제 배열을 사용하는 방법에 대해 알아봅시다.

 

배열 값 복사 - clone()

int[] nums = {10,20,30,40,50};

int[] a = nums.clone();
int[] b = nums;

 

clone()을 이해하기 위해 위 a,b의 차이점을 알아봅시다!

 

배열이 만들어지면 각 배열들은 고유의 참조값을(id=*) 가집니다.

위 사진에서 id=18처럼 18이 nums 배열의 참조값입니다.

 

이때 같은 id 값을 가지고 있으면 같은 힙 영역의 공간을 참조하고 있습니다.

메모리 영역까지 이해하긴 복잡하니 그냥 같은 공간을 참조하고 있다고 알고있으면 되겠습니다.

 


int b[] = nums; 부터 살펴봅시다.

int[] nums = {10,20,30,40,50};

int[] b = nums;

nums[0] = 999;

 

 

 

 

int[] b = nums; 까지 실행한 모습입니다.

 

nums와 b가 같은 id를 가지고 있는 것을 볼 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

nums[0] = 999;를 실행하고 난 모습입니다.

 

b와 nums는 같은 공간을 참조하고 있기 때문에 한 곳에서 변경이 일어나면 다른 한 곳에서도 변경이 일어납니다.

 

 nums와 b의 0번째 인덱스가 999로 변경된 것을 볼 수 있습니다.

 

 

 

 

 

 

 


 

int[] a = nums.clone(); 을 봅시다.

int[] nums = {10,20,30,40,50};

int[] a = nums.clone();

nums[0] = 999;

clone은 참조값을 복사한것이 아닌 값을 복사 한 것입니다.

 

 

 

값을 복사한 것이기 때문에 참조값, 즉 id가 다르게 나옵니다.

 

그래서 nums의 값을 바꿔도 a의 값이 바뀌지 않습니다.

 

 

 

 

 

 

 

 

 

clone()은 값을 복사한다고 알면 되겠습니다.

 


배열의 크기 - length

int length = nums.length;

length는 배열의 크기를 구해줍니다. 

 


배열의 값 구하기 - for 문 / 확장 for문 을 사용해서 배열의 값을 구해봅시다.

 

Car Class

public class Car {
	public void drive() {
		System.out.println("달려요!");
	}
}

main에서 Car 클래스로 배열을 만들어 볼 것이기 때문에 Car 클래스를 선언해줍니다.


main

//1. Car type 을 담을 수 있는 방 5개짜리 빈 배열객체를 생성해서 
// 그 참조값을 cars 라는 이름의 지역변수에 담아 보세요
Car[] cars = new Car[5];

//2. 반복문 돌면서 cars 배열의 모든방에 각각다른 Car객체의 참조값을 넣어보세요.
for(int i=0;i<cars.length;i++) {
	cars[i] = new Car();
}

//3. 반복문 돌면서 cars배열안에 있는 Car객체의 참조값을 하나씩 참조해서
//drive() 메소드를 호출해보세요.
for(int i=0;i<cars.length;i++) {
	//i 번째 방에 저장된 값을 tmp라는 임시변수에 담기
	Car tmp = cars[i];
	//tmp 안에 있는 참조값을 이용해서 메소드 호출
	tmp.drive();
}

Car type을 담을 수 있는 방 5개짜리 빈 배열객체를 생성해서 cars에 담아줍니다.

이 배열의 길이만큼 반복문을 실행하면서 새로운 Car객체의 참조값을 넣어줍니다.

만들어진 배열의 값을 구하기 위해서 cars의 길이만큼 반복문을 실행하면서 cars[i]의 drive 메소드를 출력해줍니다.

 

확장 for문을 사용하여 구하기

for(Car tmp:cars) {
	tmp.drive();
}

확장 포문을 사용할 수 도 있습니다.

 

확장for문 형식

for(DataType 변수이름 : 배열이름) { }