본문 바로가기

JAVA

[11] JAVA_DAY11

* 배열(Array)

- 인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료구조

- 배열을 이용하면 한 번에 많은 메모리 할당 가능

- 같은 타입의 데이터들이 순차적으로 저장

- 배열 인덱스는 0부터 시작

(1) 장점 

- 나란히 변수 선언가능

- 순차적으로 접근 가능(반복문 활용에 용이)

(2) 단점

- 선언한 갯수에서 추가하거나 삭제가 불가능하다.

- 수정하려면 새로 선언이 필요하다.

package Day11;

public class ArrayTest {

	public static void main(String[] args) {
		// 배열
		// 같은 타입의 변수들로 이루어진 집합
		// 같은 자료형으로 여러개의 공간을 형성
		
		// 자료형[] 배열명 = new 자료형[길이]
//		int i = 1;
//		int i1 = 2;
//		int i3 = 3;
//		int i4 = 4;
//		int i5 = 5;
		
		int[] arr1 = new int[5]; // 뒤의 [] 안에 길이를 명시적으로 선언해줘야 한다.
		String[] arr2 = new String[10];
		boolean[] arr3 = new boolean[5];
		char[] arr4 = new char[5];
		
//		인덱스는 배열의 길이 -1.
//		0부터 시작하기 때문
//		배열의 위치 == 인덱스 == 0부터 시작	
//		System.out.println(arr1); // 단순한 출력으로는 배열안의 요소를 확인할 수 없다.
//		System.out.println(arr1[0]);
//		System.out.println(arr1[1]);
//		System.out.println(arr1[2]);
//		System.out.println(arr1[3]);
//		System.out.println(arr1[4]);

		// 배열명.length > 배열의 길이를 정수로 반환
//		System.out.println(arr1.length); // 배열의 길이
//		for (int i =0; i<arr1.length; i++) {
//			System.out.println("arr1["+i+"] : " + arr1[i]);
//		} // 숫자류에 대해서는 아무값을 넣지 않으면 기본적으로 0의 값이 들어간다.
		
//		for (int i =0; i<arr2.length; i++) {
//			System.out.println("arr2["+i+"] : " + arr2[i]);
		
//	} // String에 대해서는 기본값이 null이 들어간다.
	// null : 공백을 의미하며, 공집합을 뜻한다. 즉, 아무값도 없다는 의미.
	
//	int ii = 0;
//	String str = "";
//	System.out.println(str + 10);

//		for (int i = 0; i < arr3.length; i++ ) {
//			System.out.println("arr3[" + i + "] : " + arr3[i]);
//		} // boolean에 대한 기본값은 false
		
//		for (int i = 0; i < arr4.length; i++ ) {
//		System.out.println("arr4[" + i + "] : " + arr4[i]);
//	} // char형의 기본값은 공백이며, 이에 해당하는 정수는 0이다.
//		System.out.println((int)arr4[0]);
		
		System.out.println(arr4[0] + 10);
		
		// 데이터 저장
		// 배열명 [인덱스] = 값;
		arr1[0] = 10;
		arr1[1] = 20;
		arr1[2] = 30;
		arr1[3] = 40;
		arr1[4] = 50;
		
//		for (int i =0; i<arr1.length; i++) {
//			System.out.println(arr1[i]);
//}	
	}}
public class ArrayTest2 {

   public static void main(String[] args) {
      int[] a = new int[3];
      
      a[0] = 1;
      a[1] = 2;
      a[2] = 3;
      
      int[] b = a;
      
      b[0] = 10;
      
      // 주소 참조 조심..!!
//      for(int i = 0; i < b.length; i++) {
//         System.out.println("a["+ i + "] : " + a[i]);
//         System.out.println("b["+ i + "] : " + b[i]);
//      } // 배열은 힙에 저장되며 같은 배열을 바라보고 있기 때문에 값 변경 시, 서로간 영향을 받는다.
      
      // 배열 선언시 선언과 동시에 초기화하는 법
      // 1 2 3 4 5
//      int[] arr = new int[5];
      int[] arr = new int[] {1, 2, 3, 4, 5};
      int[] arr2 = new int[] {10, 20, 30, 40, 50};
      int[] arr3 = {100, 200, 300};
      int[] arr4 = arr3;
      
      arr4[0] = 555;
      
//      System.out.println(arr3[0]);
      
//      System.out.println(arr2[0] + arr2[4]);
//      System.out.println(arr3[0]);
      
      // Dto 클래스를 담는 길이 5의 배열을 선언 후
      // 각 Dto 클래스의 value 값을 저장하시오
      // 1, 2, 3, 4, 5
      
      // 첫번째 문제점
      // 같은 패키지에 있는 Class를 가져올 때는 바로 선언이 가능하나
      // 다른 패키지에 있는 Class를 가져올 때는, 어느 경로에 있는지 import문이 필요하다.
      // 해결법 : 상단에 import문 작성(자동완성 이용)
      Dto[] dtos = new Dto[5];
      
      // 클래스의 초기값도 null
//      System.out.println(dtos[0]);
      
      
      Dto dto = new Dto();
      
      dtos[0] = dto;
      dtos[1] = dto;
      dtos[2] = dto;
      dtos[3] = dto;
      dtos[4] = dto;
      
      // 두번째 문제점
      // 기존 Dto value의 접근제어자는 default였다.
      // 즉, 다른 패키지의 class에서 접근이 불가능한 변수였기에,
      // 해결법 : 접근제어자를 public으로 변경 후 접근 가능하게 만들었다.
      dtos[0].value = 1;
      dtos[1].value = 2;
      dtos[2].value = 3;
      dtos[3].value = 4;
      dtos[4].value = 5;
      
      // 세번째 문제점
      // dto 객체를 하나만 선언한 뒤, 배열에 삽입했기 때문에, 배열 안의 dto는 모두 같은 객체를 바라본다.
      // 즉, value 값을 변경할 때마다, 값이 덮어씌워져 결국 마지막 값만 출력된다.
      for(int i = 0 ; i < dtos.length; i++) {
         System.out.println(i + "번째 dto 값 : " + dto.value);
      }
      
      //세번째 문제점 해결법
      dtos[0] = new Dto();
      dtos[1] = new Dto();
      dtos[2] = new Dto();
      dtos[3] = new Dto();
      dtos[4] = new Dto();
      
      dtos[0].value = 1;
      dtos[1].value = 2;
      dtos[2].value = 3;
      dtos[3].value = 4;
      dtos[4].value = 5;
      
      for(int i = 0 ; i < dtos.length; i++) {
         System.out.println(i + "번째 dtos 값 : " + dtos[i].value);
      }
      
      
      // 한번에 초기화
      Dto[] dtos2 = {new Dto(), new Dto(), new Dto(), new Dto(), new Dto()};
      
//      for(int i = 0; i < dtos.length; i++) {
//         Dto tempDto = dtos2[i]; // 배열 안에 선언한 Dto 객체를 가져온다. 타입이 Dto!!
//         tempDto.value = i + 1; // 꺼내온 클래스의 값을 변경하기
//      }
      
      
//      Dto tempDto;
//      
//      for(int i = 0; i < dtos.length; i++) {
//         tempDto = dtos2[i]; // 배열 안에 선언한 Dto 객체를 가져온다. 타입이 Dto!!
//         tempDto.value = i + 1; // 꺼내온 클래스의 값을 변경하기
//      }
      

   }

}

* 향상된 for문

- 기존 for문과 비교해 배열 반복문에 최적화된 for문

for (배열 요소 받을 변수 : 배열) {

실행할 코드

}

- 자동으로 변수에 배열 요소들이 "순차적"으로 대입된다.

- 인덱스를 활용할 수 없다는 단점이 있다.

 

package Day11;

public class ForTest {

	public static void main(String[] args) {
		String[] strArr = {"하나", "둘", "셋", "넷", "다섯"};
		
//		for (int i = 0; i < strArr.length; i++) {
//			System.out.println(strArr[i]);
//		}

		// 향상된 for문
		// 우측의 배열을 "차례대로" 좌측에 선언된 변수에 대입한다.
//		for(String str : strArr) {
//			System.out.println(str);
//		}
//		
		// 배열의 짝수의 요소만 출력하기
//		for (int i = 1; i < strArr.length; i+=2)
//			System.out.println(strArr[i]);
//	}

		int i = 0;
			
		 // 과제해결
		for (String str : strArr) {
			if ((i+1) % 2 == 0) {
				System.out.println(str);
			}
			i += 1;
			
		} // 헷갈립니다.
}}
package Day11;

public class ArrayTest3 {

	public static void main(String[] args) {
		// 2차원 배열
		
		// 자료형 [] [] 배열명 = new 자료형 [행][열];
		
		char[][] ch = new char[3][3];
		char [][] ch2 = {
				{'*', ' ', ' '},
				{'*', '*', ' '},
				{'*', '*', '*'}
		};
		
// 		i = 행 / j = 열
		for (int i = 0; i < ch2.length; i++) { // 행
//			ch2[] == {'*', ' ', ' '}
			for (int j = 0; j <ch2[0].length; j++) { // 열
//				ch2[행][열]
				System.out.println(ch2[i][j]);
			}
			System.out.println();
		}
	}

}
      // 2중 포문 그려오기
      //   *
      //  **
      // ***

 

'JAVA' 카테고리의 다른 글

[1226] 웹개발반1 (html)  (0) 2022.12.26
Java2 Day01  (0) 2022.09.24
[08] JAVA_DAY08  (0) 2022.08.09
[10] JAVA_DAY10  (0) 2022.08.08
if, for문 복습  (0) 2022.08.08