본문 바로가기
학교 공부/자바

[JAVA] 자바 4번째 수업

by krapoi 2022. 4. 13.
반응형

오늘은(04-13) 자바의 배열에 대해 배웠다.

 

 

배열

배열의 선언

일단 자바에서는 배열을 선언하는 것이 2개의 방법이 있다고 한다.

int[] array1;
int array2[];

위 와 같이 2가지의 방법이 있는데, 첫 번째 방법이 자료형만 봐도 배열인 것을 알 수 있기에 첫 번째 방법으로 수업을 진행했다.

 

배열의 정의

그다음 이 배열을 사용하려면 배열을 정의해야 한다.

배열을 정의하는 방법은 다음과 같다.

String[] countries =  new String[5];

이런 식으로 배열을 정의할 수 있다.

String 뿐만 아니라 다른 자료형도 가능하다.

 

이런 배열에 값을 집어넣는 방법은 다음과 같다.

countries[0] = "Korea";
countries[1] = "Germany";

이런 식으로 하게 되면 countries의 배열의 첫 번째의 값은 Korea가 된다.

2번째 값은 Germany가 된다.

 

그리고 프로그래밍에서는 첫 번째를 1번째가 아니라 0번째부터 세기 때문에 첫 번째에 값을 넣고 싶다면, 0번째 자리에 넣어줘야 한다.

 

그렇기에 배열의 값은 0부터 정의한 n값의 -1만큼의 값만 넣을 수 있다.

만약 아래와 같이

countries[100] = "Japan";

값을 넣어버리면 IndexofOutBound라는 예외가 나와버린다.

 

배열의 초기값

배열을 만들 때 빈 공간에는 무엇이 들어있는지 모른다.

C의 경우에는 더미 값이 들어오게 되는데 자바에서는 어떤 식으로 되는지 살펴보자.

int[] intArray = new int[1];
double[] doubleArray = new double[1];
boolean[] booleanArray = new boolean[1];
String[] StringArray = new String[1];

System.out.println("int : " + intArray[0]);
// 0
System.out.println("double : " + doubleArray[0]);
// 0.0
System.out.println("boolean : " + booleanArray[0]);
// false
System.out.println("String : " + StringArray[0]);
// null

이런 식으로 기본적으로 초기화를 시켜준다.

그런데 이 경우에는 기본형들만 초기화를 시켜준다(int, double, boolean...)

참 조형인 String의 경우에는 초기화를 시켜주지 않고 null값이 들어가게 된다.

 

하지만 이렇게 배열들을 초기화시키지 않고 사용하는 경우는 별로 없다.

대부분 초기값을 주게 되는데 이 초기값에 대해 알아보자.

 

배열의 초기화

String[] colors = {"red","green","blue","magenta"};
int[] numbers = {1,2,3,4,5,6};

이런 식으로 배열들을 초기화시켜주면 중괄호 안에 값의 수만큼 배열의 크기를 잡아 값들을 넣게 된다.

위 colors를 예로 들면 colors의 배열의 크기는 4인 것이다.

 

Loop문

그리고 이 배열하면 빠질 수가 없는 것이 루프 문과 같이 사용하는 것이다.

배열은 루프 문과 정말 잘 맞는다.

이런 배열을 for문으로 일단 출력해보자.

String[] colors = {"red","green","blue","magenta"};
	for (int i = 0; i < 4; i++) {
	System.out.println(colors[i]);
	}

이런 식으로 짤 수 있는데,

이렇게 짜면 colors에 값이 추가되거나 줄어듬에 따라 for문을 다시 수정해야 하는 단점이 있다.

 

그래서 자바에서는 다르게 짤 수 있다.

String[] colors = {"red","green","blue","magenta"};
	for (int i = 0; i < colors.length; i++) {
		System.out.println(colors[i]);
	}

이런 식으로 하면 colors 배열의 길이가 아무리 달라져도 최댓값까지 for문을 돌릴 수 있다.

참고로 length는 배열에만 한정된 것이 아니라 list 같은 것들도 적용이 된다.

 

그다음은 foreach문이다.

for(String color : colors) {
	System.out.println(color);
}

이런 식으로 사용할 수 있다.

이렇게 하면 배열의 길의 최댓값까지 for문이 돌면서 임시 변수인 color에 colors의 값이 들어가게 된다.

for문으로 풀어서 쓰면

for(int i = 0; i < colors.length; i++) {
	String color = colors[i]
	System.out.println(color);
			}

이렇게 된다.

이런 foreach문에 저런 장점이 있다면 단점도 있는데, 배열의 위치를 가져올 수 가없다.

즉, 지금 돌고 있는 값이 colors배열의 몇 번째 값인지 위치를 가져올 수 없다는 것이다.

 

그러면 이 배열들을 이용해서 배열들의 값의 평균값을 구하는 코드를 짜 볼 것이다.

 

배열 예제

int[] ages = {18,20,52,31,8,13,22,31,3,12};
			
    double average = 0;
    for(double age : ages) {
        average += age;
    }
    average /= (double) ages.length;
    System.out.printf("나이평균 : %.2f\n",average);

int배열인 ages에 있는 수들을 하나하나 검사하여 평균값을 구하는 코드이다.

사실 중요한 부분은 foreach문이 아닐까 싶다.

 

 배열의 참조

int value1 = 3;
	int value2 = value1;
	value2 = 10;
			
	System.out.println("int : " + value1 + "   " + value2);
			
	int[] array1 = {1,2,3};
	int[] array2 = array1;
	array2[1] = 100;
			
	System.out.println("arrray : " + array1[1] + "   " + array2[1]);
}

위 코드를 보자,

처음에 value들은 저런 식으로 했을 때, 

출력을 하면 3, 10이 나오게 된다.

 

하지만 배열은 100, 100이 나오게 된다. 그 이유는 배열은 이미 생성이 되어있고 array1은 생성된 배열을 가리키는 것이기 때문에 array2도 이미 생성된 {1,2,3}의 배열을 가리키는 것이기 때문이다.

그러므로 서로 같은 배열을 가리키고 있기 때문에 값을 바꾸면 두 개다 바뀌게 되는 것이다.

 

그러면 새로운 배열을 만들고 싶을 때는 어떻게 하나 싶은데

메소드를 하나 만들어 주자.

 

public int[] copy(int[] arr) {

	int[] ar = new int[arr.length];
	for(int i = 0; i < arr.length; i++)
		ar[i] = arr[i];
		
	
	return ar; 
}

이런 식으로 만들어서 사용하면 된다.

근데 사실 자바에 메소드가 존재하는 건 함정.

 

배열 응용

STACK

그냥 배열로 스택 구현하기이다.

public class Stack {
	public static int size = 10;
	
	private final String[] buffer;
	
	private int index;
	public Stack() {
		this.index = 0;
		this.buffer = new String[size];
	}
	
	
	public void push(String value) {
		this.buffer[this.index] = value;
		this.index++;
	}
	
	public String pop() {
		this.index--;
		return this.buffer[this.index];
	}
	
	public String top() {
		return this.buffer[this.index - 1];
	}
	
	public int getsize() {
		return this.index;
	}
	public static void main(String[] args) {
		Stack s = new Stack();
		s.push("Dog");
		s.push("Mouse");
		s.push("dragonfly");
		
		System.out.println(s.pop());
		System.out.println(s.pop());
		System.out.println(s.pop());
		
	}
}

스택 클래스를 구현하였다.

 

QUEUE

이것도 배열을 이용한 큐 구현하기이다. (환형 큐 아님)

public class Queue {
	public int size = 10;
	
	private final String[] buffer;
	
	private int index;
	
	private int start;
	
	public Queue() {
		// TODO Auto-generated constructor stub
		this.buffer = new String[size];
		this.index = 0;
		this.start = 0;
	}
	public void add(String value) {
		this.buffer[this.index] = value;
		this.index++;
	}
	
	public String poll() {
		this.start++;
		return this.buffer[this.start - 1];
	}
	
	public int getsize() {
		return this.index - this.start;
	}
	
	public boolean isFull() {
		if(this.index == this.size - 1 && this.start == 0)
			return true;
		else
			return false;
	}
	
	public boolean isEmpty(){
		return this.index == this.start;
	}
	
	
	public static void main(String[] args) {
		Queue s = new Queue();
		s.add("Dog");
		s.add("Mouse");
		s.add("dragonfly");
		
		System.out.println(s.poll());
		System.out.println(s.poll());
		System.out.println(s.poll());
	}

}

Circler QUEUE(환형 큐)

public class Queue {
	public int size = 10;
	
	private final String[] buffer;
	
	private int head;
	private int tail;
	
	private boolean full;
	public Queue() {
		// TODO Auto-generated constructor stub
		this.buffer = new String[size];
		this.head = 0;
		this.tail = 0;
		this.full = false;
	}
	public void add(String value) {
		
		if(isFull()) {
			throw new RuntimeException("Full");
		}
		
		this.buffer[this.head] = value;
		this.head = (this.head + 1) % size;
		
		this.full = (this.head == this.tail);
		
	}
	
	public String poll() {
		if(isEmpty()) {
			throw new RuntimeException("Empty");
		}
		
		String value = this.buffer[this.tail];
		this.tail = (this.tail + 1) % size;
		
		this.full = false;
		
		return value;
	}
	
	public int getsize() {
		if(this.head == this.tail) {
			if(this.full)
				return size;
			else
				return 0;
		}
		
		if(this.full) {
			return size;
		}else if( this.head > this.tail) {
			return this.head - this.tail;
		}else
			return size - (this.tail - this.head);
	}
	
	public boolean isFull() {
		return this.full;
	}
	
	public boolean isEmpty(){
		return ((!this.full) && (this.head == this.tail));
	}
	

	public static void main(String[] args) {
		Queue s = new Queue();
		s.add("Dog");
		s.add("Mouse");
		s.add("dragonfly");
		
		System.out.println(s.poll());
		System.out.println(s.poll());
		System.out.println(s.poll());
		
		s.add("Dog");
		s.add("Mouse");
		s.add("dragonfly");
		
		System.out.println(s.poll());
		System.out.println(s.poll());
		System.out.println(s.poll());
		s.add("Dog");
		s.add("Mouse");
		s.add("dragonfly");
		
		System.out.println(s.poll());
		System.out.println(s.poll());
		System.out.println(s.poll());
		s.add("Dog");
		s.add("Mouse");
		s.add("dragonfly");
		
		System.out.println(s.poll());
		System.out.println(s.poll());
		System.out.println(s.poll());
		s.add("Dog");
		s.add("Mouse");
		s.add("dragonfly");
		
		System.out.println(s.poll());
		System.out.println(s.poll());
		System.out.println(s.poll());
	}

}
반응형

'학교 공부 > 자바' 카테고리의 다른 글

[JAVA] 자바 5번째 수업  (0) 2022.04.20
[JAVA] 자바 세번째 수업  (0) 2022.04.06
[JAVA] 자바 첫 수업  (0) 2022.03.17