유난스런 개발 기록

[JAVA] Day-9 _ 배열 (Array) 본문

개념정리/JAVA

[JAVA] Day-9 _ 배열 (Array)

yourhwan 2023. 1. 19. 01:21

 

day-9

배열 (Array)


배열 (Array)란? 

  • 동일한 데이터타입을 가지는 여러개의 데이터를 저장할 수 있는 데이터 타입을 말한다.
  • 배열 또한 객체라는 것을 꼭 기억하자!

배열의 선언 방법은 다음과 같다.

int[] subjectArr;
	// 또는
int subjectArr[];
	// 하지만 한번에 배열의 선언과 메모리에 할당해주는 과정을 한번에 할 수 있다.

int[] subjectArr2 = new int[7];
		/*
		    -----------------------------
		    | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
		    -----------------------------
		    위의 숫자는 배열의 인덱스(index)를 가리키는 번호로써 0 부터 시작하여 1씩 증가한다.
		    배열의 인덱스(index)를 "배열의 방번호" 라고 흔히 부른다.
		    
		    배열에 저장된 데이터를 표현할때는 아래와 같이 배열명[인덱스번호] 로 나타낸다. 
		    
		    subjectArr[0]
		    subjectArr[1]
		    subjectArr[2]
		    subjectArr[3]
		    subjectArr[4]
		    subjectArr[5]
		    subjectArr[6]
		    
		    subjectArr[7] ==> 존재하지 않으므로 오류!!
		    
		    배열로 선언된 변수에는 자동적으로 초기값이 들어간다.
		    정수는 0, 실수는 0.0, char는 ' ', String을 포함한 객체는 null 이 들어간다.   
		 */

 

 

배열의 크기(길이)는 배열명.length 로 알아온다.

            int[] subjectArr2 = new int[7];
            System.out.println("배열 subjectArr 의 길이 : " + subjectArr.length);
                       // 배열 subjectArr 의 길이 : 7
           
		   for(int i=0; i<subjectArr.length; i++) {
			   System.out.println("subjectArr["+i+"] => " + subjectArr[i]);
		   }// end of for-----------------------------
		   /*
			    subjectArr[0] => 0
				subjectArr[1] => 0
				subjectArr[2] => 0
				subjectArr[3] => 0
				subjectArr[4] => 0
				subjectArr[5] => 0
				subjectArr[6] => 0

위에 코드와 같이 i를 출력해주면 배열이 어떻게 생성되어지는지 확인할 수 있다.

이번엔 배열에 값을 넣어주자

		   subjectArr[0] = 100; // 국어
		   subjectArr[1] = 90;  // 영어
		   subjectArr[2] = 95;  // 수학
		   subjectArr[3] = 70;  // 과학
		   subjectArr[4] = 98;  // 사회
		   subjectArr[5] = 100; // 음악
		   subjectArr[6] = 90;  // 체육

다른 객체들에 값을 넣어주는 것과 같은 방법이다!

그렇다면 넣어준 값을 출력해보자

 for(int i=0; i<subjectArr.length; i++) {
			   System.out.println("subjectArr["+i+"] => " + subjectArr[i]);
               
/*
			subjectArr[0] => 100
			subjectArr[1] => 90
			subjectArr[2] => 95
			subjectArr[3] => 70
			subjectArr[4] => 98
			subjectArr[5] => 100
			subjectArr[6] => 90 
*/

별로 어렵지 않은 내용이다! 기존의 변수 선언, 선언한 변수에 값을 넣어주는 방법과 다를 바가 없기 때문이다.

 

그런데

사실...

 

배열의 선언과

선언되어진 배열을 메모리에 할당 해주는 과정 그리고

선언되어진 배열에 값을 넣어주기를 한번에 할 수 있다!

 int[] subjectArr3 = new int[] {100,90,95,70,98,100,90};

여기서 new int[] 도 사실 생략이 가능하다.

결국 가장 많이 사용하게 될 배열의 선언 코드는 다음과 같다.

int[] subjectArr4 = {100,90,95,70,98,100,90};

 

그렇다면 이제 올렸던 코드들을 종합해

배열에 넣어준 값으로 총점과 평균을 구해보자!

int[] subjectArr4 = {100,90,95,70,98,100,90};
		   
	System.out.println("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
		   
int sum = 0;
for(int i=0; i<subjectArr4.length; i++) {
	sum += subjectArr4[i];
}// end of for------------------
	System.out.println("총점 : " + sum);
	 // 총점 : 643
		   
double avg = Math.round((double)sum/subjectArr4.length*10)/10.0;
		   
System.out.println("평균 : " + avg);
// 평균 : 91.9

배열을 이용해 한번에 7개의 값을 저장했다.

이후 int타입의 변수 sum을 선언하고 값을 0으로 초기화 해주어

이곳에  배열의 길이만큼 실행되는 동안 각각의 값들을 합하여 저장한다.

이 후에 출력문을 통해 sum을 출력하면 총점을 알 수 있다.

 

avg는 평균을 담아주는 변수이며 double 타입이다. 

반복문을 통해 얻은 sum 값을 Math.round() 메소드를 이용하여 평균을 구해준다.

int타입의 sum을 double타입으로 형변환 해주고, 배열의 길이만큼 나누어주면

우리가 아는 흔한 평균값을 구하는 공식과 일치한다.

하지만 나는 Math.round() 를 이용해

소수 첫째자리까지 나타내어주고자 했으니 10을 곱해준 후 10.0으로 다시 나누어줬다.

그렇게 하면 평균 91.9라는 값을 얻을 수 있다!

 

이번엔 조금 더 어려울 수 있지만 배열을 이용해 로또 프로그램을 만들어보자!

문제의 조건은 다음과 같다.

		// 1 부터 45 까지의 숫자 중 랜덤하게 6개의 숫자를 추출하도록 한다.
	
		
		/*
		 	int ball == 1	2	3	...	  45
		 	
		 	int[] ballArr = new int[45];
		 	
				 --------------------------------------
		데이터값	 	| 1 | 2 | 3 |...................| 45 |
				 --------------------------------------
	  	 index		  0   1   2  ...................  45

 

배열의 인덱스가 로또 번호가 적힌 공이라고 생각하면 된다.

 

 

int[] ballArr = new int[45]; 
for(int i=0; i<ballArr.length; i++) {
	ballArr[i] = i+1; // 배열의 방마다 데이터값 입력하기
	 // 데이터값은 1 ~ 45
		}

int[] tempArr = new int[5]; // 기존에 뽑았던 방번호를 기억시켜주는 저장소
		
/*			tempArr
		--------------------------
     데이터값 =>  | -1 | -1 | -1 | -1 | -1 |
		--------------------------
		   0    1    2    3    4
		  			   
		  	tempArr을 -1로 초기화
 */
 
 Random rnd = new Random();
 String result = ""; // 뽑아준 인덱스 값을 넣어줄 변수
 
for(int i=0; i<6; i++) {
			
	int idx = rnd.nextInt(44 - 0 + 1) + 0; // 0 ~ 44 // 공을 뽑는 코드
// 만약 중복으로 뽑아진 값이 있다면 다시 뽑아줘야한다.			
			
	for(int j=0; j<tempArr.length; j++ ) { // 뽑았던 것이 또 있는지 없는지 비교하는 코드
		if( idx == tempArr[j]) {
		// 새로이 뽑아온 방번호(idx)가 기존에 뽑은 것(tempArr[j])과 같다면 다시 뽑아야 한다.
		i--; // 중복 된 수를 뽑았다면 꽝이라서 다시 뽑아야 한다. 하지만 뽑은 횟수는 증가되어서 다시 기회를 주기 위해 꽝의 횟수를 한번 빼준다.
			continue outer;
		}
				
	}// end of for-----------------------
			
	if(i<5) {
   	tempArr[i] = idx; // 뽑은 방번호(index)를 저장시켜둔다.
	}
	String str_add = (i<5)?",":"";	// 마지막 출력값에는 ,가 없어야하기 때문에 i<5가 되어야한다. 즉 4번째까지만 ,를 찍어준다.
	result += ballArr[idx]+str_add;
			
	}// end of for()----------------------------
		
		System.out.println("\n로또 1등 당첨번호 : " + result);

 

 

이렇게 배열에 대해서 알아보았고 간단한 출력 예제와 로또번호 생성기를 만들어봤다.

역시 이론만 배우는 것 보다 직접 무언가 만들며 배우는 코딩이 훨씬 기억에 오래 남고 재미있다.

마지막으로 여태까지 배운 내용들을 종합하여 실습 했던 코드를 올리며 마무리하겠다!

 

package my.day10.a.multiDimension;

public class _2OneDimensionArray_main {

	public static void main(String[] args) {

		Sungjuk[] sjArr = {new Sungjuk("이순신",90, 80, 70),
				new Sungjuk("엄정화",90, 80, 70),
				new Sungjuk("서강준",85, 70, 90),
				new Sungjuk("이혜리",60, 80, 50)};
	
		 System.out.println("\n==========학생별 점수 집계============\n");
		 System.out.println("-----------------------------------------------");
		 System.out.println("학생명\t국어\t영어\t수학\t총점\t평균");
		 System.out.println("-----------------------------------------------");
		
		 for(int i=0; i<sjArr.length; i++) {
			 System.out.println(sjArr[i].showInfo() );
		 }
		 
			/*
		    ==== 학생별 점수 집계 =====
		    
		    ---------------------------------
		     학생명   국어  영어  수학  총점  평균 
		    ---------------------------------
		     이순신   90   80   70   240  80.0 
		     엄정화   80   85   76   241  80.3
		     서강준   85   70   90   245  81.7
		     이혜리   60   80   50   190  63.3
		*/
		 
		 System.out.println("\n####################################\n");
		 
		 int sum_kor = 0, sum_eng = 0, sum_math = 0; // 각 과목별 총점을 저장해둘 변수선언
		
		 for(int i=0; i<sjArr.length; i++) {
			 
			 sum_kor = sjArr[i].kor;				 // 국어의 총점
			 sum_eng = sjArr[i].eng;				 // 영어의 총점
			 sum_math = sjArr[i].math;				 // 수학의 총점
			 
			 
		 }// end of for----------------------------------
		 
		double avg_kor = Math.round( (double)sum_kor/sjArr.length * 10)/10.0; // 국어 평균
		double avg_eng = Math.round( (double)sum_eng/sjArr.length * 10)/10.0; // 영어 평균
		double avg_math =  Math.round( (double)sum_math/sjArr.length * 10)/10.0; // 수학 평균
		 
		System.out.println("  === 과목별 평균 ===");
		System.out.println("---------------------");
		System.out.println(" 국어\t 영어\t 수학");
		System.out.println("---------------------");
		System.out.println(avg_kor+"    "+avg_eng+"    "+avg_math);
		 
			/*
		    ==== 과목별 평균 ====
		     
		    ------------------
		     국어   영어   수학
		    ------------------
		     78.8  78.8  71.5
		 */
	}// end of main()-------------------

}