TIL(Today I Learned)_230728

Aspyn ChoiΒ·2023λ…„ 7μ›” 28일
0

TIL

λͺ©λ‘ 보기
13/37

☝🏻였늘 배운 것

1. 좔상

- 좔상 클래슀

: λͺΈμ²΄ μ—†λŠ” λ©”μ†Œλ“œ(좔상 λ©”μ†Œλ“œ)λ₯Ό ν¬ν•¨ν•œ 클래슀 (λ―Έμ™„μ„± 섀계도)
: 좔상 클래슀일 경우 클래슀 선언뢀에 abstract ν‚€μ›Œλ“œ μ‚¬μš©

  • [μ ‘κ·Όμ œν•œμž] abstract class 클래슀λͺ… {}

- 좔상 λ©”μ†Œλ“œ

: λͺΈμ²΄ μ—†λŠ” λ©”μ†Œλ“œ
: 좔상 λ©”μ†Œλ“œμ˜ 선언뢀에 abstract ν‚€μ›Œλ“œ μ‚¬μš©
: 상속 μ‹œ λ°˜λ“œμ‹œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ”, πŸ“Œμ˜€λ²„λΌμ΄λ”©μ΄ κ°•μ œν™”λ˜λŠ” λ©”μ†Œλ“œ

  • [μ ‘κ·Όμ œν•œμž] abstract λ°˜ν™˜ν˜• λ©”μ†Œλ“œλͺ…(μžλ£Œν˜• λ³€μˆ˜λͺ…);

- 좔상 클래슀의 νŠΉμ§•

  1. νŠΉμ§•
    : λ―Έμ™„μ„± 클래슀(abstract ν‚€μ›Œλ“œ μ‚¬μš©)
    자체적으둜 객체 생성(객체화) λΆˆκ°€ β†’ λ°˜λ“œμ‹œ μƒμ†ν•˜μ—¬ 객체 생성
    : abstract λ©”μ†Œλ“œκ°€ ν¬ν•¨λœ ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ abstract 클래슀둜 ν‘œκΈ° / abstract λ©”μ†Œλ“œκ°€ 없어도 abstract 클래슀둜 μ„ μ–Έ κ°€λŠ₯
    : 클래슀 내에 일반 λ³€μˆ˜, λ©”μ†Œλ“œ 포함 κ°€λŠ₯
    : 객체 생성은 μ•ˆλ˜μ§€λ§Œ μ°Έμ‘°ν˜• λ³€μˆ˜ νƒ€μž…μœΌλ‘œλŠ” μ‚¬μš© κ°€λŠ₯
  2. μž₯점
    : 상속 받은 μžμ‹μ—κ²Œ κ³΅ν†΅λœ 멀버 제곡.
    : 일뢀 κΈ°λŠ₯(μ˜€λ²„λΌμ΄λ”©)의 κ΅¬ν˜„μ„ κ°•μ œν™”(κ³΅ν†΅μ μ΄κ±°λ‚˜ μžμ‹ ν΄λž˜μŠ€μ— 따라 μž¬μ •μ˜ λ˜μ–΄μ•Ό ν•˜λŠ” κΈ°λŠ₯).

- μΆ”μƒν΄λž˜μŠ€ μ‚¬μš©ν•΄λ³΄κΈ°

βœ… 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() λ©”μ†Œλ“œ μ‹€ν–‰
			// - 동적 바인딩
			// -> λΆ€λͺ¨νƒ€μž… μ°Έμ‘°λ³€μˆ˜λ‘œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν–ˆμ§€λ§Œ
			// μžμ‹νƒ€μž…μ˜ μ˜€λ²„λΌμ΄λ”©λœ λ©”μ†Œλ“œκ°€ μˆ˜ν–‰λœλ‹€.
		}
	}
}

2. μΈν„°νŽ˜μ΄μŠ€

- μΈν„°νŽ˜μ΄μŠ€λž€?

: 뜻 - ν΄λž˜μŠ€κ°„μ˜ 접점
: ν΄λž˜μŠ€κ°€ κ³΅ν†΅μ μœΌλ‘œ κ°€μ Έμ•Όν•˜λŠ” ν•„λ“œ, λ©”μ†Œλ“œλ₯Ό λͺ¨μ•„두고 μƒμ†ν•˜λŠ” 것
: μΆ”μƒν΄λž˜μŠ€λŠ” μΆ”μƒλ©”μ†Œλ“œ 외에 λ©€λ²„λ³€μˆ˜ μΌλ°˜λ©”μ†Œλ“œλ“€μ˜ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€λŠ” μΆ”μƒλ©”μ†Œλ“œ 외에 μ‚¬μš©μ΄ λΆˆκ°€ν•˜λ‹€.

- μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©ν•΄ 계산기 λ§Œλ“€κΈ°

βœ… 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) μžμ‹ ν΄λž˜μŠ€μ— κ³΅ν†΅λœ λ©”μ„œλ“œ κ΅¬ν˜„μ„ κ°•μ œν•˜κΈ° λ•Œλ¬Έμ—
		// 		λͺ¨λ“  μžμ‹ ν΄λž˜μŠ€κ°€ λ™μΌν•œ ν˜•νƒœλ₯Ό λ„κ²Œ λœλ‹€.
		//		-> 이λ₯Ό ν™œμš©ν•˜μ—¬ κ³΅λ™μž‘μ—…(νŒ€ν”„λ‘œμ νŠΈ)에 ν•„μš”ν•œ κ°œλ°œν™˜κ²½μ„ μ‘°μ„±ν•  수 μžˆλ‹€.
		
	}

}

- μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€ 비ꡐ

3. μ˜ˆμ™Έ 처리(Exception Handling)

- ν”„λ‘œκ·Έλž¨ 였λ₯˜

: ν”„λ‘œκ·Έλž¨ μˆ˜ν–‰ μ‹œ 치λͺ…적 상황이 λ°œμƒν•˜μ—¬ 비정상 μ’…λ£Œ 상황이 λ°œμƒν•œ 것, ν”„λ‘œκ·Έλž¨ μ—λŸ¬λΌκ³ λ„ 함

- 였λ₯˜μ˜ μ’…λ₯˜

  1. 컴파일 μ—λŸ¬ : ν”„λ‘œκ·Έλž¨μ˜ 싀행을 λ§‰λŠ” μ†ŒμŠ€ μ½”λ“œμƒμ˜ 문법 μ—λŸ¬(κ°œλ°œμžκ°€ μ½”λ“œλ₯Ό 잘λͺ»μ“΄ 경우)
    -> μ†ŒμŠ€ μ½”λ“œ μˆ˜μ •μœΌλ‘œ ν•΄κ²°
    **예 int a = 99.9;)
  2. λŸ°νƒ€μž„ μ—λŸ¬ : ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 λ°œμƒν•˜λŠ” μ—λŸ¬ -> 주둜 ifλ¬Έ μ‚¬μš©μœΌλ‘œ μ—λŸ¬ 처리
    (ex. λ°°μ—΄μ˜ 인덱슀 λ²”μœ„λ₯Ό λ²—μ–΄λ‚¬κ±°λ‚˜, κ³„μ‚°μ‹μ˜ 였λ₯˜)
  3. πŸ“Œμ‹œμŠ€ν…œ μ—λŸ¬ : 컴퓨터 μ˜€μž‘λ™μœΌλ‘œ μΈν•œ μ—λŸ¬(버그), 외뢀적인 μš”μΈμœΌλ‘œ κ°œλ°œμžκ°€ ν•΄κ²°ν•˜μ§€λͺ»ν•˜λŠ” 경우
    -> μ†ŒμŠ€ μ½”λ“œ μˆ˜μ •μœΌλ‘œ ν•΄κ²° λΆˆκ°€

- 였λ₯˜μ˜ μ’…λ₯˜ μ•Œμ•„λ³΄κΈ°

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 클래슀

- μ˜ˆμ™Έ 처리 방법 1 (try ~ catch)

try : Excption λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œλ₯Ό tryμ•ˆμ— μž‘μ„±
catch : try κ΅¬λ¬Έμ—μ„œ Exception λ°œμƒ μ‹œ μ²˜λ¦¬ν•  μ½”λ“œ μž‘μ„±
finally : Exception λ°œμƒ 여뢀와 관계없이 κΌ­ μ²˜λ¦¬ν•΄μ•Όν•˜λŠ” μ½”λ“œ μž‘μ„±

try{
μ˜ˆμ™Έ(μ—λŸ¬)κ°€ λ°œμƒν• κ²ƒκ°™μ€ μ½”λ“œ
}catch(μ—λŸ¬μž‘λŠ” λΆ€λΆ„...?){
μ²˜λ¦¬ν•  λ‚΄μš©μ˜ μ½”λ“œ
}finally{
μ—λŸ¬κ°€ λ‚˜λ“  μ•ˆλ‚˜λ“  무쑰건 μˆ˜ν–‰ν•˜λŠ” μ½”λ“œ
}

- Exception 처리λ₯Ό ν˜ΈμΆœν•œ λ©”μ†Œλ“œμ—κ²Œ μœ„μž„

- Exception μ‹€μŠ΅

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

}

0개의 λŒ“κΈ€