Joslynn의 하루

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 - 6일차 노트 정리_배열, 다차원 배열_220725 본문

MSA Full-Stack 개발자 양성과정/Java

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 - 6일차 노트 정리_배열, 다차원 배열_220725

Joslynn 2022. 7. 25. 17:51

배열

: Data를 저장하는 공간

: 하나의 이름에 여러 개의 값을 사용하는 경우; 공간을 나누어 번지수를 구분;

 → index(번지수)는 0부터 시작 및 배열의 크기보다 하나씩 작음;

: 한가지 Type만 저장 가능

: 배열은 객체이다.; 생성해서 사용;

: 크기 변경 불가 크기 변경 시 재생성 요망;

: 배열이름.length → 배열의 길이(크기)

 


1차원 배열 선언;

1) dataType [ ] 배열 이름 = new DataType [개수];

2) dataType 배열 이름 [ ] = new DataType [개수];

3) dataType 배열 이름 [ ] = new DataType [ ]{값, 값, 값, ...}; // 명시적 초기화; [ 공백 ]

// 배열 생성시, 보통 값은 기본값으로 setting, but 초기값을 바로 설정하고 싶은 경우 사용

4) dataType 배열 이름 [ ] {값, 값, 값, ...};

 

 

예시1)

int [ ] a = new int [5] 0-5까지 다섯 개의 공간을 만듦;

int 기본값 = 0; 으로 설정

if, String 타입 배열; String 기본값 == null;

 

예시2)

int [ ] arr = new int [5];

 

 0  0 100 0 0

System.out.print(arr); == 주소값이 나옴(객체이기 때문);

System.out.print(arr[0]); ==  0 ;

 

반복문 표현방식 (1) 

for (i=0; i<arr.5; i++){

System.out.print(arr[ i ]);

}

반복문 표현방식 (2)

for (i=0; i<arr.length; i++){System.out.print(arr[ i ]);} // 권장 방식

 

*값 변경

arr[2] = 100;

 

예시 3)

int [] arr = new iint [] {2,4, 6, 8, 10};

2 4 6 8 10

System.out.println(arr) == 주소값;Systme.out.println(arr[1]) == 4;

 

예시 4)

int i; // 전역변수

int arr [];; // 배열

System.out.println (i); // 0;

System.out.println (arr); //null;  객체의 초기값; 아직 생성되지 않은 객체; 

 

i = 100; // 값 바로 할당 가능

arr = new int [5]; // 먼저 생성한후 값 할당

 

System.out.println (i); // 100;

System.out.println (arr); //주소값;

System.out.println (arr[2]) ; // 값 == 0;  

 


자주 발생하는 오류

: NullPointerException => 생성되지 않은 배열(객체)을 접근(사용)할 때 발생 (==생성되지 않은 객체를 가지고 .(점)을 찍었기 때문);  // 프로그램이 끝까지 돌지 못 함;

  → 이후 예외 처리를 위해 알아둘 필요가 있음

: ArrayIndexOutOfBoundsException => 배열의 번지수를 벗어 났을 때 발생 ex) int a [] = new int [2] ; => a[0] , a[1] , a[2] - 오류

 


class ArrayExamMethod{
	
	//각int,double,char,boolean ,String type별로 총 5개씩 저장하는  배열을 생성하세요
	int [] intArr = new int [5];
	double [] doubleArr = new double [5];
	char [] charArr = new char [5]; // 초기화값: \n0000 == 공백;
	boolean [] booleanArr = new boolean [5]; // 초기화값: false; 
	String [] StringArr = new String  [5]; // 초기화값: null;



	//메소드 : printArrayValue01	
	//위의 배열들에 자동으로 초기화 된값을 출력하세요 // 반복문
	public void printArrayValue01(){
		System.out.println("----------------intArr 배열 방---------------");
		System.out.println("주소값: "+intArr);
		for (int index=0;index<intArr.length; index++ ){
			System.out.println("intArr["+index+"]= "+intArr[index]);
		}
		System.out.println("\n----------------doubleArr 배열 방---------------");
		System.out.println("주소값: "+doubleArr);
		for (int index=0;index<doubleArr.length; index++ ){
			System.out.printf("doubleArr["+index+"]= %.2f %n",doubleArr[index]);
		}
		System.out.println("\n----------------charArr 배열 방---------------");
		System.out.println("주소값: "+charArr);
		for (int index=0;index<charArr.length; index++ ){
			System.out.println("charArr["+index+"]= "+charArr[index]);
		}
		
		System.out.println("\n----------------booleanArr 배열 방---------------");
		System.out.println("주소값: "+booleanArr);
		for (int index=0;index<booleanArr.length; index++ ){
			System.out.println("booleanArr["+index+"]= "+booleanArr[index]);
		}
		System.out.println("\n----------------StringArr 배열 방---------------");
		System.out.println("주소값: "+StringArr);
		for (int index=0;index<StringArr.length; index++ ){
			System.out.println("StringArr["+index+"]= "+StringArr[index]);
		}

		/*for (int a=0;a<5;a++)
		{
			System.out.println("intArr["+a+"]= "+intArr[a]);
			System.out.println("doubleArr["+ a+"]= "+doubleArr[a]);
			System.out.println("charArr["+a+"]= "+charArr[a]);
			System.out.println("booleanArr["+a+"]= "+booleanArr[a]);
			System.out.println("StringArr[" +a+ "]= "+StringArr[a]);

		}*/
	}
	

	//메소드 : printArrayValue02	
	//위의 5개의 배열에서 각각 적당한 값으로 data를 할당하세요. // 반복문
	public void printArrayValue02(){
		System.out.println("\n값 변경합니다.\n");
		for (int a=0;a<intArr.length;a++){
			intArr [a] = a+10; // 
			// intArr = {1,2,3,4,5}; 불가
			//intArr = new int [] {1,2,3,4,5}; // 맴버필드의 배열이 아닌 새로운 배열 생성 == intArr은 주소값이 바뀌는 가비지 콜렉션, 새로운 객체 할당

			doubleArr [a] = (Math.random()*10)+11; // doubleArr [a] = a*0.5;
			charArr [a] = (char)('A'+a);
			if (a%2==0) booleanArr[a] = true;

			String sentance = "현재 index는" +a+"입니다.";
			StringArr [a] = sentance;
			

		}
		System.out.println("값 변경 완료하였습니다.");
	}
	
	//메소드 : printArrayValue03	
	//새롭게 할당된값을 출력하세요
	public void printArrayValue03(){
		System.out.println("\n변경된 값을 확인합니다.\n");
		this.printArrayValue01();
	}
}

	
	//메인메소드에서
	//ArrayExam의 메소드들을 순서대로 호출하세요
class ArrayExam{

	public static void main(String [] args) {
		
		ArrayExamMethod aem = new ArrayExamMethod(); //new 키워드를 만나는 순간 맴버필드 초기화; 각 dataType별 초기값 설정; ex) int 형 = 0;, String 형 = null;

		aem.printArrayValue01();
		aem.printArrayValue02();
		aem.printArrayValue03();
	}
	
}

*배열 date 값 변경 시, 새로운 배열을 생성하여 기존 객체의 주소값이 변경되지 않도록 주의;


*main method에서 (String [] args) 배열

 

예제1)

실행


예제 2)

실행


배열_객체 저장

예시 1)

예시 2)

//ObjectInArray.java

class ObjectOne{
	public int a;
}

public class ObjectInArray{
	public static void main (String [] args){
	//메인 메소드에서 
	
		//ObjectOne 타입을 5개 까지 저장하는 배열을 선언하고			
	
			ObjectOne obarr [] = new ObjectOne [5]; // **중요! ObjectOne이라는 Type을 가지고 있는 배열을 생성;
			System.out.println("obarr= "+obarr);
			System.out.println("obarr.length= "+obarr.length);

		//5개의 ObjectOne객체를 생성하세요.
		//각 객체가 갖고있는 전역변수 출력
		//각 객체의 주소값 출력
				if (obarr.length>0) // 버그 가능성 낮추는 것;
				{
					for (int i=0; i<obarr.length; i++)
					{	
						System.out.print("생성 전: obarr["+i+"] = "+obarr[i]+"\t");
						
						obarr[i] = new ObjectOne(); // **중요! ObjectOne 객체 생성
						System.out.println("생성 후: obarr["+i+"] = "+obarr[i]); 

					}
					
					System.out.println("\n-------------------- 각 객체의 a값 확인하기 ----------------------");
					
					for (int i=0; i<obarr.length; i++)
					{	
						System.out.print("변경 전: obarr["+i+"].a = "+obarr[i].a+"\t\t");
					
		//각각의 ObjectOne객체가 서로 다른 a의 값을 갖도록 a의 값을 변경하세요.			
		//각 ObjectOne 객체의 a를 출력하세요

						obarr[i].a = i*10;
						System.out.println("변경 후: obarr["+i+"].a 변경값= "+obarr[i].a);
					}
				}
        System.out.println("--------------------------------------------------------------------------------------");

        obarr [0] = obarr [1]; // 1번지의 주소값이 0에 저장된다; arr[0]을 가리키는 연결이 끊김; 더이상 쓸모 없어진 객체는 가비지 콜렉션이 일어남; 더이상 접근 불가;
        System.out.println ("obarr[0]="+obarr[0]);
        System.out.println ("obarr[1]="+obarr[1]);

        System.out.println("obarr[0].a="+obarr[0].a);
        System.out.println("obarr[1].a="+obarr[1].a);
	} // main 끝
		
} // class 끝

 

 


java version 1.5에서 추가된 개선된 for문

: 주로 배열이나 자료구조(Collection - java.util)에서 많이 사용한다.

 

*구조

for( dataType 변수 이름 : 반복 대상 such as 배열, 자료구조 등){// 무조건 배열의 처음부터 끝까지 돌게 됨;
	
}

예시 1)

					/*for (int i=0; i<obarr.length; i++)
					{	
						System.out.print("변경 전: obarr["+i+"].a = "+obarr[i].a+"\t\t");
					
		//각각의 ObjectOne객체가 서로 다른 a의 값을 갖도록 a의 값을 변경하세요.			
		//각 ObjectOne 객체의 a를 출력하세요

						obarr[i].a = i*10;
						System.out.println("변경 후: obarr["+i+"].a 변경값= "+obarr[i].a);
					}*/
					int i = 0; //밑의 for문은 index 표시 불가;
					for (ObjectOne obj : obarr) // **배열을 처음부터 끝까지 돌릴 수 있음; index값으로 반복 제어 불가;
					{
						System.out.print("변경 전: obj.a = "+obj.a+"\t\t");
						
						obj.a = 10+i++;
						System.out.println("변경 후: obj.a 변경값= "+obj.a);
					}
				}

2차원 배열 선언

 

1. DataType [ ] [ ] 배열이름 = new DataType [ 행 ] [ 열 ];

2. DataType 배열이름 [ ] [ ]  = new DataType [행] [열];

3. DataType [ ] 배열이름 [ ]  = new DataType [행] [열]; // 잘 사용하지 않음.

: ex) int [ ] [ ] a = new int [3] [4]; ⇨ 3행 4열(12개 공간);

 

*선언과 동시에 명시적 초기화

datatype [][] 배열 이름 = new datatype [ ] [ ]{

                  {값, 값, 값,.......},

                  {값, 값, 값,.......},

                  {값, 값, 값,.......},

}

 

*가변형 배열을 생성할 수 있다. (각 행마다 열의 개수를 다르게 생성할 수 있다.) - java의 특징;

DataType [ ] [ ] 배열이름 = new DataType [ 행 ] [ 생략 ];

 

(ex) int [ ] [ ] a = new int [3] [ ]; => 행은 3개이고 열은 생성 안된 상태 // 사용 전에 각 행의 열 생성 필수!

a[0] = new int [2]; ⇨ 1행 2열 // 1차원 배열 형성;

a[1] = new int [5]; ⇨ 2행 5열

a[2] = new int [1]; ⇨ 3행 1열

int 형이므로 0이 기본값으로 설정;

*배열이름.length ==> 행의 길이가 출력

 ex> a.length == 3;

*배열 이름의 [index].length ==> 각 index 행에 대한 열의 길이

ex> a[0].length == 3

       a[1].length == 5

       a[2].length == 1

 

예제1)

class MultiArrayExam {

	int arrInt [][] = new int [][]{
		{1,3,5,7},
		{2,4,8,11,15},
		{1,2,4},
		{100,200},
	};
    public void test(){
        System.out.println("============================================================");
            for (int i = 0;i<arrInt.length;i++) // 3행
            {
                for (int j = 0; j<arrInt[i].length; j++) // 4열
                {
                    System.out.print(arrInt[i][j] +"\t");
                }
                System.out.println();
            }
     public static void main (String [] args){

		MultiArrayExam mae = new MultiArrayExam();
		mae.test();

		
	}
}

 

Comments