package practice;
import java.util.Scanner;
// .idea 폴더 : 프로젝트의 구조 정보 등 프로젝트 관련 메타데이터가 들어 있음
// iml 파일 : 인텔리제이 모듈 구성에 대해 xml 형태로 기술해 놓은 파일
// @override: 상속을 받아서 메서드를 만들때 모든 메서드는 같은걸 상속받게되는데 이때 맘에 들지않는 것을 내가 원하는대로 재정의하겠다는 의미
/*
static : 이미 객체화 되어 바로 사용가능
non-static : 아직 객체화되지 않아 new 키워드를 통해 생성한 후 사용 가능
*/
/*
Scanner(System.in) : Scanner 를 통해 값을 입력받음
-> sc.nextInt / sc.next / sc.nextLine 과 같이 응용하여 사용한다
*/
/*
static : 그냥 정적 변수로 static protecd 로 선언되므로 다른 클래스에서 불러올 수 없다
static public : 다른 클래스에서 불러올 수 있는 정적변수
*/
/*
throw : Exception 을 발생시킬때 사용하는 키워드
throws : 메소드를 정의할 때 사용하며, 이 메소드에서 발생할 수 있는 Exception 을 명시적으로 정의할 때 사용합니다.
*/
/*
- 에러 : 1.개발자가 해결할 수 없는 오류
2.하드웨어의 잘못된 동작 또는 고장으로 인한 오류
3. 에러 발생하여 프로그램 종료
4. 정상상태로 돌아갈 수 없음
- 예외 : 1.개발자가 해결할 수 있는 오류
2.사용자의 잘못된 조작이나 코딩 오류
3.예외 처리 추가하면 정상 실행 상태로 돌아갈 수 있음
*/
/*
if-else : 모든 예외상황을 예측하고 있어야한다.
try-catch : try구문에서 예외가 Throw 되면 그 즉시 블럭이 종료되고, catch 블럭으로 제어가 이동됨 ( try: 블럭 )
*/
/*
try{} catch{} : try에서 예외가 발생하면 Catch 블록의 참조변수로 전달한다.
-> 하나의 try 에 여러 catch가 있을 수 있지만 동시에 발생하지는 않음
-> 예외 발생 여부와 상관없이 무조건 살행해야하는 문장이 있다면 finally를 사용
ex. try{ } catch{ } catch{ } finally{" 무조건 실행 "}
*/
/*
ArrayIndexOutOfBoundsException : 배열의 범위를 벗어난 인덱스 사용시 발생
NumberFormatException : 메소드의 인수를 숫자로 바꿀 수 없을때 발생
ArithmeticException : 인수가 0일 때 나눌 수 없으므로 발생
*/
/*
throws : 메소드에서 발생한 메소드를 내부에서 처리하기 어려울 때 사용해서 던져줌 ( 말 그대로 throw 해줌 )
단, 메소드에 선언한 예외보다 더 괌범위한 검사형 예외를 던질 수는 없음
EX.
public void method(){
try{
method2();
}catch(ClassNotFoundException e){
System.out.println("클래스가 존재하지 않음");
}
}
public void method2() throw ClassNotFoundException {
Class clazz = Class.forName("java.lang.String2");
}
*/
public class Main {
static int[] mArr;
static int mN,mFront=0,mTail=0;
public static void main(String[] args){
Scanner input = new Scanner(System.in);
mN = input.nextInt();
mArr = new int[mN];
Main enq = new Main();
Main deq = new Main();
/*
enqueue 와 dequeue 가 전역 메소드로 선언된것이 아니기 때문에
각 함수를 클래스에 객체화 시켜서 선언하였다.
전역 메소드를 안쓰는 이유는 그 메소드를 추적하기 힘들어지기 때문에 미리 전역메소드를 안쓰는 식으로 연습하는 것이다.
*/
for(int i=0; i<mN; i++){
int enq_num = input.nextInt();
enq.enqueue(enq_num);
}
for(int i=0; i<mN; i++){
System.out.println(deq.dequeue());
}
}
public void enqueue(int num){
try{
mArr[mTail] = num;
System.out.println("enqueue: "+ mArr[mTail++]);
} catch(ArrayIndexOutOfBoundsException e){
System.out.println(e); // e만 출력해줘도 예외 처리를 해줘야한다는 것을 알려준다.
}
}
public int dequeue(){
try{
int outnum = mArr[mFront];
for(int i=0; i<mTail-1;i++){
mArr[i] = mArr[i+1];
}
mTail--;
return outnum;
}catch(ArrayIndexOutOfBoundsException e){
System.out.println(e);
return 0;
}
}
}