본문 바로가기
Programming Language/Java

[국비] Java 내용정리 Day06

by tpleehan 2021. 11. 1.

배열

메모리에 정수 5개를 저장해서 쉽게 관리하고 싶은데 이런 식으로 각각의 변수에 저장한다면 불편함이 있다.
만약 정수 5개가 아니라 500개라면 각각 변수를 선언해서 지정해야 한다면 큰 불편함이 있다.

  • 배열(array)이란 한 개의 변수여러 개의 데이터를 저장하고 참조하고 싶을 때 사용한다.
  • 복수의 데이터를 하나의 변수로 통제할 수 있다는 장점을 가지고 인덱스라는 순차적인 번호로 부여되어 있어서 반복문 처리도 수월해진다.
  • 같은 데이터 타입의 값을 집합 형태로 나열하기 위한 자료형
import java.util.Arrays;

public class ArrayBasic {
	public static void main(String[] args) {

		// 배열 변수의 선언
		int[] arr; // java언어 style
		int arr2[]; // c언어 style

		arr = new int[5];

//		arr = 65; (x)
		arr[0] = 65;
		arr[1] = 88;
		arr[2] = arr[0];
		arr[3] = (int) 3.14;
//		arr[4] = "문자열"; (x) 문자열은 변환을 할 수 없다.
		arr[4] = 100;
//		arr[5] = 77; (x) index 범위 초과
		
		System.out.println("arr 배열의 길이: " + arr.length);	
		
		System.out.println("배열의 1번째 데이터: " + arr[0]);
		System.out.println("배열의 2번째 데이터: " + arr[1]);
		System.out.println("배열의 3번째 데이터: " + arr[2]);
		System.out.println("배열의 4번째 데이터: " + arr[3]);
		System.out.println("배열의 5번째 데이터: " + arr[4]);

		System.out.println("----------------------------");
		
		for(int idx = 0; idx < arr.length; idx++) {
			System.out.printf("배열의 %d번째 데이터: %d\n", idx+1, arr[idx]);
		}
		
		System.out.println(Arrays.toString(arr));

		double[] dArr = new double[3];
		String[] sArr = new String[4];
		byte[] bArr = new byte[10];
		
		System.out.println(Arrays.toString(dArr));
		System.out.println(Arrays.toString(sArr));
		System.out.println(Arrays.toString(bArr));
		
		char[] letters = new char[] {'A', 'B', 'C', 'D'};
		System.out.println(Arrays.toString(letters));

		String[] names = {"홍길동", "김철수", "박영희"};
//		names = {"홍길동", "김철수", "박영희", "김뽀삐"}; (x)
		names = new String[] {"홍길동", "김철수", "박영희", "김뽀삐"};		
	}
}
  • 배열 객체를 생성할 때 실제 값이 저장될 공간을 형성하기 위해 생성할 때 배열의 크기를 정해야 한다.
  • 배열의 초기화 - 배열 내부에 실제 값을 저장한다. 배열의 초기화는 인덱스를 통해 수행한다.
    • 인덱스란? 배열 내부의 위치를 지정할 수 있는 값이며 인덱스는 0번부터 시작하여 1씩 순차적으로 증가한다.
  • 배열의 총 크기(길이) 확인을 하려면 배열변수명.length를 사용하면 된다.
  • 배열의 반복문 처리 - 배열은 인덱스 번호를 제어 변수로 활용하여 반복문을 쉽게 처리할 수 있다.
  • 배열 내부의 요소 값을 문자열 형태로 한눈에 출력할 수 있다.
  • 배열의 선언과 생성을 동시에 할 수 있다.
  • 배열은 생성됨과 동시에 각 타입의 기본값으로 자동 초기화된다.
  • 배열의 생성과 동시에 초기화 진행하는 방법
    • 선언과 동시에 초기화를 할 때 딱 1번만 가능한 문법.
    • 배열은 크기가 고정이기 때문에 늘어나거나 줄어들 수 없다.
    • 만약 배열의 크기를 늘리거나 줄이고 싶다면 기존의 배열을 조작하는 것이 아니라 새롭게 생성해야 한다.

배열의 특징

  • homogeneous
    • 배열은 동종모음구조 이다. 따라서 같은 데이터 형태만 저장할 수 있다.
      int배열은 int들만 String배열은 String만 저장시킬 수 있다.
  • immutable
    • 한번 생성된 배열은 크기(길이)를 늘이거나 줄일 수 없다.
      만약 5개를 저장할 배열에 생성했다면 프로그램 실행 중에 7개로 늘이거나 2개로 줄일 수 없고
      새로운 배열을 생성하여 값을 복사시켜서 이동해야 한다.
  • reference type
    • 배열은 참조 타입으로 변수에 실제 값이 아닌 데이터 객체의 주소 값을 저장한다.
public class EnhancedForLoop {
	public static void main(String[] args) {
		
		String[] week = {"월", "화", "수", "목", "금", "토", "일"};
		
//		for(int i = 0; i < week.length; i++) {
//			System.out.println(week[i] + "요일");
//		}
		
		for(String day : week) {
			System.out.println(day + "요일");	
		}
		
		/*
		 1. scores라는 이름으로 int배열을 하나 선언해서
		    점수 데이터를 저장한다.
		    {96, 88, 74, 63, 100, 55}
		    
		 2. 향상 for문(forEach)을 사용하여 총점과 평균을 구하라.
		    총점(int), 평균(double, 소수점 둘째 자리까지 출력)
		 */
		
		int[] scores = {96, 88, 74, 63, 100, 55};
		int total = 0;
		
		for(int arrScore : scores) {
			total += arrScore;
		}
		
		double avg = total / (double) scores.length;
		
		System.out.println("총점 : " + total + "점");
		System.out.printf("평균 : %.2f점", avg);			
	}			
}

EnhancedForLoop (forEach) / 향상된 for문

  • 제어 변수(인덱스)의 사용 없이 배열 내부의 요소를 전체 참조할 수 있게 해주는 반복문
  • 인덱스를 지정할 수 없기 때문에 범위를 세밀하게 지정할 수 없다. 
for(배열 요소를 받아줄 수 있는 변수 : 배열변수명) {
    반복 실행문...
}
import java.util.Scanner;

public class ArrayInsert {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		String[] names = new String[6];
		
		for(int i = 0; i < names.length; i++) {
			System.out.print("이름을 입력하세요. : ");
			String name = sc.next();

			if(name.equals("그만")) {
				System.out.println("입력을 종료합니다.");
				break;
			}
			names[i] = name;
		}
		
//		System.out.println(Arrays.toString(names));
		
		System.out.println("------------------------------");
		System.out.print("입력받은 이름: ");
		for(String n : names) {
			if(n == null) {
				break;
			}
			System.out.print(n + " ");
		}
		
		sc.close();
	}
}
  • 저바에서 문자열 동등 비교 시 '==' 연산자를 사용하면 제대로 비교하지 못한다.
    • 문자열 String 타입이 기본 데이터 타입이 아닌 객체 참조 타입이기 때문이다.
      객체 참조 타입은 해당 값을 직접 들고 있지 않고 객체의 주소값을 들고 있기 때문에
      문자열이 아무리 같더라도 주소가 다르면 false를 도출한다.
    • 문자열 동등 비교를 진행할 때는
      [비교문자열1.equals(비교문자열2)]를 사용해서 비교를 진행해야 한다.

ArrayInsert Quiz

문제)
1. String 배열을 생성. (foods) 크기는 50개로 지정
2. 사용자에게 음식 이름을 입력 받아서 배열에 삽입한다.
    사용자가 음식 입력창에 '배불러' 라고 작성하면 입력을 종료한다.
3. 입력이 종료되면 사용자가 입력한 음식을 가로로 출력한다. (null은 출력하지 않는다.)

*** 추가 문제 ***
입력을 받았는데 이미 배열에 존재하는 음식이라면
'이미 존재하는 음식입니다.' 를 출력하고 다시 새로운 음식을 입력 받을 수 있도록 코드를 제어한다.
import java.util.Scanner;

public class ArrayInsertQuiz {
	public static void main(String[] args) {
    
		String[] foods = new String[50]; //음식의 이름을 입력 받는 배열 변수명: foods라는 String 배열 생성
		Scanner sc = new Scanner(System.in); //입력 받을 스캐너 선언
		
		for(int i = 0; i < foods.length; i++) { 			
			System.out.print("음식 이름을 입력하세요 : ");
			String foodName = sc.nextLine();			
			
			if(foodName.equals("배불러")) { //배열에 들어가지 않도록 입력 종료 선언
				System.out.println("입력을 종료합니다.");
				break;
			}
			
			int j;
			for(j = 0; j< foods.length; j++) {
				if(foodName.equals(foods[j])) {
					break;
				}
			}
			
			if(j != foods.length) {
				System.out.println("이미 존재하는 음식입니다.");
				i--;
				continue;				
			}
			
			foods[i] = foodName;			
		}
		
		System.out.println("--------------------------------------");
		System.out.print("먹고 싶은 음식들: ");
		
		for(String f : foods) {
			if(f == null) {
				break;
			}
			System.out.print(f + " ");
		}
		
		sc.close();		
	}
}​
import java.util.Arrays;
import java.util.Scanner;

public class ArrayModify {
	public static void main(String[] args) {
		
		String[] foods = {"삼겹살", "족발", "피자", "햄버거"};
		System.out.println(Arrays.toString(foods));
		
		foods[0] = "치킨";
		foods[2] = "탕수육";
		System.out.println(Arrays.toString(foods));
		
		//배열의 인덱스 탐색
		System.out.println("-------------------------------");
		Scanner sc = new Scanner(System.in);
		System.out.print("탐색할 음식을 입력하세요: ");
		String name = sc.next();

		for(int i = 0; i < foods.length; i++) {
			if(name.equals(foods[i])) {
				System.out.println("탐색 완료");
				System.out.println("인덱스: " + i + "번");
				break;
			} else if(i == foods.length - 1) {
				System.out.println("없는 음식 입니다.");
			}
		}
		/*
		boolean flag = false;
		for(int i = 0; i < foods.length; i++) {
			if(name.equals(foods[i])) {
				System.out.println("탐색 완료");
				System.out.println("인덱스: " + i + "번");
				flag = true;
				break;
			} 			
		}
		
		if(!flag) { //flag == false 와 같음
			System.out.println("없는 음식 입니다.");
		}
		 */
		
		sc.close();
	}		
}
import java.util.Arrays;

public class ArrayDelete {
	public static void main(String[] args) {
		
		int[] arr = {1, 3, 5, 7, 9, 11, 13};
//		출력값 : {1, 3, 5, 9, 11, 13}		
		
//		arr[3] = arr[4];
//		arr[4] = arr[5];
//		arr[5] = arr[6];
		
		//삭제되는 값을 기준으로 뒤에 있는 값을 한칸씩 앞으로 땡기는 작업.
		//추후에 생성될 새 배열에 값을 그대로 대입할 때 편하게 대입하도록 작업
		for(int i = 3; i < arr.length-1; i++) {
			arr[i] = arr[i+1]; 
		}
		
		//기존의 배열보다 크기가 하나 작은 새 배열 생성.
		int[] temp = new int[arr.length - 1];
		
		//원본 배열의 값을 새 배열에 인덱스 맞춰서 그대로 대입하기.
//		temp[0] = arr[0];
//		temp[1] = arr[1];
//		temp[2] = arr[2];
		
		for(int j = 0; j < temp.length; j++) {
			temp[j] = arr[j];
		}
		
//		System.out.println(arr);
//		System.out.println(temp);
		
		arr = temp; //temp의 주소값을 arr에게 넘긴다.
		temp = null; //주소값을 지워서 메모리에서 temp는 자동 소멸되게 한다.
		
		System.out.println(Arrays.toString(arr));		
	}
}

ArrayDelete Quiz

문제)
1. 삭제할 친구를 입력 받아서 삭제를 진행한다.
2. 입력받은 이름이 없다면 없다고 얘기한다.
import java.util.Arrays;
import java.util.Scanner;

public class ArrayDeleteQuiz {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		String[] kakao = {"무지", "네오", "어피치", "라이언", "제이지", "튜브", "콘"};
		System.out.println("현재 저장된 친구들: " + Arrays.toString(kakao));
		
		System.out.print("삭제할 친구를 입력하세요. : ");
		String name = sc.next();

		int i;
		for(i = 0; i < kakao.length; i++) {
			if(name.equals(kakao[i])) {
				break;
			} else if(i == kakao.length - 1) {
				System.out.println(name + "은(는) 없는 이름입니다.");
			}
		}
		
		if(i != kakao.length) {
			for(int j = i; j < kakao.length - 1; j++) {
				kakao[j] = kakao[j+1];
			}
			String[] temp = new String[kakao.length - 1] ;
			for(int k = 0; k < temp.length; k++) {
				temp[k] = kakao[k];
			}
			kakao = temp;
			temp = null;
			
			System.out.println(Arrays.toString(kakao));
		}
		
		
		/*
		boolean flag = false;
		for(int i = 0; i < kakao.length; i++) {
			if(name.equals(kakao[i])) {
				flag = true;
				for(int j = i; j < kakao.length - 1; j++) {
					kakao[j] = kakao[j+1];
				}
				break;
			}
		}
		
		if(!flag) {
			System.out.println(name + "은(는) 없는 이름입니다.");
		} else {
			String[] temp = new String[kakao.length - 1] ;
			for(int k = 0; k < temp.length; k++) {
				temp[k] = kakao[k];
			}
			kakao = temp;
			temp = null;
			
			System.out.println("삭제 후 정보: " + Arrays.toString(kakao));
			
		} 
		 */
		sc.close();
	}
}​

'Programming Language > Java' 카테고리의 다른 글

[국비] Java 내용정리 Day08  (0) 2021.11.05
[국비] Java 내용정리 Day07  (0) 2021.11.03
[국비] Java 내용정리 Day05  (0) 2021.10.29
[국비] Java 내용정리 Day04  (0) 2021.10.29
[국비] Java 내용정리 Day03  (0) 2021.10.28

댓글