java공부 - 배열에서 나타난 오류(초기화 관련)
2022. 3. 23. 15:53ㆍJAVA
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
'JAVA' 카테고리의 다른 글
java 공부 - 명품 자바 프로그래밍 7장 11번(변형) (0) | 2022.04.02 |
---|---|
명품 java 프로그래밍 5장 - Open Challenge (0) | 2022.03.27 |
java- 간단한 스케줄러 만들어보기 (0) | 2022.03.18 |
java 공부 - 간단한 예약 시스템 만들기 (0) | 2022.03.18 |
java 공부 - 명품 JAVA 프로그래밍 4장 Open Challenge (0) | 2022.03.17 |