
과일, 사과, 배, 포도를 표현한 클래스를 만들고 이들 간의 관계를 고려하여 하나의 클래스를 추상 클래스로 만들어 메소드 print()를 구현하고 다음과 같은 소스와 결과가 나오도록 클래스를 작성하시오.
▶ 소스 ◀Fruit fAry[] = {new Grape(), new Apple(), new Pear()); for(Fruit f : fAry) f.print();▼ 결과 ▼
나는 포도이다.
나는 사과이다.
나는 배이다.
✅ 코드 작성
interface IFruit {
public void print();
}
class Grape implements IFruit {
@Override
public void print() {
System.out.println("나는 포도이다.");
}
}
class Apple implements IFruit {
@Override
public void print() {
System.out.println("나는 사과이다.");
}
}
class Pear implements IFruit {
@Override
public void print() {
System.out.println("나는 배이다.");
}
}
interface ICalculator{ int add(int num1,int num2); int sub(int num1,int num2); int mul(int num1,int num2); int div(int num1,int num2); } public static void main(String[] args) { ICalculator calculator = new MyCalculator(); System.out.println(calculator.add(0, 0)); //0 System.out.println(calculator.sub(1, 1)); //0 System.out.println(calculator.mul(0, 0)); //0 System.out.println(calculator.div(1, 1)); //0 }
✅ 코드 작성
class MyCalculator implements ICalculator {
public int add(int num1,int num2) {
return num1+num2;
}
public int sub(int num1,int num2) {
return num1-num2;
}
public int mul(int num1,int num2) {
return num1*num2;
}
public int div(int num1,int num2) {
if(num2 == 0) {
System.out.println("잘못된 입력입니다.");
return 0;
}
return num1/num2;
}
}
abstract class Calc { protected int a; protected int b; public void setValue(int a, int b) { this.a = a; this.b = b; } abstract int calculate() ; } main(){ // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int result=0; System.out.print("두 정수와 연산자를 입력하시오 >> "); int a = sc.nextInt(); //5 int b = sc.nextInt(); //7 String str = sc.next(); //+*-/ char c = str.charAt(0); Calc cal; switch(c) { case '+' : cal = new Add(); break; case '-' : cal = new Sub(); break; case '*' : cal = new Mul(); break; case '/' : cal = new Div(); break; default : System.out.println("잘못된 연산자 입니다."); sc.close(); return; } cal.setValue(a, b); result = cal.calculate(); System.out.println(result); sc.close();
}
✅ 코드 작성
class Add extends Calc {
@Override
int calculate() {
return a+b;
}
}
class Sub extends Calc {
@Override
int calculate() {
return a-b;
}
}
class Mul extends Calc {
@Override
int calculate() {
return a*b;
}
}
class Div extends Calc {
@Override
int calculate() {
if(b == 0) {
System.out.println("잘못된 입력입니다.");
return 0;
}
return a/b;
}
}
- throws는 발생한 예외 객체를 양도하는 것!
- 현재 메서드에서 예외처리를 하기가 조금 어려운 상태일 때 현재 영역을 호출해준 곳으로 발생한 예외 객체를 대신 처리해 달라며 양도하는 것.
blic static void md2() throws IOException {...}- 메소드 내에서 문장을 실행하는 과정에서 해당 에러가 발생할 수 있다는 의미
- 만약 함수에서 예외 상황의 문제가 생기게 되면 throws Exception을 자기자신을 호출한 함수한테 던진다. (예외 처리를 떠넘긴다.) → 계속 호출 한 곳으로 던져서 결국 try catch의 catch에서 Exception 에서 받게 된다. → try catch가 없는 경우 메인 메소드까지 넘어가서 메인 메소드가 최종적으로 JVM으로 넘기는 것도 가능하다. (하지만 그 전에 try catch로 예외 처리를 직접 하는 것이 좋다.)
- 둘 이상의 예외를 넘길 때는 ,(콤마)로 구분한다.
public void simpleWrite() throws IOException, IndexOutofBoundsException { .... }
① unckecked Excetpion
Exception의 subclass인 unchecked Exception은(= RuntimeException) 예외 처리를 해야 한다고 강제하지 않는다. (런타임에 체크)
② checked Exception
Exception의 subclass인 checked Exception은 반드시 프로그래머가 예외 처리를 해야 한다. (컴파일 타임에 체크) 예외 처리를 하지 않으면 프로그램 작성중에 이미 빨간줄로 에러 표시가 떠서 진행할 수가 없게 된다.
public class ExceptionMain { public static void main(String[] args) { Scanner sc = new Scanner(System.in); try { System.out.println(7/2); System.out.println(7/0); System.out.println("숫자를 넣으세요."); int a = sc.nextInt(); } catch (Exception e) { e.printStackTrace(); System.out.println("에러입니다."); } finally { System.out.println("바이바이"); } System.out.println("종료합니다."); } }
- try catch finally가 예외 처리의 기본적인 문장 구성이다.
- 실행의 흐름이 try 구문 안에 들어왔을 때 반드시 실행 해야 하는 문장을 finally 구문에 둘 수 있다.
- finally는 앞의 try-catch에서 성공을 하든 실패를 하든 꼭 통과해야한다!
- write나 scanner 등은 반드시 close 해줘야하는 거라서 써주는것
- 하지만 반드시 처리 해야 하는 문장에서도 에러 뜰 수 있어서 finally 문장 안에서 try catch 해줄 수 있다.
- finally 구문 사용 예시 : 있으면 무조건 타게 되어있다.
int num = 6 / 0; } catch (Exception e) { e.printStackTrace(); } catch (InputMismatchException e) { e.printStackTrace(); }
- Exception이 InputMismatchException보다 상위 클래스에 위치하고 있으므로 모든 예외 상황을 체크할 수 있다.
- 상위의 Exception에서 모든 예외가 처리 되기 때문에 세부 체크를 하는 InputMismatchException 또는 ArithmeticException 등이 그 아래 catch로 온다면 사실상 그 문장을 통과할 일이 없기 때문에 불필요한 코드임을 알려주기 위해 에러가 난다.
- !!! Polymorphism 개념이 핵심 !!!