본문 바로가기
JAVA

java공부 - 배열에서 나타난 오류(초기화 관련)

by Big Sun 2022. 3. 23.
728x90
package real;

import java.util.Scanner;

interface Stack {
	int length();
	int capacity();
	String pop();
	boolean push(String val);
}

public class StringStack implements Stack {
	
	static int stacksu;
	static int nowStacksu=0;
	static String[] array = new String[stacksu];
	
	@Override
	public int length() {
		try {
			if(array[nowStacksu] != null) {
				nowStacksu++;
			}
			return nowStacksu;
		}catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("배열 초과");
			return nowStacksu;
		}
		
	}

	@Override
	public int capacity() {
		
		return stacksu;
	}

	@Override
	public String pop() {
		String str = "";
		for(int i =0;i<array.length;i++) {
			str += array[i];
			str += " ";
		}
		return str;
	}

	@Override
	public boolean push(String val) {
		if(length() < capacity()) {
			System.out.println(nowStacksu);
			array[nowStacksu] = val;
			return true;
		}else if(val.equals("그만")){
			System.out.print("스택에 저장된 모든 문자열 팝 : ");
			String s = pop();
			System.out.println(s);
			System.exit(0);
			return true;
		}
		else {
			return false;
		}
		
	}
	
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		StringStack stack = new StringStack();
		System.out.println("총 스택 저장 공간의 크기 입력 >> ");
		stacksu = scan.nextInt(); 
		  // 여기서 생성해야 하는 이유
		
		while(true) {
			System.out.print("문자열 입력 >>");
			if(stack.push(scan.next())) {
				//
			}else {
				System.out.println("스택이 꽉 차서 푸시 불가!");
			}
		}
	}
}

 

ArrayIndexOutOfBoundsException 이라는 오류가 뜬다. 

왜일까...??

일단 오류메세지를 본다면 배열의 문제다.

원래 필자의 생각은 static int stacksu가 값을 할당받으면 그와 동시에 

array배열 (static String[] array = new String[stacksu])이 static String[] array = new String[3]으로 되라라 생각했다.

어디가 잘못된 것일까?

 

일단, 배열은 맨 처음 생성할 때의 초기값으로 고정된다. 위같은 경우에는 stacksu를 초기화하지 않은 상태이기때문에 자동적으로 0으로 초기화가 되고 결론적으로 String[] array = new String[0]으로 초기화가 되는 것이다.

따라서, 배열같은경우 처음에 배열의 개수 초기화한 값이 변하지 않는 다는 것을 숙지하고 배열을 초기화해야 할 것이다.

 

초기화란?

초기화는 선언한 객체에 최초로 값을 넣어주는 것을 의미한다.

클래스 영역에서 선언할 경우) 컴파일러가 자동으로 값 할당

메소드 영역에서 선언할 경우) 컴파일러가 자동으로 값 할당해주지 않는다. -> 에러

 

수정은 아래와같다.

package real;

import java.util.Scanner;

interface Stack {
	int length();
	int capacity();
	String pop();
	boolean push(String val);
}

public class StringStack implements Stack {
	
	static int stacksu;
	static int nowStacksu=0;
	static String[] array;
	
	@Override
	public int length() {
		try {
			if(array[nowStacksu] != null) {
				nowStacksu++;
			}
			return nowStacksu;
		}catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("배열 초과");
			return nowStacksu;
		}
		
	}

	@Override
	public int capacity() {
		
		return stacksu;
	}

	@Override
	public String pop() {
		String str = "";
		for(int i =0;i<array.length;i++) {
			str += array[i];
			str += " ";
		}
		return str;
	}

	@Override
	public boolean push(String val) {
		if(length() < capacity()) {
			System.out.println(nowStacksu);
			array[nowStacksu] = val;
			return true;
		}else if(val.equals("그만")){
			System.out.print("스택에 저장된 모든 문자열 팝 : ");
			String s = pop();
			System.out.println(s);
			System.exit(0);
			return true;
		}
		else {
			return false;
		}
		
	}
	
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		StringStack stack = new StringStack();
		System.out.println("총 스택 저장 공간의 크기 입력 >> ");
		stacksu = scan.nextInt(); 
		array = new String[stacksu];
		
		while(true) {
			System.out.print("문자열 입력 >>");
			if(stack.push(scan.next())) {
				//
			}else {
				System.out.println("스택이 꽉 차서 푸시 불가!");
			}
		}
	}
}

 

이상입니다.

728x90