오늘은(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 |