국비 수업 7일차

김성수·2022년 10월 31일
0
post-thumbnail

1. 길이가 자동으로 증가하는 배열

정수를 원하는 만큼 입력받는다. 그러나 처음 지정한 공간에서 더 이상 공간이 부족하다면 어떤 조건을 기준으로 새로운 공간을 생성하고, 그걸 얼마만큼 늘려줄 것인지를 추가로 생각한다. 또한, 한번 만든 배열의 길이는 절대 늘어날 수 없으므로 참조를 이용한 스위칭도 생각해야 할 것이다.

package array;

import java.util.Scanner;

public class Ex01 {
	static void show(int[] arr) {
		System.out.printf("arr[%d] : { ", arr.length);
		for(int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]);
			System.out.print(i == arr.length - 1 ? " }\n" : ", ");
		}
	}
	
	public static void main(String[] args) {
		// 길이가 자동으로 증가하는 배열 만들어보기
		// Reference Type 의 이해

		// 자바에서 primitive를 제외한 모든 유형의 데이터는 참조변수를 활용한다
		// 참조변수는 그 자체가 본체는 아니고, 참조하는 대상을 바꿀 수 있다
		
		Scanner sc = new Scanner(System.in);
		int length = 3;
		int[] arr = new int[length];
		int[] tmp;	// 새로운 배열을 위한 참조 변수 (초기값은 없음)
		int input;	// 사용자가 입력하는 정수를 받는 변수
		// C언어의 배열은 길이에 변수를 넣을 수 없다. 자바는 가능하다
		
		show(arr);
		
		// 조건1) 사용자가 0을 입력할 때 까지, 정수를 입력받는다
		// 조건2) 입력받은 정수는 모두 배열에 저장되어야 한다
		// 조건3) 순서를 유지하기 위해, 정렬은 수행하지 않는다
		// 조건4) 만약, 배열의 모든 값을 입력받았다면, 단위길이만큼 증가시킨 새로운 배열을 생성
		// 조건5) 새로운 배열은 기존 배열의 숫자를 모두 복사하여 가지고 있어야 한다
		
		while(true) {
			System.out.print("정수 입력 : ");
			input = sc.nextInt();
			if(input == 0) {
				break;
			}
			for(int i = 0; i < arr.length; i++) {
				if(arr[i] == 0) {	// 빈칸을 찾아서
					arr[i] = input;	// 입력값을 저장하고
					break;			// for 탈출
				}
			}
			show(arr);
			
			if(arr[arr.length - 1] != 0) {			// 배열이 꽉 찼으면
				tmp = new int[arr.length + length];	// 새로운 배열을 생성하고
				for(int i = 0; i < arr.length; i++) {	// 기존 배열값을
					tmp[i] = arr[i];					// 신규 배열에 복사한다
				}
				arr = tmp;
			}
		}
		
		System.out.println("끗");
		sc.close();
		
	}
}

2. 이차원 배열의 구조

이중 for문을 응용하여 원하는 값을 채울 수 있다

package array;

public class Ex05 {
	public static void main(String[] args) {
		
		int[] arr1 = {  1,  2,  3,  4,  5 };
		int[] arr2 = {  6,  7,  8,  9, 10 };
		int[] arr3 = { 11, 12, 13, 14, 15 };
		int[] arr4 = { 16, 17, 18, 19, 20 };
		int[] arr5 = { 21, 22, 23, 24, 25 };
		
		int[][] arr = { arr1, arr2, arr3, arr4, arr5 };
		
		
		
		System.out.println(arr[0][0]);
		System.out.println(arr[2][3]);
		System.out.println(arr[4][4]);
		
		arr = new int[5][5];	// 모든 값은 0으로 초기화된다
		
		for(int i = 0; i < arr.length; i++) {
			for(int j = 0; j < arr[i].length; j++) {
				arr[i][j] = i * 5 + j + 1;
			}
		}
		System.out.println(arr[0][0]);
		System.out.println(arr[2][3]);
		System.out.println(arr[4][4]);

		
		
		
		arr = new int[][] {
//			i			j [0] [1] [2] [3] [4] 	
		/* [0] */		{  1,  2,  3,  4,  5 },
		/* [1] */		{  6,  7,  8,  9, 10 },
		/* [2] */		{ 11, 12, 13, 14, 15 },
		/* [3] */		{ 16, 17, 18, 19, 20 },
		/* [4] */		{ 21, 22, 23, 24, 25 }
				};
		
		for(int i = 0; i < arr.length; i++) {
			for(int j = 0; j < arr[i].length; j++) {
				System.out.printf("arr[%d][%d] : %d\n", i, j, arr[i][j]);
			}
		}
		
	}
	
}

3. 오버로딩과 오버라이딩의 차이

  • 오버로딩은 현재 클래스 안에 같은 이름의 함수가 여러개 있는 것
  • 오버라이딩은 슈퍼클래스에게 [상속]을 받아서 함수가 이미 있는데, 같은 형식으로 새로 쓰면 덮어 쓰는 것을 의미한다.
```java package array;

public class StringList {

// 클래스 내부의 함수들이 공통적으로 참조할 수 있는 변수
// 함수의 지역변수와 구분하기 위해서, 멤버 필드라고 부른다
// 멤버필드는 노란색, 지역변수는 군청색 (이클립스 어두운 테마 기준)
private String[] arr = new String[0];

public void add(String str) {
	String[] tmp;

	tmp = new String[arr.length + 1];
	
	for(int i = 0; i < arr.length; i++) {
		tmp[i] = arr[i];
	}
	arr = tmp;
	
	arr[arr.length - 1] = str;
}

// 오버로딩 : 현재 클래스 안에 같은 이름의 함수가 2개 이상 있다
// 오버라이딩 : 슈퍼클래스에게 [상속] 받아서 이미 있는데, 같은 형식으로 새로 쓰면 덮어쓴다

@Override	// Object.toString()
public String toString() {		// System.out.println(객체);	위 아래 두개는 동일하다
	String ret = "[";			// System.out.println(객체.toString());
	for(int i = 0; i < arr.length; i++) {
		if(arr[i] != null) {
			ret += arr[i];
		}
		ret += i == arr.length - 1 ? "]" : ", ";
	}
	return ret;
}

public int size() {
	return arr.length;
}

}


  
  
profile
다들 잘하는데 나만 못해?

0개의 댓글