JAVA

[JAVA]배열

로돌씨 2024. 2. 14. 21:10
배열(array) :
하나의 변수에 여러 데이터를 넣을 수 있어 관리가 용이하고 가독성이 높아짐 , 변수를 줄여주고 연산에 편리하게 한다는 장점이있다.

 

public void testArray() {
	//배열의 사용 이유
	/*int num1 = 10;
	int num2 = 20;
	int num3 = 30;
	int num4 = 40;
	int num5 = 50;
	int sum = 0;
	sum += num1;
	sum += num2;
	sum += num3;
	sum += num4;
	sum += num5;
	System.out.println("sum: " + sum);
	*/
	//이렇게 치는것 보다는 배열이 더 좋다 .
	//배열 이용
	int[] arr = new int[5];
	/*arr[0] = 10;
	arr[1] = 20;
	arr[2] = 30;
	arr[3] = 40;
	arr[4] = 50;
	*/
	//for 문 사용
	for(int i= 0 ; i < 5 ; i++) {
		arr[i] = (i+1)*10;
		//int에 i 값을 넣음 i는 5가 될때까지 반복됨 (0 1 2 3 4) i는 계속증가함 
		
	}
	int sum = 0;
	/*
	sum += arr[0];
	sum += arr[1];
	sum += arr[2];
	sum += arr[3];
	sum += arr[4];
	*/
	for(int i = 0; i < arr.length; i++) {
		//i 는 arr.length < 배열의 크기만큼 증가시키겠다.
		 sum += arr[i];
	}
	System.out.println("sum: " + sum);
} 
public void testArray2() {
	//배열 선언
	//자료형[] 변수명(배열명);
	//자료형 변수명[];
	/*int [] iarr;
	char carr[]; //stack 영역에 배열의 주소를 보관할 수있는공간을 만듬
	
	iarr = new int[5]; //방의 크기는 5 (index = 4)
	carr = new char[10];
	*/
	//선언과동시에 할당
	int iarr[] = new int [5];
	char[] carr = new char[10];
	
	
	System.out.println("iarr: " + iarr);
	System.out.println("carr: " + carr);
	
	System.out.println("iarr의 hachcode: " + iarr.hashCode());
	System.out.println("carr의 hachcode: " + carr.hashCode());
	
System.out.println("iarr의 길이 : "+ iarr.length);
System.out.println("carr의 길이 : "+ carr.length);

//스캐너로 입력받은 정수값으로배열의 길이 지정하여 할당.
Scanner sc = new Scanner(System.in);
System.out.print("새로 할당할 배열의 길이를 입력하세요: ");
int size = sc.nextInt();
double darr[] = new double[size];
System.out.println("darr의 해시코드 : "+ darr.hashCode());
System.out.println("darr의 길이: " + darr.length);
//배열의 크기를 바꾸기
darr = new double[30];
System.out.println("darr의 해시코드 : "+ darr.hashCode());
System.out.println("darr의 길이: " + darr.length);
//한번 할당된 배열을 내가 직접 지울수 없다.
//더이상 참조하지않는 배열은 일정 시간이 지난 후 old영역으로 이동하여
//gc( 가비지 콜렉터 )가 삭제시킨다.
darr = null;
//NullPointerException
//아무것도 참조하지않고 null이라는 특수값을 가지고 있을때 발생하는 에러.
System.out.println("삭제 후에 darr의 길이 : " + darr.length);

}
public void testArray3() {
	int[] iarr = new int[5];
	// 출력 값은 0 -> 자동으로 0으로 초기화 되어있다.
	for(int i = 0; i<iarr.length; i++) {
		System.out.println("iarr[ " + i + " ] 의 값: " + iarr[i]);
	}
	//지정된 기본값 이외의 값으로 초기화
	//{}
	int iarr2[] = {11,22,33,44};
	
		System.out.println(iarr2.length);
		System.out.println(iarr2[2]);
		String[] sarr = new String[] {"사과","고구마","감자","바나나","토마토"};
			for(int i = 0; i<sarr.length; i++ ) {
				System.out.println(sarr[i]);
			}
		}
	}

-> 예제

 

더보기

배열의 얕은복사와 깊은복사

public class ArrayTest02 {
	public String prn(int[] iarr) {
		// 정수 배열받아 배열에 저장된값들을 string으로모아서 반환
		String str = "";
		for (int i = 0; i < iarr.length; i++) {
			str += iarr[i] + " ";
		}
		return str;
	}

	public void shallowCopy() {
		// 얕은 복사
		int[] oArr = { 1, 3, 3, 4, 5 };
		int[] cArr = oArr;
		System.out.println("1. oArr : " + prn(oArr));
		System.out.println("2. cArr : " + prn(cArr));

		oArr[0] = 99;
		System.out.println("1. oArr : " + prn(oArr));
		System.out.println("2. cArr : " + prn(cArr));

		System.out.println("1. oArr 의 해시코드 : " + oArr.hashCode());
		System.out.println("2. cArr 의 해시코드 : " + cArr.hashCode());
		// 얕은복사를 해서 해시코드 (주소)가 같은모습
	}

	public void deepCopy1() {
		// 1. 동일한 배열을 새로 하나 생성하여 값을 복사.
		int[] oArr = { 1, 2, 3, 4, 5 };
		int[] cArr = new int[5];

		// for문을 이용해서 값을 1:1로복사
		for (int i = 0; i < oArr.length; i++) {
			cArr[i] = oArr[i];
		}
		System.out.println("1. oArr : " + prn(oArr));
		System.out.println("2. cArr : " + prn(cArr));

		oArr[0] = 99;

		System.out.println("1. oArr : " + prn(oArr));
		System.out.println("2. cArr : " + prn(cArr));
//각각의 배열을가리키기 때문에 오리지날이 99로바꼈다한들카피는 달라지지않음 
		System.out.println("1. oArr 의 해시코드 : " + oArr.hashCode());
		System.out.println("2. cArr 의 해시코드 : " + cArr.hashCode());
//해시코드도 서로 다른모습.
	}

	public void deepCopy() {
		// 2. arraycopy()사용
		int[] oArr = { 1, 2, 3, 4, 5 };
		int[] cArr = new int[10];
		// araycopy(src,srcPos,dest,destPos,length);
		// src: 원본 배열 srcPos :복사 시작위치 dest : 카피배열 destPos : 붙여넣기 시작위치
		// length : 복사할 길이
		System.arraycopy(oArr, 0, cArr, 2, oArr.length);
		System.out.println("oArr : " + prn(oArr));
		System.out.println("cArr : " + prn(cArr));

// clone()
// 시작인덱스 등의 설정이 불가능 , 원본 배열을 통째로 복사해 새로운 배열을 할당
		int[] cArr2 = new int[10];
		System.out.println(cArr2.hashCode());

		cArr2 =(int[]) oArr.clone();

		System.out.println(cArr2.hashCode());
		System.out.println("cArr2 : " + prn(cArr2));

	}
}

얕은복사는 배열의 같은 주소값을 불러 복사하고 , 깊은복사는 새로운 주소값을 할당해 안의 데이터만 복사하여 새로운 배열을 생성한다.

public class ArraySample {
	public void test1() {
		/*- 구현 내용 : 
	1. 10개의 int 배열 선언하고 할당함
	2. 각 방에 1~100사이의 임의의 난수를 기록함
		Math.random() 사용함
		new Random().nextInt(100) + 1;
	3. 10개의 정수들의 합계를 구하여 출력함
		 */
		int iarr[] = new int [10];
		int sum = 0;
		for(int i = 0; i <iarr.length; i++) {
			iarr[i] = (int)//int값으로 변환해줌(강제형변환)
					(Math.random()*100) +1; // 0-0.99까지 만들어짐 * 100을해주면 99 그러니까 +1을 해줘서 100을만
			sum += iarr[i]; 
	}
		System.out.println(sum);
}/*
	[문제 2]
			 - ArraySample 클래스에 메소드 추가함
			 - 메소드명 : public void test2()
			 - 구현 내용 : 
				1. 10개의 int[] 선언, 할당함
				2. 1~100사이의 임의의 정수를 발생시켜, 배열공간에 기록함
				  배열[인덱스] = (int)(Math.random() * 100) + 1;
				3. 기록된 10개의 값중 가장 큰 값과 가장 작은 값을 알아내어
				4. 출력확인
*/public void test2() {
	int iarr[] = new int [10];
	int min = 0;
	int max = 0;
	
	for(int i = 0; i <iarr.length; i++) {
		iarr[i] = (int)//int값으로 변환해줌(강제형변환)
				(Math.random()*100) +1; // 0-0.99까지 만들어짐 * 100을해주면 99 그러니까 +1을 해줘서 100을만듬 
		System.out.println(iarr[i]);
			if (max <iarr[i]) {
				max = iarr[i];//max의 값보다 iarr[i]의 값이 크면 max 의 값은 iarr[i]
			}
			min = iarr[i];
			if( min > iarr[i]) {
				
				min = iarr[i];//min의 값보다 iarr[i]의 값이 작으면 min 의 값은 iarr[i]
				}
			}System.out.println( "제일 큰 수: " + max + " 가장 작은 수 : " + min );
			
		}
}

-> 실습

 

2차원배열 :
배열의 요소로 1차원 배열을 가지는 배열 , 
타입 배열이름[행의길이][열의길이]; 로 선언

 

public class DimensionalArrayTest01 {
	public void test1() {
		// 2차원 배열의 선언
		// 선언을 하게 되면 stack에 래퍼런스 변수가 생성
		int[][] iarr1;
		int iarr2[][];
		// heap 영역에 배열 할당.
		iarr1 = new int[3][5]; // 세줄에 다섯칸짜리 배열이 만들어짐
		iarr2 = new int[3][]; // 세줄만 만들어진 상태
		iarr2[0] = new int[3];
		iarr2[1] = new int[2]; // 가변 배열 
		iarr2[2] = new int[5];
		
		int val =1;
		for (int i = 0 ; i<iarr1.length; i ++) {
			for( int j=0; j<iarr1[i].length; j++) {
				iarr1[i][j] = val ++;
			
			}
		}
	 for ( int i = 0; i<iarr1.length; i++) {
		 for (int j= 0; j<iarr1[i].length; j++) {
			 System.out.print(iarr1[i][j]+" ");
		 }
		 System.out.println();
	 }
	}
}

-> 2차원배열 예제

 

-> 설명을 돕는 그림 2행 3열의 배열이 만들어진다. / 0 , 0 / 0 , 1 / 0 , 2 /  / 1 , 0 / 1 , 1 / 1 , 2 /

🐵🐵

 

'JAVA' 카테고리의 다른 글

[JAVA]객체#2  (0) 2024.02.20
[JAVA]객체지향 프로그래밍  (0) 2024.02.19
[JAVA]조건문  (1) 2024.02.13
[JAVA]제어문  (0) 2024.02.08
[JAVA] 연산자  (0) 2024.02.04