JAVA_06

김민영·2024년 1월 31일

JAVA

목록 보기
7/10
post-thumbnail

배열(Array)

  • 하나의 이름으로 동일한 자료형의 데이터를 여러 개 연속적으로 저장할 수 있는 메모리 공간을 할당 받는 것을 말함
  • 변수는 하나의 값만을 저장하지만, 변수는 여러 개의 값을 저장할 수 있음 ==> 같은 자료형의 데이터들이 연속적으로 저장이 됨
  • 배열은 선언과 동시에 저장할 수 있는 자료형의 타입이 결정이 됨
    만약 다른 자료형의 데이터를 저장하려면 타입 불일치 컴파일 요류 발생
  • 배열의 방의 이름은 0 이라는 인덱스부터 시작이 됨
  • 배열의 단점 : 배열은 한 번 크기가 정해지면 크기를 늘리거나 줄일 수 있음

[배열 사용하는 방법]

  • 1단계 : 배열 선언
    형식) 자료형[] 배열명(배열이름) 또는 자료형 배열명[]

  • 2단계 : 배열 메모리 생성(메모리 할당)
    형식) 배열명 = new 자료형[배열의 크기]

  • 3단계 : 배열 초기화 ==> 할당된 메모리 영역에 데이터를 저장

  • 4단계 : 배열을 이용 ==> 데이터 처리(연산, 출력 등등)

[배열을 생성하는 방법 - 2가지]

- 1. new 키워드를 이용하여 배열 생성
- 2. 배열의 초기값을 이용하여 배열 생성


1. new 키워드를 이용하여 배열 생성

public class ArrayExam_01 {

	public static void main(String[] args) {
		
		// 1단계: 배열 선언 - 배열명 아무거나 가능
		// 형식) 자료형[] 배열명(배열이름) 또는 자료형 배열명[] 
		int[] arr;
		
		// 2단계 : 배열 메모리 생성(메모리 할당)
		arr = new int[5]; // 자료형 크기가 정해지지 않아 heap 메모리(=직접적 접근X)
		
		System.out.println("heap 메모리 주소 >>> " + arr);
		
		// 3단계 : 배열 초기화 ==> 할당된 메모리 영역에 데이터를 저장
		arr[0] = 10;
		arr[1] = 20;
		arr[2] = 30;
		arr[3] = 40;
//		arr[3] = "홍길동; // 자료형 오류 ==> int는 문자 선언X
		arr[4] = 50; 
//		arr[5] = 60;	// 실행 시 오류
		
		// 배열의 연산
		arr[2] += 100;	// arr[2] = arr[2] + 100;
		
		// 4단계 : 배열에 들어가 있는 데이터를 화면에 출력해 보자
		System.out.println("arr[0] >>> " + arr[0]);
		System.out.println("arr[1] >>> " + arr[1]);
		System.out.println("arr[2] >>> " + arr[2]);
		System.out.println("arr[3] >>> " + arr[3]);
		System.out.println("arr[4] >>> " + arr[4]);
		// 반복문 이용해서 짧게 작성 가능 
		
		System.out.println();
		
		// 반복문을 이용하여 배열을 화면에 출력
		for (int i = 0; i <= 4; i++) { // for (int i = 0; i < 5; i++)
			System.out.println("arr["+i+"] >>> " + arr[i]);
		}
		
		
	}

}

[문제1] 5개의 정수를 저장할 배열을 만들고 키보드로 배열에 5개의 데이터를 저장한 후 해당 배열을 화면에 출력

import java.util.Scanner;

public class ArrayExam_02 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		// 배열의 1단계 + 2단계 : 배열 선언 및 배열 메모리 생성
		int[] score = new int[5];
		
//		System.out.print("첫 번째 정수 입력 : ");
//		score[0] = sc.nextInt();
//		
//		System.out.print("두 번째 정수 입력 : ");
//		score[1] = sc.nextInt();
//		
//		System.out.print("세 번째 정수 입력 : ");
//		score[2] = sc.nextInt();
//		
//		System.out.print("네 번째 정수 입력 : ");
//		score[3] = sc.nextInt();
//		
//		System.out.print("다섯 번째 정수 입력 : ");
//		score[4] = sc.nextInt();
		
		// 반복문을 이용하여 5개의 정수를 배열에 저장
		for(int i = 0; i < 5; i++) {
			
			System.out.print((i+1) + "번째 정수 입력 : ");
			score[i] = sc.nextInt();
		}
		
		// 배열에 저장된 데이터를 화면에 출력
		
		for(int i = 0; i < 5; i++) {
			
			System.out.println("score["+i+"] >>> " + score[i]);
			
		}
		
		sc.close();

	}

}

단축 for문(개선된 for문, 향상된 for문)

  • jdk 1.5 버전부터 추가된 기능
  • 주로 배열의 요소(값)를 처리(출력)할 때 사용
    형식)
for(자료형 변수명 : 배열명){
		반복 실행 문장;
}

실행 방법

  • 배열의 첫번째 인덱스(0)에 있는 데이터를 좌변에 있는 변수에 저장하여 출력
  • 데이터 수 만큼 자동으로 반복하여 출력

주의)

  • 우변에 있는 배열명의 자료형과 조변에 있는 변수명의 자료형은 반드시 일치해야 함
  • 만약 일치하지 않으면 error 발생

[문제2] 내가 여행 가고 싶은 5개 나라를 입력을 받아서 배열에 저장 후 배열에 저장된 나라를 화면에 보여주세요

public class ArrayExam_03 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		String[] n = new String[5];
		
		for(int i=0; i<5; i++) {
			
			System.out.print((i+1)+"번째 여행 가고 싶은 나라 이름 이력 : ");
			
			n[i] = sc.next();
			
		}
		
		System.out.println();
		
		for(int i=0; i<5; i++) {
			
			System.out.println((i+1)+" : "+ n[i]);
			System.out.print(n[i]+" \t"); // 옆으로 출력
			
		}
		
		// 단축 for문을 이용하여 배열을 출력해 보자
		for(String k : n) {
			System.out.println(k);
		}
		
		sc.close();

	}

}

2. 배열의 초기값을 이용하여 배열 생성

public class ArrayExam_04 {

	public static void main(String[] args) {
		
		// 배열을 생성함과 동시에 초기값을 설정하여 배열 생성하는 방법
		int[] arr1 = {10, 20, 30, 40, 50};
		
		for(int k : arr1) {
			System.out.print(k+"\t");
		}

	}

}

length 명령어

  • 배열의크기(길이)를 알려주는 명령어
  • 배열의크기(길이)를 정수값으로 알려줌

형식 ) 배열명.length

예) int size = arr.length;

import java.util.Scanner;

public class ArrayExam_05 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int[] arr = new int[3];
		
		System.out.println("arr 배열의 크기 >>> " + arr.length);
		
		System.out.println();
		
		for(int i=0; i<arr.length; i++) {

			System.out.print((i+1)+"번째 정수 입력 >>> " );
			
			arr[i] = sc.nextInt();
			
		}
		
		System.out.println();
		
		for(int i=0; i<arr.length; i++) {

			System.out.println("arr["+i+"] >>> "+arr[i]);
			
		}
		
		sc.close();

	}

}
import java.util.Scanner;

public class ArrayExam_06 {

	public static void main(String[] args) {


		Scanner sc = new Scanner(System.in);
		
		System.out.print("배열의 크기를 입력하세요 : ");
		
//		int size = sc.nextInt();
//		String[] str = new String[size];
		
		String[] str = new String[sc.nextInt()];
		
		for(int i = 0; i<str.length; i++) {
			System.out.print((i+1)+"번째 문자열 입력 : ");
			str[i] = sc.next();
		}
		
		// 문자열 배열에 저장된 내용을 화면에 출력해 보자
		for(int i = 0; i<str.length; i++) {
			
			System.out.println("str["+i+"] >>> " + str[i]);
		}
		System.out.println();
		
		// 문자열 배열에 저장된 문자열을 검색하여 보자
		System.out.print("검색할 문자열을 입력해 주세요 : ");
		
		String search = sc.next();
		
		for(int i = 0; i<str.length; i++) {
			
			if(search.equals(str[i])) {
				
				System.out.println("찾은 인덱스 >>> str["+i+"]" );
				System.out.println("찾은 문자열 >>> "+str[i]); 
			}
			
		}
		sc.close();

	}

}

★★★★★★★★★★★★★★중요★★★★★★★★★★★★★★

매우 중요한 개념임
배열의 이름heap 메모리 영역의 배열이 만들어진 곳의
시작 주소값을 가지고 있기 때문에 아래의 문장은 다른 배열의
배열명에 주소값을 복사
해 주는 명령어
즉, 배열의 공유가 이러우짐

public class ArrayExam_07 {

	public static void main(String[] args) {
		Scanner sc = new Scanner (System.in);
		
		System.out.print("문자열 배열 크기 입력 : ");
		
		String[] str = new String[sc.nextInt()];
		
		String[] strCopy = str; // 주소값 복사 
		// 따라서 str, strCopy 값이 같음
		
		System.out.println("str 배열 주소값 >>> " + str);
		System.out.println("strCopy 배열 주소값 >>> " + strCopy);
		
		// strCopy 배열에 초기값을 할당
		
		for(int i = 0; i < strCopy.length; i++) {
			
			System.out.print((i+1)+"번째 문자열 입력 : ");
			strCopy[i] = sc.next();
			
		}
		
		// str 배열에 있는 데이터를 출력해 보자
		for(int i = 0 ; i<str.length; i++) {
			
			System.out.println("str["+i+"] >>> " + str[i]);
			
		}
		sc.close();
	}

}

문제 1. 키보드로 배열에 정수 데이터를 저장할 예정

  • 내림차순(큰 -> 작)으로 정렬
    예) 19, 43, 6, 97, 65
    ==> 97, 65, 43, 19, 6
import java.util.Scanner;

public class ArrayExam_08 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("정수형 배열 크기 입력 : ");
		
		int[] sort = new int[sc.nextInt()];
		
		// 배열에 키보드로 데이터 저장
		for (int i=0; i<sort.length; i++) {
			System.out.print((i+1)+"번째 정수 입력 : ");
			sort[i]=sc.nextInt();
		}
		
		// 내림차순으로 정렬
		int temp = 0;
		
		for (int i=0; i<sort.length; i++) {
			
			for(int j=i+1; j<sort.length;j++) {
				
				if(sort[j] > sort[i]){
					
					temp = sort[i]; 
					sort[i]=sort[j];
					sort[j]=temp;
					// = 기준으로 뒤의 값을 앞에 넣어줌
							
				}
			}
		}
		
		// 내림차순으로 정렬한 sort 배열을 화면에 출력
		for (int i=0; i<sort.length; i++) { 
			System.out.print(sort[i] + "\t");
		}
		
		sc.close();

	}

}

다차원 배열

  • 1차원 배열이 여러개 묶여 있는 형태의 배열을 말함
  • 행과 열의 개념이 적용됨
public class ArrayExam_09 {

   public static void main(String[] args) {
      
      // 다차원 배열 선언 및 메모리 생성
      int[][] arr = new int[3][4];   // 3행 4열 2차원배열
      
      int count = 10;
      
      System.out.println("arr 배열 길이 >>> " + arr.length);
      
      for(int i = 0; i < arr.length; i++) { // 행 (3개)
         
         for(int j = 0; j < arr[i].length; j++) {  // 열 
            
            arr[i][j] = count;
            
            count += 10;    // count = count + 10;
            
         }
      }
      
         for(int i = 0; i < arr.length; i++) { // 행 (3개)
         
         for(int j = 0; j < arr[i].length; j++) {  // 열 (4개)
            
            System.out.print("arr[" + i + "][" + j + "] >>> " + arr[i][j] + "\t");
         }
         System.out.println();
      }
         
//         for(int i = 0; i < arr.length; i++) { // 행 (3개)
//             
//             for(int j = 0; j < arr[i].length; j++) {  // 열 
//                
//                arr[i][j] = count;
//                
//                count += 10;    // count = count + 10;
//                
//                System.out.print("arr[" + i + "][" + j + "] >>> " + arr[i][j] + "\t");
//                
//             }
//             System.out.println();
//          } --> 하나로도 축약 가능
         
   }
}

다차원 배열의 가변 배열

  • java의 다차원 배열은 행마다 서로 다른 열을 가질 수 있음
    행의 크기를 먼저 결정하고, 열의 크기는 가변적 할당을 하는 배열

  • 가변 배열을 사용하는 이유 : 메모리 손실을 초기화하기 위함

public class ArrayExam_10 {

	public static void main(String[] args) {
		
		// 다차원 배열의 가변 배열 선언 및 메모리 생성
		// 행 : 4행, 열 : 미지정
		int[][] score = new int[4][];
		
		// 가변 배열의 열 메모리 생성
		score[0] = new int[3];	// 1행 3열
		score[1] = new int[1];	// 2행 1열
		score[2] = new int[2];	// 3행 2열
		score[3] = new int[4];	// 4행 4열
		
		int count = 10;
		
		for(int i = 0; i < score.length; i++) {
			
			for(int j = 0; j < score[i].length; j++) {
				
				score[i][j] = count;
				
				System.out.print(score[i][j] + "\t");
				
				count += 10;
			}
			System.out.println();
		}

	}

}

문제풀기

최대값 / 최소값 알고리즘

[문제1] 키보드로 배열의 크기를 입력 받아서 생성된 배열요소 만큼
임의의 정 수를 키보드로 입력 받은 후 그 중 최대값과 최소값을
구하시오.

import java.util.Scanner;

public class Exam_01 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner (System.in);
		
		System.out.print("배열의 크기를 입력하세요 : ");
		
		int[] arr = new int[sc.nextInt()];
		
		// 최대값 저장할 변수와 최소값 저장할 변수 선언
		int max = 0, min = 999; //생각하는 가장 큰 값
		
		for(int i = 0; i < arr.length; i++) {
			System.out.print((i+1)+"번째 값 입력 : ");
			arr[i]=sc.nextInt();
			
			// 최대값
			if(arr[i]>max) {
				max = arr[i];
			} 
			
			// 최소값
			if(arr[i]<min) {
				min = arr[i];
			} 
		}
		
//		int min = max;
//		
//		for(int i = 0; i < arr.length; i++) {
//			
//			if(arr[i]<min) {
//				min = arr[i];
//			} 
//		}
//		
		System.out.printf("max : %d, min : %d",max,min);
		
		sc.close();

	}

}

정렬 알고리즘

[문제2] 임의의 숫자 5개를 키보드로 입력 받아서 배열에 저장한 후, 내림차순으로 정렬하여 출력하시오.

import java.util.Scanner;

public class Exam_02 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		System.out.println("다섯개 숫자 입력");
		
		// 정부형 배열 선언 - 배열의 크기 5
		int[] arr = new int[5];
		
		// 배열에 키보드로 데이터를 입력하여 저장
		for(int i = 0; i< arr.length; i++) {
			arr[i]=sc.nextInt();
		}
		
		// 내림차순 정렬
		int temp = 0;
		
		for(int i = 0; i< arr.length; i++) {
			
			for(int j = i+1; j<arr.length; j++) {
				if(arr[j]>arr[i]) {
					temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
				
		}
		
		System.out.println("****내림차순으로 정렬****");
		// 내림차순으로 정렬된 arr 배열을 화면에 출력
		for (int i=0; i<arr.length; i++) { 
			System.out.print(arr[i] + "\t");
		}
		
		sc.close();
		
	}

}

배열 알고리즘

[문제3]) 키보드로 학생 수와 이름, 국어점수, 영어점수, 수학점수 배열에 저장 후 총점, 평균, 학점, 석차 배열에 성적을 처리한 후 화면에 아래와 같이 출력되도록 하세요.

import java.util.Scanner;

public class Exam_03 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.print("학생 수를 입력하세요. : ");
//		int studentCount = sc.nextInt();
		
		// 학생 이름, 국어 점수, 영어 점수, 수학 점수, 총점, 평균, 학점, 순위 배열
		String[] names = new String[sc.nextInt()]; // 이름 배열
		int[] kor = new int[names.length];		  // 국어점수 배열
		int[] eng = new int[names.length];		  // 영어점수 배열
		int[] mat = new int[names.length];		  // 수학점수 배열
		int[] sum = new int[names.length];		  // 총점 배열
		double[] avg = new double[sum.length];	  // 평균 배열
		String[] grade = new String[avg.length];  // 학점 배열
		int[] rank = new int[grade.length];  // 순위 배열
		
		// 입력 받아 배열에 저장
		for(int i=0; i<rank.length; i++) { // rank 아니어도 됨
			
			System.out.print("이름 입력 : ");
			names[i] = sc.next();
			
			System.out.print("국어점수 입력 : ");
			kor[i] = sc.nextInt();
			
			System.out.print("영어점수 입력 : ");
			eng[i] = sc.nextInt();
			
			System.out.print("수학점수 입력 : ");
			mat[i] = sc.nextInt();
			
			// 총점과 평균 그리고 학점
			// 총점
			sum[i] = kor[i] + eng[i] + mat[i];
			
			// 평균
			avg[i] = sum[i]/3.0;
			
			// 학점
			if(avg[i]>=90) {
				grade[i] = "A학점";
			}else if(avg[i]>=80) {
				grade[i] = "B학점";
			}else if(avg[i]>=70) {
				grade[i] = "C학점";
			}else if(avg[i]>=70) {
				grade[i] = "D학점";
			}else {
				grade[i] = "F학점";
			}
			
			// 석차(순위)
			rank[i] = 1;
		}
		// 실제로 석차 구하기
		for(int i = 0; i < rank.length; i++) { // rank 아니어도 됨
			
			for(int j = 0; j < rank.length; j++) {
				
				if(sum[j]>sum[i]) {
					
					rank[i]++;
					
				}
			}
			
		}
		// 마지막으로 성정 출력
		for(int i = 0; i < names.length; i++) { // rank 아니어도 됨
			
			System.out.println(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
					
					);
			System.out.print("이 름 : "+names[i]+"\t");
			System.out.print("총 점 : "+sum[i]+"점\t");
			System.out.printf("평 균 : %.2f점\t",avg[i]);
			System.out.print("학 점 : "+grade[i]+"\t");
			System.out.print("순 위 : "+rank[i]+"등\t");
			System.out.println();
			
		}
		
		sc.close();
		
	}
		
}
	


[문제4]) 아래와 같은 결과가 나타나도록 코딩해 보세요

package exam;

public class Exam_04 {

	public static void main(String[] args) {
		
		// 1. 다차원 배열 선언 및 메모리 할당
		
		int arr[][] = new int[5][5]; // 5행 5열
		
		int count = 1;
		
		// 5행 5열 다차원 배열에 데이터를 저장
		for(int i = 0; i < arr.length; i++) { // 고정 - 행
			
			for(int j=0; j<arr[i].length; j++) { // 값 변동 - 열
				
				// arr[i][j]=count; count++;
				arr[i][j]=count++; 
				// 한 줄로 축약 가능
				
				// System.out.print(arr[i][j]+"\t"); 
									// 한번에 출력하기 보단
				
			}
			//System.out.println();
		}
		
		// 저장된 다차원 배열을 화면에 출력 - 전체적으로 한번 더 출력해주면 좋음
		
		for(int i = 0; i < arr.length; i++) { // 고정 - 행
			
			for(int j=0; j<arr[i].length; j++) { // 값 변동 - 열
				
				System.out.print(arr[i][j]+"\t");
			}
			System.out.println();
		}

	}

}

1.

public class Exam_05 {

	public static void main(String[] args) {
		
		int arr[][] = new int[5][5];
		
		int count = 1;
		
		for(int i = 0; i<arr.length; i++) { // 고정 - 행
			
			for(int j = 0; j<arr[i].length; j++) { // 변동 - 행
				
				arr[i][j]= count++;
				
			}
		}
		
		for(int i = 0; i<arr.length; i++) { // 고정 - 행
			
			for(int j = 0; j<arr[i].length; j++) { // 변동 - 행
				
				System.out.print(arr[i][j]+"\t");
				// System.out.printf("%2df\t",arr[i][j]); - 간격 맞게 출력
				
			}
			System.out.println();
		}

	}

}

2.

public class Exam_05_02 {

	public static void main(String[] args) {
		
		int arr[][] = new int[5][5];
		
		int count = 1;
		
		for(int i = 0; i<arr.length; i++) {
			count =(i+1);
			for(int j = 0; j<arr[i].length; j++) {
				
				arr[i][j]= count;
				count += 5;
				System.out.print(arr[i][j]+"\t");
				
			}
			System.out.println();
		}

	}



	}

다차원 배열의 가변배열 이용

public class Exam_06 {

	public static void main(String[] args) {
		
		int[][] arr = new int[5][];
		
		int count = 1;
		
		// 열 만들어주기
		
//		arr[0]= new int[1]; // 1행 1열
//		arr[1]= new int[2]; // 2행 2열
//		arr[2]= new int[3]; // 3행 3열
//		arr[3]= new int[4]; // 4행 4열
//		arr[4]= new int[5]; // 5행 5열
		
		// 반복문으로 만들기
		for(int i = 0; i< arr.length; i++) {
			arr[i] = new int[i+1];
		}
		
		// 가변배열에 데이터 저장
		for(int i = 0; i<arr.length; i++) { // 행
			
			for(int j = 0; j < arr[i].length; j++) { // 열
				
				arr[i][j]=count++;
				
			}
			
		}
		
		// 출력
		for(int i = 0; i<arr.length; i++) { // 행
			
			for(int j = 0; j < arr[i].length; j++) { // 열
				
				System.out.print(arr[i][j]+"\t");
				
			}
			System.out.println();
		}
		
	}

}

profile
나다

0개의 댓글