: λͺΈμ²΄ μλ λ©μλ(μΆμ λ©μλ)λ₯Ό ν¬ν¨ν ν΄λμ€ (λ―Έμμ± μ€κ³λ)
: μΆμ ν΄λμ€μΌ κ²½μ° ν΄λμ€ μ μΈλΆμ abstract ν€μλ μ¬μ©
: λͺΈμ²΄ μλ λ©μλ
: μΆμ λ©μλμ μ μΈλΆμ abstract ν€μλ μ¬μ©
: μμ μ λ°λμ ꡬνν΄μΌ νλ, πμ€λ²λΌμ΄λ©μ΄ κ°μ νλλ λ©μλ
β Animal (λΆλͺ¨ν΄λμ€ / μΆμ ν΄λμ€)
package edu.kh.poly.ex2.model.vo;
public abstract class Animal {
/* μΆμ ν΄λμ€(abstract class)
* 1. λ―Έμμ± λ©μλ(μΆμ λ©μλ)λ₯Ό 보μ νκ³ μλ ν΄λμ€
* 2. κ°μ²΄λ‘ λ§λ€λ©΄ μλλ ν΄λμ€ -> instanceν λΆκ°
* -> μ¬λ¬νμ
λ€μ κ΄λ¦¬νκΈ° μν μμ νμ
μ λͺ©μ μ΄λ©°,
* κ°μ²΄λ‘ μμ±νμ¬ μ¬μ©νκΈ° μν λͺ©μ μ΄ μλλ€.
* -> κ°μ²΄ν ν μ μ€λ₯λ¨(Cannot instantiate the type Animal)
*
*
*/
private String type; // μ’
, κ³Ό
private String eatType; // μμ±(μ΄μ, μ‘μ, μ‘μ..)
public Animal() {} // κΈ°λ³Έμμ±μ
// μΆμν΄λμ€λ new μ°μ°μλ₯Ό ν΅ν΄ μ§μ μ μΈ κ°μ²΄ μμ±μ λΆκ°λ₯νμ§λ§
// μμλ°μ κ°μ²΄ μμ± μ λ΄λΆ λΆλͺ¨λΆλΆμ΄ μμ±λ λ μ¬μ©λλ€.
public Animal(String type, String eatType) { // λ§€κ°λ³μ μμ±μ(μ€λ²λ‘λ© μ μ©)
this.type = type;
this.eatType = eatType;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getEatType() {
return eatType;
}
public void setEatType(String eatType) {
this.eatType = eatType;
}
// toString()μ€λ²λΌμ΄λ©
@Override // μ€λ²λΌμ΄λ©μ΄ λμμμ μ»΄νμΌλ¬μκ² μλ €μ£Όλ μ΄λ
Έν
μ΄μ
public String toString() {
return type + " / " + eatType;
}
// λλ¬Όμ κ³΅ν΅ κΈ°λ₯ μΆμΆ(μΆμν)
// -> λλ¬Όμ 곡ν΅μ μΌλ‘ λ¨Ήκ³ , μ¨μ¬κ³ , μμ§μ΄μ§λ§
// μ΄λ€ λλ¬Όμ΄λμ λ°λΌ κ·Έ λ°©λ²μ΄ λ€λ¦!
// -> ν΄λΉ ν΄λμ€μ λ©μλλ₯Ό μ μν μ μλ€.
// -> λ―Έμμ± μνλ‘ λμ΄ μμλ°μ μμν΄λμ€κ° ν΄λΉ λ©μλλ₯Ό μ μνλλ‘
// -> μ€λ²λΌμ΄λ© κ°μ νλ₯Ό μμΌμΌν¨ -> μΆμλ©μλλ‘ μμ±
// λ¨Ήλ€
public abstract void eat(); // - > μΆμ λ©μλ -> μΆμλ©μλλ§ μμ±νλ©΄ μ€λ₯λ¨
// -> ν΄λΉ ν΄λμ€λ μΆμν΄λμ€λ‘ λ§λ€μ΄μ€μΌν¨
// μ¨μ¬λ€
public abstract void breath();
// μμ§μ΄λ€
public abstract void move();
}
β Fish (μμν΄λμ€)
package edu.kh.poly.ex2.model.vo;
public class Fish extends Animal{
public Fish(){}
public Fish(String type, String eatType) {
super(type, eatType);
}
@Override
public void eat() {
System.out.println("μ
μ λ»λλ»λ 거리면μ λ¨Ήλλ€");
}
@Override
public void breath() {
System.out.println("μκ°λ―Έ νΈν‘μ νλ€.");
}
@Override
public void move() {
System.out.println("κΌ¬λ¦¬λ‘ ν€μμΉλ©° μμ§μΈλ€.");
}
@Override
public String toString() {
return "Fish : " + super.toString();
}
}
β Person (μμν΄λμ€)
package edu.kh.poly.ex2.model.vo;
public class Person extends Animal {
// Animalμ μΆμλ©μλλ₯Ό μ€λ²λΌμ΄λ© νμ§μμΌλ©΄ μ€λ₯ λ°μ
private String name;
public Person() {}
public Person(String type, String eatType, String name) {
super(type, eatType);
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void eat() {
System.out.println("μκ°λ½, μ κ°λ½ λ± λꡬλ₯Ό μ΄μ©ν΄μ λ¨Ήλλ€.");
}
@Override
public void breath() {
System.out.println("μ½μ μ
μΌλ‘ μ¨μ°λ€.");
}
@Override
public void move() {
System.out.println("λλ°λ‘ κ±·λλ€.");
}
@Override
public String toString() {
return "Person : " + super.toString() + " / " + name;
}
}
β AbstractService (μλΉμ€ ν΄λμ€)
package edu.kh.poly.ex2.model.service;
import edu.kh.poly.ex2.model.vo.Animal;
import edu.kh.poly.ex2.model.vo.Fish;
import edu.kh.poly.ex2.model.vo.Person;
public class AbstractService {
public void ex1() {
// Animal animal = new Animal();
// μΆμ ν΄λμ€λ₯Ό κ°μ²΄ν ν μ μ€λ₯λ¨(Cannot instantiate the type Animal)
// ν΄λμ€ : κ°μ²΄μ μμ±, κΈ°λ₯μ μ μν κ² (μΌμ’
μ μ€κ³λ)
// μΆμν΄λμ€ : λ―Έμμ± λ©μλλ₯Ό ν¬ν¨ν ν΄λμ€ (λ―Έμμ± μ€κ³λ)
// -> λ―Έμμ± μ€κ³λλ‘λ κ°μ²΄λ₯Ό λ§λ€ μ μλ€! -> μ€λ₯λ°μ
// ν΄κ²°λ°©λ² : Animalμ μμλ°μ λ―Έμμ± λΆλΆμ ꡬνν
// ν΄λμ€λ₯Ό μ΄μ©ν΄ κ°μ²΄ μμ±
// μΆμν΄λμ€λ₯Ό μμλ°μ μμν΄λμ€ κ°μ²΄ μμ±
Person p1 = new Person();
p1.setName("νκΈΈλ");
// μμλ°μ κΈ°λ₯ νΈμΆ
p1.setType("μ²μΆλλ¬Ό");
p1.setEatType("μ‘μ");
// μ€λ²λΌμ΄λ©ν λ©μλ νΈμΆ
p1.eat();
p1.breath();
p1.move();
p1.toString();
Fish f1 = new Fish();
f1.eat();
f1.breath();
f1.move();
f1.toString();
}
public void ex2() {
// * μΆμν΄λμ€μ λ€νμ± + λ°μΈλ©
// - μΆμν΄λμ€λ κ°μ²΄λ‘ λ§λ€ μ μλ€!
// νμ§λ§, "μ°Έμ‘°λ³μ"λ‘λ μ¬μ©ν μ μλ€.
// Animal a1 = new Animal(); -> X
// μ¬λ -> λλ¬Ό / λ¬Όκ³ κΈ° -> λλ¬Ό
//Animal a1 = new Person(); -> O
//Animal a2 = new Fish(); -> O
// Animal μ°Έμ‘°λ³μ λ°°μ΄μ μΈ λ° ν λΉ
Animal[] arr = new Animal[2];
arr[0] = new Person("μ¬λ", "μ‘μ", "κΉμ¬λ");
// Animal λΆλͺ¨ = Person μμ(λ€νμ± μ€ μ
μΊμ€ν
)
arr[1] = new Fish("λ¬Όκ³ κΈ°", "μ‘μ");
// λ°μΈλ© νμΈ
for(int i = 0; i < arr.length; i++) {
// arr[i] == Annimal μ°Έμ‘°λ³μ
arr[i].eat();
arr[i].breath();
System.out.println(arr[i].toString());
// edu.kh.poly.ex2.model.vo.Animal.toString() - μ μ λ°μΈλ©
System.out.println("=============");
// νλ‘κ·Έλ¨ μ€ν μ
// μ°Έμ‘°νκ³ μλ μμ κ°μ²΄μ μ€λ²λΌμ΄λ©λ eat() λ©μλ μ€ν
// - λμ λ°μΈλ©
// -> λΆλͺ¨νμ
μ°Έμ‘°λ³μλ‘ λ©μλλ₯Ό νΈμΆνμ§λ§
// μμνμ
μ μ€λ²λΌμ΄λ©λ λ©μλκ° μνλλ€.
}
}
}
: λ» - ν΄λμ€κ°μ μ μ
: ν΄λμ€κ° 곡ν΅μ μΌλ‘ κ°μ ΈμΌνλ νλ, λ©μλλ₯Ό λͺ¨μλκ³ μμνλ κ²
: μΆμν΄λμ€λ μΆμλ©μλ μΈμ λ©€λ²λ³μ μΌλ°λ©μλλ€μ μ¬μ©μ΄ κ°λ₯νμ§λ§, μΈν°νμ΄μ€λ μΆμλ©μλ μΈμ μ¬μ©μ΄ λΆκ°νλ€.
β Calculator (μΈν°νμ΄μ€)
package edu.kh.poly.ex2.model.service;
// κ³μ°κΈ° μΈν°νμ΄μ€
// -> λͺ¨λ κ³μ°κΈ°μ λν κ³΅ν΅ νλ, κΈ°λ₯λͺ
μ μ 곡νλ μ μ μ μ©λ
public interface Calculator {
// μΈν°νμ΄μ€ : μΆμν΄λμ€μ λ³ν체(μΆμν΄λμ€λ³΄λ€ μΆμλκ° λμ)
// - μΆμν΄λμ€ : μΌλΆλ§ μΆμλ©μλ(0κ° μ΄μ)
// - μΈν°νμ΄μ€ : λͺ¨λ μΆμ λ©μλ
// νλ(묡μμ μΌλ‘ public static final μνλ‘ μ μΈ ==> μμ)
public static final double PI = 3.14;
static final int MAX_NUM = 100000;
public int MIN_NUM = -100000;
int ZERO = 0;
// λ©μλ(묡μμ μΌλ‘ public abstract μνλ‘ μ μΈ)
public abstract int plus(int num1, int num2);
public abstract int minus(int num1, int num2);
public abstract int multiple(int num1, int num2);
public abstract int divide(int num1, int num2);
}
β CJECalculator ν΄λμ€ (λμ κ³μ°κΈ°)
package edu.kh.poly.ex2.model.service;
// extends : νμ₯νλ€, implements : ꡬννλ€
// (λΆ)ν΄λμ€ - (μ)ν΄λμ€ : extends μ¬μ©(μΆμν΄λμ€ ν¬ν¨)
// (λΆ)μΈν°νμ΄μ€ - (μ)ν΄λμ€ : implements μ¬μ©
public class CJECalculator /*extends Animal*/ implements Calculator{
// μΈν°νμ΄μ€λ ν΄λμ€, μΈν°νμ΄μ€ λμ μμ κ°λ₯ -> λ€μ€ μμ κ°λ₯
@Override
public int plus(int num1, int num2) {
return num1 + num2;
}
@Override
public int minus(int num1, int num2) {
return num1 - num2;
}
@Override
public int multiple(int num1, int num2) {
return num1 * num2;
}
@Override
public int divide(int num1, int num2) {
return num1 / num2;
}
}
β AbstractRun (Run ν΄λμ€)
package edu.kh.poly.ex2.run;
import edu.kh.poly.ex2.model.service.CJECalculator;
public class AbstractRun {
public static void main(String[] args) {
CJECalculator cal = new CJECalculator();
System.out.println("ν© : " + cal.divide(20, 15));
System.out.println("μ°¨ : " + cal.divide(20, 15));
System.out.println("κ³± : " + cal.divide(20, 15));
System.out.println("λͺ« : " + cal.divide(20, 15));
// μΈν°νμ΄μ€ == λ―Έμμ± μ€κ³λ == κ°μ²΄ μμ± λΆκ°λ₯
// μΆμν΄λμ€μ²λΌ μ°Έμ‘° λ³μλ‘λ μ¬μ© κ°λ₯νλ€
// μ½λμ ν° μμ μμ΄
// κ°μ²΄ μμ± μ½λλ§ λ°κΎΈλ©΄ μλ‘μ΄ ν΄λμ€ μ½λλ₯Ό μνν μ μλ€.
// μΈν°νμ΄μ€ νΉμ§
// 1) μΈν°νμ΄μ€λ₯Ό λΆλͺ¨ μ°Έμ‘°λ³μλ‘ μ¬μ©νλ©΄ λ€νμ± μ€
// μ
μΊμ€ν
μ΄ μ μ©λΌμ μμλ°μ λͺ¨λ ν΄λμ€λ₯Ό μμ κ°μ²΄λ‘ μ°Έμ‘°ν μ μλ€.
// -> μ΄λ₯Ό μ΄μ©νμ¬ μ€μν λ©μΈμ½λμ μμ μ μ΅μνν μ μλ€.
// ex) Runμ μμ±λ ν©, μ°¨, κ³±, λͺ«μ μΆλ ₯νλ μ½λμ μμ μμ΄
// κ°μ²΄μμ±μ½λ ν μ€λ§ μμ νμ¬ λ€λ₯΄κ² μμ±λ κΈ°λ₯μ μνν μ μλ€.
// 2) μμ ν΄λμ€μ 곡ν΅λ λ©μλ ꡬνμ κ°μ νκΈ° λλ¬Έμ
// λͺ¨λ μμ ν΄λμ€κ° λμΌν ννλ₯Ό λκ² λλ€.
// -> μ΄λ₯Ό νμ©νμ¬ κ³΅λμμ
(ννλ‘μ νΈ)μ νμν κ°λ°νκ²½μ μ‘°μ±ν μ μλ€.
}
}
: νλ‘κ·Έλ¨ μν μ μΉλͺ μ μν©μ΄ λ°μνμ¬ λΉμ μ μ’ λ£ μν©μ΄ λ°μν κ², νλ‘κ·Έλ¨ μλ¬λΌκ³ λ ν¨
package edu.kh.exception.test;
import java.util.Scanner;
public class ExceptionTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("μ μ μ
λ ₯(0μ
λ ₯ μ μ’
λ£) :");
int input = sc.nextInt();
// μ»΄νμΌ μλ¬ -> κ°λ°μκ° μ½λ μλͺ»μ΄κ²
// μλ£νμ΄ λ§μ§μμ μ°μ°μ λͺ»ν΄μ "μ»΄νμΌ μλ¬"κ° λ°μ. μ½λνλ¦Ό
// int a = 00.9;
int a = (int)00.9; // μ½λλ‘ μμ κ°λ₯
if(input == 0) {
break;
}
}
// λ°νμμλ¬ μμ
// λ°νμ μλ¬ : νλ‘κ·Έλ¨ μν μ€ λ°μνλ μλ¬
// μ£Όλ‘ ifλ¬ΈμΌλ‘ μ²λ¦¬κ° κ°λ₯νλ€.
int[] arr = new int[3];
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
//arr[3] = 40;
// java.lang.ArrayIndexOutOfBoundsException : λ°°μ΄ λ²μ μ΄κ³Ό μμΈ
if(3 >= arr.length) {// λ°°μ΄ μΈλμ€ λ²μ μ΄κ³Ό μ
System.out.println("λ°°μ΄ λ²μλ₯Ό μ΄κ³Όνμ΅λλ€");
}else {
arr[3] = 40;
}
}
}
μμ€ μ½λ μμ μΌλ‘ ν΄κ²° κ°λ₯ν μλ¬λ₯Ό μμΈ(Exception)λΌκ³ ν¨.
μ΄λ¬ν μμΈ μν©(μμΈ‘ κ°λ₯ν μλ¬) ꡬ문μ μ²λ¦¬ νλ λ°©λ²μΈ μμΈ μ²λ¦¬λ₯Ό ν΅ν΄ ν΄κ²°ν μ μμ.
: Exceptionκ³Ό Error ν΄λμ€ λͺ¨λ Object ν΄λμ€μ μμμ΄λ©° λͺ¨λ μμΈμ μ΅κ³ μ‘°μμ Exception ν΄λμ€
try : Excption λ°μν κ°λ₯μ±μ΄ μλ μ½λλ₯Ό tryμμ μμ±
catch : try ꡬ문μμ Exception λ°μ μ μ²λ¦¬ν μ½λ μμ±
finally : Exception λ°μ μ¬λΆμ κ΄κ³μμ΄ κΌ μ²λ¦¬ν΄μΌνλ μ½λ μμ±
try{
μμΈ(μλ¬)κ° λ°μν κ²κ°μ μ½λ
}catch(μλ¬μ‘λ λΆλΆ...?){
μ²λ¦¬ν λ΄μ©μ μ½λ
}finally{
μλ¬κ° λλ μλλ 무쑰건 μννλ μ½λ
}
package edu.kh.exception.model.service;
import java.io.IOException;
import java.util.InputMismatchException;
import java.util.Scanner;
public class ExceptionService {
// μμΈ(Exception) : μμ€μ½λμ μμ μΌλ‘ ν΄κ²°κ°λ₯ν μ€λ₯
// μμΈλ λ μ’
λ₯λ‘ κ΅¬λΆλ¨
// 1) Unchecked Exception : μ νμ μΌλ‘ μμΈμ²λ¦¬ν΄μΌνλ Exception
// 2) Checked Exception : νμλ‘ μμΈμ²λ¦¬ν΄μΌνλ Exception
private Scanner sc = new Scanner(System.in);
public void ex1() {
System.out.println("λ μ μλ₯Ό μ
λ ₯λ°μ λλν λͺ«μ μΆλ ₯");
System.out.print("μ μ 1 μ
λ ₯ : ");
int input1 = sc.nextInt();
System.out.print("μ μ 2 μ
λ ₯ : ");
int input2 = sc.nextInt();
try{
System.out.println("κ²°κ³Ό : " + input1 / input2);
// input1 == 5 input2 == 0μΌλ‘ μ
λ ₯ν κ²½μ°
// java.lang.ArithmeticException: / by zero -> μ°μ μ μμΈ
// μ°μ μ μμΈλ‘ 0μΌλ‘ λλ μ μλ€.
} catch(ArithmeticException e) {
// tryμμ λμ Έμ§ μμΈλ₯Ό catchλ¬Έ λ§€κ°λ³μ eλ‘ μ‘μ
System.out.println("infinity"); // μ²λ¦¬ν μ½λ
}
if(input2 != 0) {
System.out.println("κ²°κ³Ό : " + input1 / input2);
}else {
System.out.println("infinity"); // μ²λ¦¬ν μ½λ
}
// λ°μνλ μμΈ μ€ μΌλΆ μμΈλ try-catch ꡬ문 μ¬μ©νμ§μμλ
// μμΈμν©μ λ°©μ§ν μ μλ€.
// μΌλΆμμΈ == Unchecked Exception
}
public void ex2() {
// μ¬λ¬κ°μ§ μμΈμ λν μ²λ¦¬ λ°©λ²
try {
System.out.print("μ
λ ₯1 : ");
int num1 = sc.nextInt(); // java.util.InputMismatchException
System.out.print("μ
λ ₯2 : ");
int num2 = sc.nextInt(); // java.util.InputMismatchException
System.out.println("κ²°κ³Ό : " + num1 / num2); // ArithmeticException
String str = null;
System.out.println(str.charAt(0));
// java.lang.NullPointerException: Cannot invoke "String.charAt(int)" because "str" is null
// μ°Έμ‘°νμ§ μλ μ°Έμ‘°λ³μλ₯Ό μ΄μ©ν΄μ μ½λ μν μ λ°μ
}catch(InputMismatchException e) {
System.out.println("νμ
μ λ§λ κ°λ§ λ£μ΄μ£ΌμΈμ.");
}catch(ArithmeticException e) {
System.out.println("0μΌλ‘ λλ μ μμ΅λλ€.");
}catch(Exception e) {
System.out.println("λμ§ λͺ¨λ₯΄κ² μΌλ μμΈκ° λ°μν΄μ μ²λ¦¬ν¨.");
}
// μμΈμ²λ¦¬ + λ€νμ±
// Exception ν΄λμ€ : λͺ¨λ μμΈμ μ΅μμ λΆλͺ¨
// λ€νμ± - μ
μΊμ€ν
: λΆλͺ¨νμ
μ°Έμ‘°λ³μλ‘ μμκ°μ²΄λ₯Ό μ°Έμ‘°.
// ** μμ νμ
μ μμΈν΄λμ€λ₯Ό catchλ¬Έμ μμ±νλ©΄
// λ€νμ± μ
μΊμ€ν
μ μν΄ λͺ¨λ μ‘μμ μ²λ¦¬ κ°λ₯ **
}
public void ex3() {
// 1) try - catch - finally
// finally : tryꡬ문μμ μμΈκ° λ°μνλ λ§λ 무쑰건 λ§μ§λ§μ μννλ μ½λλ₯Ό μμ±
try{
System.out.println(4/0);
}catch(ArithmeticException e) {
System.out.println("μμΈμ²λ¦¬λ¨");
// 2) catchλ¬Έ λ§€κ°λ³μ νμ©
// λ§€κ°λ³μ e : μμΈ κ΄λ ¨λ μ 보 + κΈ°λ₯μ΄ λ€μ΄μμ
System.out.println(e.getClass()); // μ΄λ€ μμΈν΄λμ€μΈμ§ μλ €μ€
// class java.lang.ArithmeticException
System.out.println(e.getMessage()); // μμΈ λ°μ μ μΆλ ₯λ λ΄μ©
// / by zero
System.out.println(e); // e.toString();
// java.lang.ArithmeticException: / by zero
e.printStackTrace();
}finally {
System.out.println("무쑰건 μν λ¨");
}
}
public void ex4() {// μμΈ λμ§κΈ°
//throws : νΈμΆν λ©μλμ μμΈλ₯Ό λμ§λ μ°λ ν€μλ
// -> νΈμΆν λ©μλμκ² μμΈλ₯Ό μ²λ¦¬νλΌκ³ μμνλ νμ
// throw : μμΈ κ°μ λ°μ ꡬ문
try {
methodA();
} catch (Exception e) {
// Exception : λͺ¨λ μμΈμ μ΅μμ λΆλͺ¨
// Exceptionμ΄ catch λ§€κ°λ³μλ‘ μμ±λμλ€
// == μμΈμ’
λ₯ μκ΄μμ΄ λͺ¨λ μ²λ¦¬νκ² λ€λΌλ λ΄μ©
e.printStackTrace();
// λ°μν μμΈκ° λ©μλμ μμΉμ λν λͺ¨λ λ΄μ©μ μΆλ ₯
// μμΈ λ°μ μ§μ μΆμ
}
}
public void methodA() throws IOException {
methodB();
}
public void methodB() throws IOException {
methodC();
}
public void methodC() throws IOException {
// μμΈ κ°μ λ°μ ꡬ문
throw new IOException();
}
}