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;
        }
    }
}

'JAVA' 카테고리의 다른 글

String 중간 공백기준으로 배열 만들기  (0) 2022.07.06
Hamcrest, Matcher란?  (0) 2022.07.03
Optional 이란?  (0) 2022.07.02
상속을 응용한 스택 구현  (0) 2021.10.07
Stack  (0) 2021.10.06

+ Recent posts