β μμμ κΈ°λ³Έμ μΈ νΉμ±κ³Ό νΉμ§
μμμ κΈ°μ‘΄ ν΄λμ€(λΆλͺ¨)μ λ³μμ λ©μλλ₯Ό μλ‘μ΄ ν΄λμ€(μμ)κ° λ¬Όλ €λ°μ κ·Έλλ‘ μ¬μ©νκ±°λ κΈ°λ₯μ νμ₯νλ 맀컀λμ¦μ.
- ν€μλ: extends (νμ₯νλ€) κΈ°νΈλ₯Ό μ¬μ©νμ¬ κ΅¬νν¨.
- μ μ© λ²μ: λΆλͺ¨μ λ©€λ² μ€ private μ§μμκ° λΆμ λ³μλ λ©μλλ μμμ λμ§λ§ μμμ΄ μ§μ μ κ·Όν μ μμ. λν μμ±μλ μμ λμμμ μμ ν μ μΈλ¨.
- μ΄μ : μ΄λ―Έ κ²μ¦λ μ½λλ₯Ό μ¬μ¬μ©νλ―λ‘ μ€λ³΅ μ½λκ° νκΈ°μ μΌλ‘ μ€μ΄λ€κ³ , μ μ§λ³΄μκ° μ¬μμ§λ©° νλ‘κ·Έλ¨μ νμ₯μ±μ΄ κ·Ήλνλ¨.
β λͺ¨λ ν΄λμ€μ μ‘°μ: Object ν΄λμ€ νμ
μλ°μμ κ°λ°μκ° λ§λλ λͺ¨λ ν΄λμ€λ λ³λλ‘ extendsλ₯Ό μ μ§ μμλ 무쑰건 java.lang.Object ν΄λμ€λ₯Ό μλμΌλ‘ μμλ°λλ‘ μ€κ³λμ΄ μμ.
- μ΅μμ μ‘°μ: λͺ¨λ ν΄λμ€λ μ΅νμ νμμ΄λ©°, Objectκ° μ 곡νλ κΈ°λ³Έ λ©μλλ€μ λ¬Όλ €λ°μ μ¬μ©ν μ μμ.
- μ£Όμ λ¬Όλ €λ°λ λ©μλ:
- toString(): κ°μ²΄μ ν μ€νΈ νν(μ£Όμκ° λλ λ°μ΄ν°)μ λ°νν¨.
- equals(Object obj): λ κ°μ²΄κ° λ©λͺ¨λ¦¬μμμ λμΌνμ§ λΉκ΅ν¨.
β λ¨μΌ μμ vs λ€μ€ μμ
- λ¨μΌ μμ (μλ°μ νμ€ κ·μΉ): μλ°λ ν΄λμ€ κ°μ λ€μ€ μμμ μ λ νμ©νμ§ μμ. μ¦, class Child extends Father, Motherμ κ°μ΄ λ κ° μ΄μμ λΆλͺ¨λ₯Ό λμμ μ§μ ν μ μμ.
- μ΄μ (λ€μ΄μλͺ¬λ λ¬Έμ λ°©μ§): λ§μ½ λ λΆλͺ¨ ν΄λμ€μ μ΄λ¦μ΄ λκ°μ λ©μλκ° μ‘΄μ¬ν κ²½μ°, μμ κ°μ²΄κ° μ΄λ€ λΆλͺ¨μ λ©μλλ₯Ό μ€νν΄μΌ ν μ§ μ»΄ν¨ν° μμ€ν μ΄ νλ¨ν μ μλ λͺ¨νΈμ±μ΄ λ°μνκΈ° λλ¬Έμ.
- ν΄κ²°μ± : λ€μ€ μμμ ν¨κ³Όλ₯Ό λ΄κΈ° μν΄ μλ°λ μΈν°νμ΄μ€(Interface)λΌλ νΉμ ꡬ쑰λ₯Ό μ 곡ν¨.
β μμ±μ νΈμΆ κ΄κ³ νμ
μμ κ°μ²΄λ₯Ό μμ±ν λ, λ©λͺ¨λ¦¬(Heap) λ΄λΆμμλ μμ νΌμ νμ΄λμ§ μμ. λ°λμ λΆλͺ¨ κ°μ²΄κ° λ¨Όμ μμ±λ ν μμ κ°μ²΄κ° κ·Έ κ²μ κ°μΈλ©° κ²°ν©νλ μν€ν μ²λ₯Ό κ°μ§.
- μ€ν μμ: μμ μμ±μκ° νΈμΆλλ©΄, λ΄λΆμ μΌλ‘ λΆλͺ¨ μμ±μκ° λ¨Όμ μλ²½νκ² μ€νμ λλΈ λ€ μμ μμ±μμ λλ¨Έμ§ λ³Έλ¬Έ μ½λκ° κ°λλ¨.
β super() μ super μ μ°¨μ΄μ
μ΄λ¦μ λΉμ·νμ§λ§ λ©λͺ¨λ¦¬λ₯Ό μ μ΄νλ μ©λκ° μμ ν λ€λ¦.
β super() : λΆλͺ¨μ μμ±μ νΈμΆ λͺ λ Ή
- μμ μμ±μ λ΄λΆμμ λΆλͺ¨μ μμ±μλ₯Ό κ°μ λ‘ κ°λμν€λ λ©μλ ννμ λͺ λ Ήμ΄μ.
- κ·μΉ: μμ μμ±μ λ³Έλ¬Έμμ λ°λμ 첫 μ€μλ§ μμΉν΄μΌ ν¨. μλ΅νλ©΄ μ»΄νμΌλ¬κ° λΆλͺ¨μ κΈ°λ³Έ μμ±μλ₯Ό λΆλ₯΄λ super();λ₯Ό μλμΌλ‘ 맨 첫 μ€μ μ½μ ν¨.
β‘ super : λΆλͺ¨ κ°μ²΄μ λ©λͺ¨λ¦¬ μ£Όμλ‘(μ°Έμ‘° λ³μ)
- μμ ν΄λμ€ λ΄λΆμμ λ΄ λ³μμ λΆλͺ¨μ λ³μ μ΄λ¦μ΄ μ€λ³΅λμ΄ μΆ©λν λ, λΆλͺ¨μ μμμ μ½ μ§μ΄μ κ°λ¦¬ν€λ ν€μλμ.
- thisκ° νμ¬ λ μμ μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό λ»νλ€λ©΄, superλ λ΄ λΆλͺ¨ λ°©μ μ£Όμλ₯Ό μλ―Έν¨.
β μμμ΄ λμμ΄ λλ μν©μ μμ
- μν©: νμ¬μμ 'μ μ§μ' κ΄λ¦¬ νλ‘κ·Έλ¨κ³Ό 'μλ°μ' κ΄λ¦¬ νλ‘κ·Έλ¨μ λ°λ‘ ꡬμΆν΄μΌ νλ κ²½μ°.
- μμ λ―Έμ μ© μ: λ ν΄λμ€ λͺ¨λμ μ΄λ¦, λμ΄, μ¬μλ²νΈ, μ μ¬μΌ λ± λκ°μ λ³μμ μΆλ ₯ λ©μλλ₯Ό μ€λ³΅ν΄μ νμ΄νν΄μΌ ν¨.
- μμ μ μ© μ: κ³΅ν΅ λΆλͺ¨μΈ 'μ¬μ(Employee)' ν΄λμ€λ₯Ό μ μμμ μ μνκ³ , 'μ μ§μ(Regular)'κ³Ό 'μλ°μ(PartTime)'μ μμ ν΄λμ€λ₯Ό extends ν λ€ κ°κ° 보λμ€ κ³μ°λ²μ΄λ μκΈ κ³μ°λ² λ± μμ λ§μ κ³ μ μ°¨λ³μ λ§ μλμ μΆκ° ꡬννλ©΄ λ¨.
β λ¨μ μΈλ§₯ κ΄λ¦¬ νλ‘κ·Έλ¨ μμ (κ΄λ¦¬ λμμ΄ λμΈ κ΅¬μ‘°)
κ΄λ¦¬ λμμ΄ "λμ°½(UnivFriend)"κ³Ό "μ§μ₯ λλ£(CompanyFriend)" λμΈ κ²½μ°μ μν€ν μ² μ€κ³ μ½λμ. κ³΅ν΅ λ°μ΄ν°λ μμ ν΄λμ€(Friend)λ‘ λ¬Άκ³ μμμ ν΅ν΄ ꡬνν¨.
1. κ³΅ν΅ μμ ν΄λμ€ μ μ
// π‘ κ³΅ν΅ λΆλͺ¨ ν΄λμ€
class Friend {
protected String name; // μμ ν΄λμ€μμ μ§μ μ κ·Όν μ μλλ‘ protected λ°°μΉ
protected String phone;
public Friend(String name, String phone) {
this.name = name;
this.phone = phone;
}
public void showInfo() {
System.out.println("μ΄λ¦: " + name);
System.out.println("μ ν: " + phone);
}
}
2. λ κ°μ μμ ν΄λμ€ λμ μ μ λ° μμ ꡬν μ½λ
// π‘ κ΄λ¦¬ λμ 1: λνκ΅ λμ°½ ν΄λμ€
class UnivFriend extends Friend {
private String major; // λμ°½λ§μ κ³ μ νΉμ± (μ 곡)
public UnivFriend(String name, String phone, String major) {
super(name, phone); // π‘ super()λ₯Ό ν΅ν΄ λΆλͺ¨ μμ±μμ μ΄λ¦κ³Ό μ νλ²νΈ μ¬λ£ μ λ¬
this.major = major;
}
@Override
public void showInfo() {
super.showInfo(); // π‘ super ν€μλλ‘ λΆλͺ¨μ μΆλ ₯ κΈ°λ₯ λ¨Όμ κ°λ
System.out.println("μ 곡: " + major);
}
}
// π‘ κ΄λ¦¬ λμ 2: μ§μ₯ λλ£ ν΄λμ€
class CompanyFriend extends Friend {
private String department; // μ§μ₯ λλ£λ§μ κ³ μ νΉμ± (λΆμ)
public CompanyFriend(String name, String phone, String department) {
super(name, phone); // λΆλͺ¨ μμ±μ νΈμΆ
this.department = department;
}
@Override
public void showInfo() {
super.showInfo(); // λΆλͺ¨μ κ³΅ν΅ μ 보 μΆλ ₯ νμ©
System.out.println("λΆμ: " + department);
}
}
3. λ©μΈ μ€ν λ° μ μ΄ μ½λ
public class Main {
public static void main(String[] args) {
// λμ°½ κ°μ²΄μ μ§μ₯ λλ£ κ°μ²΄ κ°κ° μμ± (Heap λ©λͺ¨λ¦¬μ λΆλͺ¨ 곡κ°κ³Ό ν¨κ» λ°°μΉλ¨)
UnivFriend uFriend = new UnivFriend("νκΈΈλ", "010-1111-2222", "μ»΄ν¨ν°κ³΅ν");
CompanyFriend cFriend = new CompanyFriend("μ΄μμ ", "010-3333-4444", "κ°λ°ν");
System.out.println("--- λμ°½ μ 보 μΆλ ₯ ---");
uFriend.showInfo();
System.out.println("\n--- μ§μ₯ λλ£ μ 보 μΆλ ₯ ---");
cFriend.showInfo();
}
}
β 1. static μμλ μμμ΄ λλκ°?
κ²°λ‘ λΆν° λ§νλ©΄, static λ³μμ static λ©μλλ μμ ν΄λμ€μκ² μμλ¨.
- μ리: λΆλͺ¨ ν΄λμ€μ staticμΌλ‘ μ μΈλ μμμ μμ ν΄λμ€ μ΄λ¦μ ν΅ν΄μλ κ·Έλλ‘ μ κ·Όνκ³ μ¬μ©ν μ μμ.
- μ½λ μμ:
-
Java
class Parent { static int sharedVal = 100; static void staticMethod() { System.out.println("λΆλͺ¨μ μ€νν± λ©μλ"); } } class Child extends Parent { // μ무κ²λ μ μ§ μμλ λΆλͺ¨μ static μμμ λ¬Όλ €λ°μ } public class Main { public static void main(String[] args) { // π‘ μμ ν΄λμ€ μ΄λ¦μ ν΅ν΄ λΆλͺ¨μ static μμμ μ κ·Ό κ°λ₯ System.out.println(Child.sharedVal); // μΆλ ₯: 100 Child.staticMethod(); // μΆλ ₯: λΆλͺ¨μ μ€νν± λ©μλ } }
β 2. λ©λͺ¨λ¦¬ μν€ν μ²λ‘ 보λ μμμ μ§μ€: "곡μ "
μμμ΄λΌκ³ νλ©΄ λΆλͺ¨μ 곡κ°μ μμμ΄ λ³΅μ¬ν΄μ μμ νλ κ²μ²λΌ λκ»΄μ§μ§λ§, staticμ μμ ν λ€λ₯΄κ² μλν¨.
- μΈμ€ν΄μ€ λ³μ μμ: μμ κ°μ²΄λ₯Ό newλ‘ μμ±ν λλ§λ€ ν(Heap) μμμ λΆλͺ¨μ λ³μ 곡κ°κ³Ό μμμ λ³μ 곡κ°μ΄ κ°κ° μλ‘κ² νμ§.
- static μμ μμ: static λ³μλ μΈμ€ν΄μ€(κ°μ²΄)μ μνμ§ μκ³ μ€μ§ Static(Method) μμμ λ¨ ν κ°λ§ μμ±λ¨. μμ ν΄λμ€κ° μ΄λ₯Ό μμλ°λλ€λ κ²μ, μλ‘μ΄ μμκ° μκΈ°λ κ²μ΄ μλλΌ Static μμμ μ‘΄μ¬νλ νλμ λκ°μ μμλ₯Ό λΆλͺ¨μ μμμ΄ '곡μ 'νλ ꡬ쑰μ.
- μ½λ μ¦λͺ μμ:
-
Java
Child.sharedVal = 500; // μμ μͺ½μμ static λ³μ κ°μ λ°κΏ System.out.println(Parent.sharedVal); // π‘ μΆλ ₯: 500 (λΆλͺ¨ μͺ½ κ°λ λ°λ, κ²°κ΅ κ°μ μμμ΄κΈ° λλ¬Έ)
β 3. β οΈ static λ©μλλ μ€λ²λΌμ΄λ©(Overriding)μ΄ λΆκ°λ₯νλ€
μΈμ€ν΄μ€ λ©μλλ λΆλͺ¨μ κ²μ μμμ΄ μ¬μ μ(Overriding)νμ¬ λ€νμ±μ ꡬνν μ μμ. νμ§λ§ static λ©μλλ μ€λ²λΌμ΄λ© κ·μΉμ΄ μ μ©λμ§ μμ.
μμ ν΄λμ€μμ λΆλͺ¨μ static λ©μλμ μμ ν λκ°μ μ΄λ¦κ³Ό ννλ‘ λ©μλλ₯Ό λ€μ μ μνλ©΄, μ€λ²λΌμ΄λ©λ κ²μ΄ μλλΌ 'λ©μλ μ¨κΉ(Method Hiding)' νμμ΄ λ°μν¨.
β μλͺ»λ μ€λ²λΌμ΄λ© μ΄ν΄μ 'λ©μλ μ¨κΉ' μμ
class SuperClass {
static void print() {
System.out.println("λΆλͺ¨ μ€νν±");
}
}
class SubClass extends SuperClass {
// @Override β μλ¬ λ°μ: μ€νν± λ©μλμλ μ€λ²λΌμ΄λ© λ§ν¬λ₯Ό λΆμΌ μ μμ
static void print() {
System.out.println("μμ μ€νν±"); // λΆλͺ¨ λ©μλλ₯Ό κ°λ €λ²λ¦Ό(Hiding)
}
}
public class Main {
public static void main(String[] args) {
SuperClass sub = new SubClass(); // λ€νμ± κ΅¬μ‘°λ‘ κ°μ²΄ μμ±
sub.print(); // π‘ μΆλ ₯ κ²°κ³Ό: "λΆλͺ¨ μ€νν±"
}
}
- μ΄μ (μ»΄νμΌ νμ λ°μΈλ©): μΌλ° μΈμ€ν΄μ€ λ©μλλ νλ‘κ·Έλ¨ μ€ν λμ€(Runtime)μ μ§μ§ νμ μλ κ°μ²΄κ° 무μμΈμ§ νμΈνκ³ λ©μλλ₯Ό μ°Ύμκ°. λ°λ©΄, static λ©μλλ μ€νλκΈ°λ μ μΈ μ»΄νμΌ μμ μ μ°Έμ‘° λ³μμ 'νμ 'λ§ λ³΄κ³ μ€νν λ©μλλ₯Ό 미리 κ²°μ ν΄ λ²λ¦Ό. μ μ½λμμ sub λ³μμ νμ μ΄ SuperClassμ΄κΈ° λλ¬Έμ μ€μ μλ§Ήμ΄κ° SubClassμΌμ§λΌλ λΆλͺ¨μ λ©μλλ₯Ό μ€νν΄ λ²λ¦¬λ κ²μ.
β μ΅μ’ μμ½
- λΆλͺ¨μ static λ³μμ λ©μλλ μμμκ² μμλμ΄ μμ μ΄λ¦μΌλ‘ μ¬μ© κ°λ₯ν¨.
- 물리μ μΌλ‘ 볡μ¬λλ κ²μ΄ μλλΌ Static μμμ λ¨ νλμ μμμ λΆλͺ¨μ μμμ΄ κ³΅μ νλ λ©μ»€λμ¦μ.
- static λ©μλλ μ€ν μμ μ΄ μλ μ»΄νμΌ μμ μ κ²°ν©νλ―λ‘ μ€λ²λΌμ΄λ©(λ€νμ±)μ΄ λΆκ°λ₯νλ©°, λκ°μ΄ λ§λ€ κ²½μ° λ¨μν λΆλͺ¨μ λ©μλλ₯Ό κ°λ¦¬λ 'λ©μλ μ¨κΉ(Hiding)'μ΄ μΌμ΄λ¨.

β νλ‘κ·Έλ¨ μ€λ₯ (Error)μ μ’ λ₯
μ»΄ν¨ν° νλ‘κ·Έλ¨μ΄ μ€νλλ κ³Όμ μμ λ°μνλ μ€λ₯λ λ°μ μμ κ³Ό μ±κ²©μ λ°λΌ 3κ°μ§λ‘ λΆλ₯λ¨.
- μ»΄νμΌ μ€λ₯ (Compile-time Error): μμ€ μ½λμ λ¬Έλ²μ΄ νλ € μλ° μ»΄νμΌλ¬(javac)κ° μ€ν νμΌ(.class)μ λ§λ€μ§ λͺ»νκ³ λΉ¨κ° μ€μ λμ°λ μ€λ₯μ. κ°μ₯ μμ νκ³ λ°κ²¬νκΈ° μ¬μ.
- λ Όλ¦¬μ μ€λ₯ (Logical Error): μ»΄νμΌλ μ λκ³ νλ‘κ·Έλ¨λ λ©μΆμ§ μκ³ μ€νλμ§λ§, κ°λ°μμ κ³μ° μ€μ λ±μΌλ‘ μΈν΄ μνλ κ²°κ³Όκ° λμ€μ§ μλ μ€λ₯μ (μ: λ§μ μ°μ°μ λΊμ κΈ°νΈλ₯Ό λ£μ).
- λ°νμ μ€λ₯ (Runtime Error): μ»΄νμΌμ μλ²½ν λλ¬μΌλ, νλ‘κ·Έλ¨μ΄ μ€νλλ λμ€(Runtime) μμΈ‘νμ§ λͺ»ν μν©μ λ§λ κ°μ λ‘ κ³ μ₯ λλ μ€λ₯μ. μμΈ μ²λ¦¬λ λ°λ‘ μ΄ λ°νμ μ€λ₯λ₯Ό λ°©μ§νκΈ° μν΄ μ¬μ©ν¨.
β μ€λ₯ μ’ λ£μ ν΄κ²° λ°©λ²
- μ€λ₯ μ’ λ£ (Abnormal Termination): λ°νμ μ€λ₯κ° λ°μνλ©΄ μλ° κ°μ λ¨Έμ (JVM)μ μ¦μ ꡬλμ μ€λ¨νκ³ μλ¬ λ©μμ§λ₯Ό μμλ΄λ©° νλ‘κ·Έλ¨μ κ°μ μ’ λ£μν΄. μΉ μλ²λ κΈμ΅ νλ‘κ·Έλ¨μ κ²½μ° μμ€ν μ μ²΄κ° λ§λΉλλ μΉλͺ μ μΈ κ²°κ³Όλ₯Ό μ΄λν¨.
- ν΄κ²° λ°©λ² (μμΈ μ²λ¦¬ - Exception Handling): νλ‘κ·Έλ¨μ΄ κΈμμ€λ½κ² μ£½λ κ²μ λ§κ³ , μ€λ₯κ° λ°μνμ λ μ°ν λλ‘λ₯Ό κ°μ€νμ¬ νλ‘κ·Έλ¨μ λκΉμ§ μ μ μ€νμν€λλ‘ μ μ΄νλ λ©μ»€λμ¦μ. μλ°μμλ try - catch - finally λΈλ‘μ μν€ν
μ²λ‘ μ¬μ©ν¨.
try { // π‘ μμΈκ° λ°μν κ°λ₯μ±μ΄ μλ μνν μ½λ λ°°μΉ int result = 10 / 0; } catch (ArithmeticException e) { // π‘ μμΈκ° λ°μνμ λ μ€νν μμ΅μ© μ°ν μ½λ λ°°μΉ System.out.println("0μΌλ‘ λλ μ μμ΅λλ€. κΈ°λ³Έκ°μΌλ‘ λ체ν©λλ€."); } finally { // π‘ μμΈ λ°μ μ¬λΆμ μκ΄μμ΄ λ¬΄μ‘°κ±΄ λ§μ§λ§μ μ€νλμ΄μΌ νλ μ 리 μ½λ (μμ ν΄μ λ±) }
β μμΈ ν΄λμ€μ κ³μΈ΅ ꡬ쑰
μλ°λ νλ‘κ·Έλ¨ μ€ν μ€ λ°μν μ μλ λͺ¨λ μ€λ₯ μν©μ 'κ°μ²΄'λ‘ λ§λ€μ΄μ κ΄λ¦¬ν¨. λ°λΌμ μ€λ₯λ λΆλͺ¨-μμ μμ ꡬ쑰λ₯Ό κ°μ§.
- Throwable : μλ°μμ μ€λ₯λ‘ λμ Έμ§ μ μλ λͺ¨λ ν΄λμ€μ μ΅μμ μ‘°μμ.
- Error νμ: μμ€ν λ©λͺ¨λ¦¬ λΆμ‘±(OutOfMemoryError)μ΄λ νλμ¨μ΄ κ³ μ₯ λ± νλ‘κ·Έλ¨ μ½λλ‘ μμ΅ν μ μλ μ¬κ°ν ꡬ쑰μ μ€λ₯μ. κ°λ°μκ° μ½λλ‘ μ‘μ μ μμ.
- Exception νμ: κ°λ°μκ° λ°μμ μμΈ‘νκ³ μ½λλ₯Ό ν΅ν΄ μ μ μνλ‘ μμ΅ν μ μλ κ°λ²Όμ΄ μ€λ₯μ. μμΈ μ²λ¦¬μ μ§μ μ μΈ λμμ.
- Checked Exception: RuntimeExceptionμ μμλ°μ§ μμ μμΈλ€. μ»΄νμΌλ¬κ° μμΈ μ²λ¦¬λ₯Ό 무쑰건 λͺ μνλΌκ³ κ°μ ν¨. μ μ μΌλ©΄ μ»΄νμΌ(λΉ¨κ° μ€) μμ²΄κ° μ λ¨ (μ: IOException, SQLException).
- Unchecked Exception: RuntimeExceptionκ³Ό κ·Έ μμλ€. μ»΄νμΌλ¬κ° κ°μ νμ§ μμ κ°λ°μμ μ£Όμλ ₯μ μμ‘΄ν¨.
β RuntimeException (Unchecked Exception)
μμΈ κ³μΈ΅ ꡬ쑰 μ€ κ°μ₯ λ νΉνκ³ λΉλ²νκ² λ§λλ μμμ.
- νΉμ§: μ£Όλ‘ κ°λ°μμ λ Όλ¦¬μ μ€λ₯λ μ½λ© μ€μ(μ£Όμ λΆμ‘±)λ‘ μΈν΄ λ°μνλ μμΈλ€μ λͺ¨μλμ ν΄λμ€μ.
- 맀컀λμ¦: μ»΄νμΌλ¬κ° μμ΅ μ½λλ₯Ό μ μλμ§ κ°μνμ§ μκΈ° λλ¬Έμ(try-catchλ₯Ό μ μ¨λ μ»΄νμΌμ ν΅κ³Όλ¨) νλ‘κ·Έλ¨ μ€ν μ κΉμ§ μ€λ₯λ₯Ό μΈμ§νκΈ° μ΄λ €μ. μ² μ ν μ½λ κ²μ¦κ³Ό μμΈ μ²λ¦¬κ° λλ°λμ΄μΌ ν¨.
- λνμ μΈ μμ ν΄λμ€λ€:
- NullPointerException : κ°μ²΄ μ£Όμλ‘μ΄ λΉμ΄μλ μν(null)μΈλ° κ·Έ μμ λ³μλ λ©μλλ₯Ό μ°Έμ‘°νλ €κ³ μ κ·Όν λ λ°μν¨.
- ArrayIndexOutOfBoundsException : λ°°μ΄μ ν¬κΈ°κ° 5μΈλ° 6λ² μΈλ±μ€ μΉΈμ μ΄μ΄λ¬λΌκ³ μμ²ν λ λ°μν¨.
- ArithmeticException : μ μλ₯Ό 0μΌλ‘ λλλ λ± μνμ μΌλ‘ λΆκ°λ₯ν μ°μ°μ λͺ λ Ήν λ λ°μν¨.
β Java API Document νμΈνλ μμ
λ΄κ° μ°λ €λ μλ° νμ€ λ©μλκ° μ΄λ€ μμΈλ₯Ό λμ§λμ§ μκ³ μΆμ λ 곡μ API λ¬Έμλ₯Ό νμΈνλ λ°©λ²μ. (μ£Όλ‘ μ€λΌν΄ 곡μ μ¬μ΄νΈμ μλ° API λ¬Έμλ₯Ό κΈ°μ€ν¨)
- μν©: λ¬Έμμ΄μ μ μλ‘ λ°κΏμ£Όλ Integer.parseInt(String s) λ©μλλ₯Ό μ¬μ©νλ €λ κ²½μ°.
- νμΈ μμ:
-
- λ¬Έμ κ²μμ°½μ Integer ν΄λμ€λ₯Ό μ°Ύκ³ , λ©μλ 리μ€νΈ μ€ parseInt(String s) λͺ μΈμλ₯Ό μ°Ύμ.
- λ©μλ μ μΈλΆ νλ¨μ "Throws" νλͺ©μ μ λ° νμΈν΄μΌ ν¨.
- λ¬Έμλ₯Ό 보면 Throws: NumberFormatException μ΄λΌκ³ λͺ μλμ΄ μμ. κ·Έ μμ μ€λͺ μ μ½μ΄λ³΄λ©΄ *"λ¬Έμμ΄μ΄ μ μλ‘ λ³νλ μ μλ ννκ° μλ λ λ°μνλ€"*κ³ μ ν μμ.
- κ²°κ³Ό λ§€ν: κ°λ°μλ μ΄ λͺ μΈλ₯Ό λ³΄κ³ μλμ κ°μ΄ λ°©μ΄ μ½λλ₯Ό μν€ν μ²μ 미리 μ¬μ΄λ μ μμ.
String input = "123abc"; // μ«μκ° μλ λ¬Έμκ° μμ try { int num = Integer.parseInt(input); // π‘ Throws λͺ μΈμ μ νλλ‘ NumberFormatException λ°μν¨ } catch (NumberFormatException e) { System.out.println("μ«μ ν¬λ§·μ΄ μλͺ»λμ΄ κΈ°λ³Έκ° 0μΌλ‘ μ΄κΈ°νν©λλ€."); } -
μλ°(Java)μμ μμΈλ₯Ό μμ΅νλ ν΅μ¬ λκ΅¬μΈ try - catch λ¬Έμ λν ꡬλ μ리μ 맀컀λμ¦ μ€μ¬μ μ 리μ.
β try - catch λ¬Έμ μ μμ κΈ°λ₯
- μ μ: νλ‘κ·Έλ¨ μ€ν μ€ λ°μν μ μλ λ°νμ μμΈ(μ€λ₯)λ₯Ό κ°λ‘μ±μ, νλ‘κ·Έλ¨μ΄ λΉμ μμ μΌλ‘ μ£½μ§ μλλ‘ λ°©μ΄λ§μ μΉλ μ μ΄λ¬Έμ.
- κΈ°λ₯: μμΈκ° λ°μνμ λ νλ‘κ·Έλ¨μ κ°μ μ’ λ£λ₯Ό λ§κ³ , κ°λ°μκ° λ―Έλ¦¬ μ€λΉν μ°ν λλ‘(λλΉμ± )λ₯Ό λ°λΌ μ μμ μΈ μ€ν νλ¦μ μ μ§μν΅λλ€.
β try - catch κΈ°λ³Έ ꡬ쑰 λ° λ§€μ»€λμ¦
- try λΈλ‘: μμΈ(μ€λ₯)κ° λ°μν κ°λ₯μ±μ΄ μλ μνν μ½λλ₯Ό λͺ¨μλλ 곡κ°μ.
- catch λΈλ‘: try λΈλ‘ μμμ μ§μ§λ‘ μμΈκ° ν°μ‘μ λλ§ κ°λλλ λΉμ μμ΅ κ³΅κ°μ. κ΄νΈ () μμ μμ΅νκ³ μ νλ μμΈ κ°μ²΄μ νμ μ λͺ μν΄μΌ ν¨.
β μμΈ λ°μ μλ리μ€λ³ ꡬλ νλ¦
μλλ¦¬μ€ β : try λΈλ‘ λ΄μμ μμΈκ° λ°μν κ²½μ° (λΉμ μν©)
-
- try λΈλ‘μ μμμλΆν° ν μ€μ© μ€ννλ€κ° μμΈκ° λ°μνλ μκ°, κ·Έ μ¦μ μ€νμ μ€λ¨ν¨ (λ°μ λ¨μ μ½λλ 무μλ¨).
- λ°μν μμΈ κ°μ²΄μ μΌμΉνλ νμ μ κ°μ§ catch λΈλ‘μ΄ μλμ§ μμμλΆν° μ°¨λ‘λ‘ κ²μ¬ν¨.
- μΌμΉνλ catch λΈλ‘μ μ°ΎμΌλ©΄ κ·Έ λ΄λΆ μ½λλ₯Ό μ€ννμ¬ μν©μ μμ΅ν¨.
- try-catch μ 체 λ¬Έμ λΉ μ Έλκ° κ·Έ λ€μ μ€μ μ½λλ₯Ό μ μμ μΌλ‘ μ΄μ΄μ μ€νν¨.
μλλ¦¬μ€ β‘: try λΈλ‘ λ΄μμ μμΈκ° λ°μνμ§ μμ κ²½μ° (νν μν©)
-
- try λΈλ‘ μμ λͺ¨λ μ½λκ° μ μμ μΌλ‘ λκΉμ§ μ€νλ¨.
- catch λΈλ‘μ μ€νλμ§ μκ³ ν΅μ§Έλ‘ ν¨μ€λ¨.
- try-catch μ 체 λ¬Έ μλμ μ½λλ₯Ό μ΄μ΄μ μ€νν¨.
β μ€λ¬΄ μ½λ μμ
β μμΈ μ²λ¦¬λ₯Ό νμ§ μμ νλ‘κ·Έλ¨μ΄ λμ€μ μ£½λ κ²½μ°
public class Main {
public static void main(String[] args) {
System.out.println("νλ‘κ·Έλ¨ μμ");
int sVal = 10 / 0; // π₯ λ°νμ μλ¬ λ°μ (ArithmeticException)
// μλ¬ λ°μμΌλ‘ μΈν΄ μλ μ½λλ μ€νλμ§ λͺ»νκ³ κ°μ μ’
λ£λ¨
System.out.println("μ°μ° κ²°κ³Ό: " + sVal);
System.out.println("νλ‘κ·Έλ¨ μ μ μ’
λ£");
}
}
β try - catch λ‘ μμΈλ₯Ό μμ΅νμ¬ μμ νκ² μ€ννλ κ²½μ°
public class Main {
public static void main(String[] args) {
System.out.println("νλ‘κ·Έλ¨ μμ");
try {
System.out.println("π‘ [try] μ°μ°μ μλν©λλ€.");
int sVal = 10 / 0; // π₯ μ¬κΈ°μ μμΈ λ°μ! μ¦μ catch λΈλ‘μΌλ‘ μκ°μ΄λν¨
System.out.println("[try] μ΄ μ½λλ μ€νλμ§ μμ΅λλ€.");
} catch (ArithmeticException e) {
// π¨ μμ΅ κ°λ
System.out.println("β οΈ [catch] μλ¬ λ°μ: 0μΌλ‘ λλ μ μμ΄ κ²°κ³Όλ₯Ό 0μΌλ‘ μ²λ¦¬ν©λλ€.");
}
// π‘ μμ΅μ΄ μλ£λμμΌλ―λ‘ μλ μ½λκ° μ μ μ€νλ¨
System.out.println("νλ‘κ·Έλ¨ μ μ μ’
λ£");
}
}
β λ€μ€ catch λΈλ‘ νμ© κ·μΉ (μμ κ³μΈ΅ κ³ λ €)
νλμ try λΈλ‘ μμμ μ¬λ¬ μ’ λ₯μ μμΈκ° λ°μν μ μλ€λ©΄, catch λΈλ‘μ μλλ‘ μ¬λ¬ κ° λ§λΆμ¬ λ€μ€ λ°©μ΄λ²½μ μΈμΈ μ μμ.
μ΄λ λΆλͺ¨-μμ μμ κ³μΈ΅μ λ°λΌ μμ μμΈ ν΄λμ€λ₯Ό 무쑰건 μμμ, λΆλͺ¨ μμΈ ν΄λμ€λ₯Ό νμμ λ°°μΉν΄μΌ ν¨.
try {
int[] arr = new int[3];
arr[5] = 100; // π₯ ArrayIndexOutOfBoundsException λ°μ κ°λ₯μ±
int num = Integer.parseInt("abc"); // π₯ NumberFormatException λ°μ κ°λ₯μ±
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("λ°°μ΄ μΈλ±μ€ λ²μλ₯Ό λ²μ΄λ¬μ΅λλ€.");
} catch (NumberFormatException e) {
System.out.println("μ«μλ‘ λ°κΏ μ μλ λ¬Έμμ΄μ
λλ€.");
} catch (Exception e) {
// π‘ λͺ¨λ μμΈμ μ‘°μμΈ Exceptionμ 맨 λ§μ§λ§μ λ°°μΉνμ¬
// μμμ κ±Έλ¬μ§μ§ μμ μμμΉ λͺ»ν λͺ¨λ μμΈλ₯Ό μ΅μ’
μμ΅νλ μμ μ₯μΉλ‘ μ
System.out.println("μ μ μλ μμΈκ° λ°μνμ΅λλ€.");
}
μλ°(Java)μμ λͺ¨λ μμΈμ μ€λ₯μ μμ‘°μ΄μ μ΅μμ κ°λ¦¬ν€λ μ€κ³λκ° λ°λ‘ Throwable ν΄λμ€μ.
μλ° νλ‘κ·Έλ¨μμ throw ν€μλλ₯Ό ν΅ν΄ λμ Έμ§ μ μλ(Throwable) λͺ¨λ κ°μ²΄λ λ°λμ μ΄ ν΄λμ€λ₯Ό μμλ°μμΌ λ©λͺ¨λ¦¬ μν€ν μ² μμμ μμΈ μμ€ν μΌλ‘ μΈμλ¨.
β 1. Throwable ν΄λμ€μ κ³μΈ΅μ μμΉ
μλ°μ λͺ¨λ κ°μ²΄μ μ‘°μμΈ Object λ°λ‘ μλμ μμΉνλ©°, μμμΌλ‘ Errorμ Exception λ κ°μ κ±°λν κΈ°λ₯μ κ±°λλ¦¬κ³ μμ.
- java.lang.Object (μ΅μμ κ°μ²΄)
- βββ java.lang.Throwable (λͺ¨λ μμΈ/μ€λ₯μ μμ‘°)
- βββ java.lang.Error (λν μ¬κ³ : μ½λλ‘ μμ΅ λΆκ°)
- βββ java.lang.Exception (μΌλ° μμΈ: μ½λλ‘ μμ΅ κ°λ₯)
- βββ java.lang.Throwable (λͺ¨λ μμΈ/μ€λ₯μ μμ‘°)
β 2. λ μ’ λ₯μ νμ(μμ) κ΅¬λ³ ν΅μ¬
Throwableμ μμλ°μ μμλ€μ μ±κ²©μ΄ μμ ν κ·Ήλ¨μ μΌλ‘ λλ¨.
- Error κ³μ΄: JVM λ΄λΆ λ©λͺ¨λ¦¬ κ³ κ°(OutOfMemoryError), μ€ν κ³΅κ° μ€λ²νλ‘μ°(StackOverflowError) λ± μμ€ν λ¨μμ μΉλͺ μ μΈ κ²°ν¨μ. κ°λ°μκ° μ½λ μμ€μμ try-catchλ‘ κ°λ‘μ±μ μμ΅ν μ μμΌλ―λ‘ λ¬΄μ‘°κ±΄ νλ‘κ·Έλ¨μ΄ μ£½μ.
- Exception κ³μ΄: κ°λ°μμ μ€μλ μ¬μ©μμ μλͺ»λ μ‘°μμΌλ‘ μΈν΄ μΌμ΄λλ κ°λ²Όμ΄ μ€λ₯ μν©μ. μμΈ‘μ΄ κ°λ₯νλ―λ‘ try-catchλ‘ μ‘μλ΄μ΄ μ°ν λλ‘λ₯Ό κ°μ€(μμ΅)ν μ μμ.
β 3. Throwable ν΄λμ€μ ν΅μ¬ λ΄μ₯ λ©μλ κΈ°λ₯
Throwable ν΄λμ€λ μμλ€μκ² μμΈκ° λ°μν μμΈ μμΈκ³Ό κ²½λ‘λ₯Ό μΆμ ν μ μλ κ°λ ₯ν ν΅μ¬ λ©μλλ€μ λ¬Όλ €μ€. κ°λ°μκ° μμΈ μ²λ¦¬λ₯Ό ν λ κ°μ₯ λ§μ΄ μ¬μ©νλ κΈ°λ₯λ€μ.
β getMessage() : μλ¬ λ©μμ§ λ°ν
- μμΈ κ°μ²΄ λ΄λΆμ μ μ₯λ λ°μ μμΈμ λν ν΅μ¬ μμ½ ν μ€ μ½λ©νΈ(λ¬Έμμ΄)λ₯Ό 리ν΄ν¨.
- μ½λ μμ: System.out.println(e.getMessage()); β‘οΈ μΆλ ₯: "/ by zero" (0μΌλ‘ λλμμ λ)
β‘ toString() : μμΈ μ΄λ¦κ³Ό λ©μμ§ ν΅ν© λ°ν
- λ°μν μμΈ ν΄λμ€μ ν λ€μ(ν¨ν€μ§ κ²½λ‘ ν¬ν¨)κ³Ό μλ¬ λ©μμ§λ₯Ό κ²°ν©νμ¬ λ¬Έμμ΄λ‘ λ΄λμ.
- μ½λ μμ: System.out.println(e.toString()); β‘οΈ μΆλ ₯: "java.lang.ArithmeticException: / by zero"
β’ printStackTrace() : μΆμ κ²½λ‘ μμΈ μΆλ ₯ (κ°μ₯ μ€μ)
- μμΈκ° μ΅μ΄λ‘ λ°μν μμ€ μ½λμ μμΉ(ν΄λμ€λͺ , λ©μλλͺ , μ€ λ²νΈ)λΆν° μμν΄μ, μ΄λ€ κ²½λ‘λ₯Ό κ±°μ³ λ³μκ° νκ³ λ΄λ €μλμ§ μ€ν(Stack) μμμ λ©λͺ¨λ¦¬ μ΄λ νμ μ νλ©΄μ λΉ¨κ° κΈμ¨λ‘ μ λΆ μμλ.
- μμΈ μ²λ¦¬λ₯Ό νλλΌλ μ΄ λ©μλλ₯Ό λ΄λΆμ μ¬μ΄λμ΄μΌ κ°λ°μκ° λμ€μ λ‘κ·Έλ₯Ό λ³΄κ³ λ²κ·Έλ₯Ό μ‘μ μ μμ.
β 4. μ€μ μλ λ° λ©μλ νμ© μμ
public class ThrowableExample {
public static void main(String[] args) {
try {
int[] arr = new int[2];
System.out.println(arr[5]); // π₯ ArrayIndexOutOfBoundsException λ°μ
} catch (Throwable t) {
// π‘ λ€νμ± μν€ν
μ²: Exceptionμ μ‘°μμΈ Throwable νμ
μΌλ‘λ λͺ¨λ μμΈλ₯Ό λ€ λ°μλΌ μ μμ
System.out.println("1. getMessage κ²°κ³Ό: " + t.getMessage());
System.out.println("-------------------------------------");
System.out.println("2. toString κ²°κ³Ό: " + t.toString());
System.out.println("-------------------------------------");
System.out.println("3. printStackTrace κ²°κ³Ό:");
t.printStackTrace(); // μ½μμ μμΈ μΆμ μ΄λ ₯ μΆλ ₯
}
}
}
- μΆλ ₯ κ²°κ³Ό λ°μ΄ν° λ§€ν:
- getMessage : "Index 5 out of bounds for length 2"
- toString : "java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 2"
- printStackTrace : μμ€μ½λ λͺ λ²μ§Έ μ€μμ λ°°μ΄ λ°© λ²νΈ μλ¬κ° ν°μ‘λμ§ μΆμ κ²½λ‘λ₯Ό λ‘κ·Έλ‘ μΆλ ₯ν¨.
printStackTrace
β 1. printStackTrace()μ ν΅μ¬ κΈ°λ₯
- μ€ν λ©λͺ¨λ¦¬ μΆμ : μμΈκ° ν°μ§κΈ° μ§μ κΉμ§ κ°μ λ¨Έμ (JVM)μ Stack μμμ μ΄λ€ λ©μλλ€μ΄ μμλλ‘ μμ¬μ μ€νλκ³ μμλμ§ κ·Έ κ³λ³΄λ₯Ό μ λΆ μ°Ύμλ΄μ΄ νμΌλͺ , λ©μλλͺ , μμ€ μ½λ μ€ λ²νΈ(Line Number)κΉμ§ λͺ μν¨.
- λΉμ μ μ’ λ£ μλ νμΈ: try-catchλ¬ΈμΌλ‘ μμΈλ₯Ό κ°λ‘μ±κΈ° λλ¬Έμ νλ‘κ·Έλ¨μ μ μ ꡬλ μνλ₯Ό μ μ§νμ§λ§, μ΄ λ©μλ λλΆμ λ΄λΆμ μ΄λ€ μ¬κ°ν λ²κ·Έκ° μμλμ§ κ°λ°μκ° μ‘μμΌλ‘ μΆμ ν μ μμ.
β 2. μ½μ μΆλ ₯ κ²°κ³Ό ν΄μ²΄ (λ‘κ·Έ μ½λ λ°©λ²)
μμΈκ° λ°μνμ λ printStackTrace()κ° μμλ΄λ λΉ¨κ° κΈμ¨μ λ‘κ·Έλ κ°μ₯ μλμͺ½ μ€λΆν° μμͺ½ μ€ μμλλ‘ μ½μ΄ μ¬λΌκ°μΌ ν¨.
- 맨 μλ«μ€: νλ‘κ·Έλ¨μ μμμ (main λ©μλ)μ.
- μ€κ° μ€λ€: mainμμ μ΄λ€ λ©μλλ₯Ό νκ³ λ€μ΄κ°λμ§ μ΄λ κ²½λ‘λ₯Ό λνλ.
- 맨 μμ€: μ΅μ’ μ μΌλ‘ μμΈκ° λ°μν μ§μ§ μμΈ(μμΈ ν΄λμ€ μ΄λ¦ λ° λ©μμ§)κ³Ό μ¬κ±΄μ΄ ν°μ§ μ΅μ’ μμ€ μ½λ μμΉμ.
β 3. μ€λ¬΄ μ½λ λ° μΆλ ₯ λ§€ν μμ
μΌλΆλ¬ λ©μλλ₯Ό 3λ¨κ³λ‘ κ±°μ³μ μμΈλ₯Ό λ°μμν¨ λ€ printStackTrace()κ° μ€ν λ©λͺ¨λ¦¬λ₯Ό μ΄λ»κ² μμΆμ νλμ§ λ³΄μ¬μ£Όλ ꡬ쑰μ.
public class Test {
public static void main(String[] args) {
try {
methodA(); // π‘ 1. mainμμ methodA νΈμΆ
} catch (ArithmeticException e) {
System.out.println("--- printStackTrace μΆλ ₯ μμ ---");
e.printStackTrace(); // π¨ μμΈ μΆμ κ°λ
System.out.println("--- printStackTrace μΆλ ₯ λ ---");
}
System.out.println("νλ‘κ·Έλ¨μ μ£½μ§ μκ³ λκΉμ§ μ€νλ¨");
}
public static void methodA() {
methodB(); // π‘ 2. methodAμμ methodB νΈμΆ
}
public static void methodB() {
int crash = 10 / 0; // π₯ 3. μ¬κΈ°μ μ΅μ’
ArithmeticException λ°μ!
}
}
π μ€μ μ½μ μΆλ ₯ κ²°κ³Ό λ°μ΄ν°:
--- printStackTrace μΆλ ₯ μμ ---
java.lang.ArithmeticException: / by zero
at Test.methodB(Test.java:19)
at Test.methodA(Test.java:15)
at Test.main(Test.java:5)
--- printStackTrace μΆλ ₯ λ ---
νλ‘κ·Έλ¨μ μ£½μ§ μκ³ λκΉμ§ μ€νλ¨
- μΆμ κ²½λ‘ ν΄λ
:
-
- at Test.main(Test.java:5) β‘οΈ 5λ²μ§Έ μ€μμ methodA()λ₯Ό λΆλ μ.
- at Test.methodA(Test.java:15) β‘οΈ 15λ²μ§Έ μ€μμ methodB()λ₯Ό λΆλ μ.
- at Test.methodB(Test.java:19) β‘οΈ 19λ²μ§Έ μ€μμ 0μΌλ‘ λλλ λν μ¬κ³ κ° ν°μ§.
- java.lang.ArithmeticException: / by zero β‘οΈ μ¬κ³ μμΈμ μνμ μ°μ° μ€λ₯μ.
-
β 4. μ€λ¬΄ μ΄μ νκ²½μμμ μ£Όμ μ¬ν (보μ λ° μ±λ₯)
- 보μ μ·¨μ½μ λ°μ: printStackTrace()λ μμ€ μ½λμ ν¨ν€μ§ ꡬ쑰, ν΄λμ€λͺ , λ©μλλͺ μ κ°κ° μμ΄ λ ΈμΆν¨. λ§μ½ μ€μ μλΉμ€ μ€μΈ μΉμ¬μ΄νΈ μμ€ν νλ©΄μ μ΄ μ λ³΄κ° κ·Έλλ‘ λ ΈμΆλλ©΄ ν΄μ»€μκ² μν€ν μ² μ€κ³λλ₯Ό λ겨주λ κΌ΄μ΄ λμ΄ λ³΄μμ λ§€μ° μνν¨.
- μ±λ₯ μ ν: μ΄ λ©μλλ νκ³Ό μ€νμ λ©λͺ¨λ¦¬ μΆμ μ μν΄ μμ€ν μμμ μκ°λ³΄λ€ λ§μ΄ μλͺ¨ν¨. λκ·λͺ¨ μ¬μ©μκ° λͺ°λ¦¬λ μλ²μμ λ¨λ°νλ©΄ μ±λ₯μ κ°μλ¨Ήμ.
- ν΄κ²°μ± : νμ μ€λ¬΄μμλ κ°λ° μ€μλ§ μ½μλ‘ νμΈνκ³ , μ€μ λ°°ν¬ν λλ μ½μ μΆλ ₯μ κΈμ§νλ©°, Logbackμ΄λ log4j κ°μ μ λ¬Έ λ‘κΉ λΌμ΄λΈλ¬λ¦¬λ₯Ό κ²°ν©νμ¬ μμ ν νμΌ μμ€ν ννλ‘ μλ¬ λ‘κ·Έλ₯Ό κΈ°λ‘ κ΄λ¦¬ν¨.
μλ°(Java)μμ λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μμ ν΄λμ€μμ μ¬μ μνλ μ€λ²λΌμ΄λ©(Overriding)μ μ§νν λ, λ©μλκ° λμ§λ μμΈ(Exception)μλ μμ κ΄κ³μ λ°λ₯Έ μ격ν μν€ν μ² κ·μΉμ΄ μ‘΄μ¬ν¨.
μλ° μ»΄νμΌλ¬λ λ€νμ± κ΅¬ν μ μμ μ±μ 보μ₯νκΈ° μν΄ μ΄ κ·μΉμ κ°μ ν¨. ν΅μ¬ κ·μΉκ³Ό λ©μ»€λμ¦μ ν©νΈ μμ£Όλ‘ ν΄μ²΄ν¨.
β μμΈ μ€λ²λΌμ΄λ©μ λμμΉ: "νμ₯ λΆκ°, μΆμ κ°λ₯"
μμ ν΄λμ€μμ λ©μλλ₯Ό μ€λ²λΌμ΄λ©ν λ, λΆλͺ¨ λ©μλκ° λμ§λ μμΈλ³΄λ€ λ ν¬κ±°λ(μμ ν΄λμ€) λ λ§μ μ’ λ₯μ Checked μμΈλ₯Ό λμ§ μ μμ. μ¦, μμΈμ λ²μλ₯Ό μ’νκ±°λ μμ λμ§μ§ μλ λ°©ν₯(μΆμ)μΌλ‘λ§ μ€λ²λΌμ΄λ©μ΄ νμ©λ¨.
β οΈ μ€μν΄μΌ νλ 3λ μμΈ κ·μΉ
- λ μμμ μμΈ μ μΈ λΆκ°: λΆλͺ¨ λ©μλκ° IOExceptionμ λμ§λ€λ©΄, μμ λ©μλλ κ·Έ μ‘°μμΈ Exceptionμ΄λ Throwableμ λμ§ μ μμ.
- μλ‘μ΄ Checked μμΈ μΆκ° λΆκ°: λΆλͺ¨κ° μ μΈνμ§ μμ μμ ν μλ‘μ΄ Checked μμΈ(μ: SQLException)λ₯Ό λ§μλλ‘ μΆκ°ν μ μμ.
- μμ μμΈ μ μΈμ κ°λ₯ (μΆμ): λΆλͺ¨ λ©μλκ° Exceptionμ λμ§λ€λ©΄, μμ λ©μλλ κ·Έ μμ ν΄λμ€μΈ IOExceptionμ΄λ NullPointerExceptionμΌλ‘ μ’νμ λμ§λ κ²μ΄ κ°λ₯ν¨. λν μμΈλ₯Ό μμ λμ§μ§ μλλ‘ μμ νλ κ²λ νμ©λ¨.
β μλ¬κ° λ°μνλ μλͺ»λ μ€λ²λΌμ΄λ© μμ
import java.io.IOException;
import java.sql.SQLException;
class Parent {
// π‘ λΆλͺ¨ λ©μλλ IOException(Checked Exception)μ λμ§λλ‘ μ€κ³λ¨
public void process() throws IOException {
System.out.println("λΆλͺ¨ μ²λ¦¬");
}
}
class Child extends Parent {
// β μ»΄νμΌ μλ¬ λ°μ: λΆλͺ¨λ³΄λ€ λ κ΄λ²μν μμ μμΈ(Exception)λ₯Ό λμ§ μ μμ
@Override
public void process() throws Exception {
System.out.println("μμ μ²λ¦¬");
}
}
class Child2 extends Parent {
// β μ»΄νμΌ μλ¬ λ°μ: λΆλͺ¨ μ€κ³λμ μλ μλ‘μ΄ Checked μμΈ(SQLException)λ₯Ό μΆκ°ν μ μμ
@Override
public void process() throws SQLException {
System.out.println("μμ μ²λ¦¬ 2");
}
}
β μ μμ μΌλ‘ μλνλ μ¬λ°λ₯Έ μ€λ²λΌμ΄λ© μμ
import java.io.FileNotFoundException;
import java.io.IOException;
class Parent {
public void process() throws IOException {
System.out.println("λΆλͺ¨ μ²λ¦¬");
}
}
class ChildGood1 extends Parent {
// β κ°λ₯: λΆλͺ¨κ° μ μΈν IOExceptionμ νμ(μμ) μμΈμΈ FileNotFoundExceptionμΌλ‘ λ²μλ₯Ό μ’ν
@Override
public void process() throws FileNotFoundException {
System.out.println("μμ μ²λ¦¬ 1");
}
}
class ChildGood2 extends Parent {
// β κ°λ₯: μμ λ©μλ λ΄λΆμμ μμΈλ₯Ό μλ²½ν μμ΅νμ¬ μΈλΆλ‘ μμ μ λμ§λλ‘ μΆμν¨
@Override
public void process() {
System.out.println("μμ μ²λ¦¬ 2");
}
}
βμ΄λ¬ν μ μ½ κ·μΉμ΄ μ‘΄μ¬νλ μ΄μ : λ€νμ± λ³΄μ₯
μλ° μ»΄νμΌλ¬κ° μ μμμ μμΈ νμ₯μ λ§λμ§ λ€νμ± νΈμΆ ꡬ쑰 κ΄μ μμ ν΄μ²΄ν΄μΌ ν¨.
public class Main {
public static void main(String[] args) {
// π‘ λ€νμ±: λΆλͺ¨ νμ
리λͺ¨μ»¨(Parent)μΌλ‘ μμ κ°μ²΄(Child)λ₯Ό μ‘°μ’
ν¨
Parent obj = new Child();
try {
obj.process(); // π‘ μ»΄νμΌλ¬λ 리λͺ¨μ»¨ νμ
μΈ 'Parent.process()'μ λͺ
μΈλ§ λ³΄κ³ μ½λλ₯Ό κ²μ¬ν¨
} catch (IOException e) {
// κ°λ°μλ λΆλͺ¨ λͺ
μΈμ μ ν IOExceptionλ§ μ‘λλ‘ λλΉμ±
(catch)μ μΈμλ
System.out.println("λΆλͺ¨κ° μ μΈν μμΈ μμ΅ μλ£");
}
}
}
- λ©μ»€λμ¦ λΉνκΈ°: λ§μ½ μμ ν΄λμ€μΈ Childκ° μ€λ²λΌμ΄λ©μ νλ©΄μ λΆλͺ¨ λͺ°λ SQLExceptionμ΄λΌλ μμ ν μλ‘μ΄ μμΈλ₯Ό λμ§λλ‘ νμ©ν΄ λ²λ Έλ€λ©΄ μ΄λ»κ² λ κΉ?
- μ€μ νλ‘κ·Έλ¨ μ€ν μ obj.process() ꡬλ λμ€ SQLExceptionμ΄ ν°μ Έ νλ¬λμ€κ² λ¨. νμ§λ§ μμ main λ©μλμλ μ€μ§ IOExceptionλ§ μ‘λ λ°©μ΄λ§(catch)λ§ μ³μ Έ μκΈ° λλ¬Έμ, μ΄ μμΈλ₯Ό κ°λ‘μ±μ§ λͺ»νκ³ νλ‘κ·Έλ¨μ΄ κ·Έ μ리μμ κ°μ μ€λ₯ μ’ λ£λλ μΉλͺ μ μΈ κ΅¬λ©μ΄ μκΉ.
- μλ° μ»΄νμΌλ¬λ μ΄λ¬ν λ€νμ± κ΅¬λ μμ λ°νμ λΆκ΄΄λ₯Ό μμ² μ°¨λ¨νκΈ° μν΄, μ€λ²λΌμ΄λ© μ λΆλͺ¨κ° μ μΈν μμΈμ μΈν리λ₯Ό μμμ΄ μ λ λμ΄κ°μ§ λͺ»νλλ‘ κ·μ νλ κ²μ.
β μμΈ κ·μΉμ μ μΌν μμΈ: RuntimeException
- Unchecked Exception(RuntimeException κ³μ΄)μ μ΄ μ€λ²λΌμ΄λ© μ μ½ κ·μΉμμ μμ ν μμ λ‘μ.
- μμ ν΄λμ€μμ μ€λ²λΌμ΄λ©ν λ λΆλͺ¨ λ©μλκ° μ μΈνμ§ μμ NullPointerExceptionμ΄λ ArrayIndexOutOfBoundsException κ°μ μμΈλ μ ν μμ΄ μΌλ§λ μ§ λμ§λλ‘ μΆκ°ν μ μμ.
- μ΄μ : Unchecked μμΈλ μ μ΄μ μ»΄νμΌλ¬κ° try-catch μ μΈμ κ°μ κ°μνμ§ μλ μμμ΄κΈ° λλ¬Έμ κ·μΉ λ§€ν μ체μμ μ μΈνκΈ° λλ¬Έμ.

λ°μ΄ν° μ΄λ ν΅μ¬ λ©μ»€λμ¦μΈ μ μΆλ ₯(I/O - Input/Output)κ³Ό μ€νΈλ¦Ό(Stream) μν€ν μ²λ₯Ό ν©νΈ κΈ°λ°μΌλ‘ ν΄μ²΄νμ¬ μ 리ν¨.
β μ μΆλ ₯(I/O)μ μ μμ κΈ°λ₯
- μ μ: μ»΄ν¨ν° λ΄λΆ νλ‘κ·Έλ¨κ³Ό μΈλΆ μ₯μΉ(νμΌ, ν€λ³΄λ, λͺ¨λν°, λ€νΈμν¬, λ©λͺ¨λ¦¬ λ±) κ°μ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λ μΌλ ¨μ νμλ₯Ό μλ―Έν¨.
- κΈ°λ₯: * Input (μ
λ ₯): μΈλΆ μ₯μΉμ μ‘΄μ¬νλ λ°μ΄ν°λ₯Ό νλ‘κ·Έλ¨ λ©λͺ¨λ¦¬ μμΌλ‘ μ½μ΄ λ€μ΄λ κΈ°λ₯ (Read μ°μ°)
- Output (μΆλ ₯): νλ‘κ·Έλ¨μ΄ λ©λͺ¨λ¦¬μμμ μ°μ°ν λ°μ΄ν° κ²°κ³Όλ¬Όμ μΈλΆ μ₯μΉλ‘ λ΄λ³΄λ΄μ΄ μ μ₯νκ±°λ νμνλ κΈ°λ₯ (Write μ°μ°)
β μ€νΈλ¦Ό(Stream)μ μ μ λ° ν΅μ¬ κ°λ
μλ°μ I/Oλ μ€νΈλ¦Ό(Stream)μ΄λΌλ λͺ¨λΈμ ν΅ν΄ 물리μ μΈ μ₯μΉ μ’ λ₯μ μκ΄μμ΄ λμΌν λ°©μμΌλ‘ λ°μ΄ν°λ₯Ό μ μ΄ν¨.
- μ€νΈλ¦Όμ μ μ: λ°μ΄ν°κ° μ΄λνλ 'λ¨λ°©ν₯ ν΅λ‘' λλ 'νλ₯΄λ λ¬Όμ€κΈ°'λ₯Ό λ»ν¨.
- λ¨λ°©ν₯μ±μ μμΉ: νλμ ν΅λ‘(μ€νΈλ¦Ό)λ‘λ ν κ°μ§ λ°©ν₯μΌλ‘λ§ λ°μ΄ν°κ° νλ₯Ό μ μμ. μ¦, μ λ ₯κ³Ό μΆλ ₯μ λμμ μ²λ¦¬ν μ μμΌλ―λ‘ μ λ ₯μ© ν΅λ‘μ μΆλ ₯μ© ν΅λ‘λ₯Ό κ°κ° λ³λλ‘ κ°μ€ν΄μΌ ν¨.
- FIFO (First-In-First-Out): ν΅λ‘μ λ¨Όμ λ€μ΄κ° λ°μ΄ν°κ° λ°λμͺ½ λμΌλ‘ λ¨Όμ λμ€λ μ μ μ μΆ κ΅¬μ‘°λ₯Ό λ°λ¦.
β μ€νΈλ¦Ό(Stream)μ 3λ λΆλ₯ κΈ°μ€
μλ°λ ν¨μ¨μ μΈ μμ μ μ΄λ₯Ό μν΄ μ€νΈλ¦Όμ μΈ κ°μ§ κΈ°μ€(λ°©ν₯, λ°μ΄ν° νν, κΈ°λ₯)μ λ°λΌ λͺ ννκ² λΆλ₯ν¨.
κΈ°μ€ β : λ°μ΄ν° νλ¦μ λ°©ν₯μ λ°λ₯Έ λΆλ₯ (λ¨λ°©ν₯ μμΉ)
- μ λ ₯ μ€νΈλ¦Ό (Input Stream): λμ λͺ©μ μ§λ‘λΆν° νλ‘κ·Έλ¨μΌλ‘ λ°μ΄ν°λ₯Ό λ°μ΄ λ£μ΄μ£Όλ μ½κΈ° μ μ© ν΅λ‘.
- μΆλ ₯ μ€νΈλ¦Ό (Output Stream): νλ‘κ·Έλ¨ λ΄λΆ λ°μ΄ν°λ₯Ό λμ μ₯μΉλ‘ λ°μ΄λ΄ μ£Όλ μ°κΈ° μ μ© ν΅λ‘.
κΈ°μ€ β‘: λ€λ£¨λ λ°μ΄ν°μ μ΅μ λ¨μ£Ό(νν)μ λ°λ₯Έ λΆλ₯
λ°μ΄ν° μλ§Ήμ΄λ₯Ό μ΄λ€ ν¬κΈ°λ‘ μͺΌκ°μ μ μ‘νλλμ λ°λΌ 물리μ μ²λ¦¬ λ°©μμ΄ μμ ν λλ¨.
- λ°μ΄νΈ μ€νΈλ¦Ό (Byte Stream): * λ°μ΄ν°λ₯Ό 1λ°μ΄νΈ(byte, 8bit) λ¨μλ‘ κ°κ³΅ μμ΄ κ·Έλλ‘ μ£Όκ³ λ°λ κ°μ₯ μμμ μ΄κ³ κ°λ ₯ν ν΅λ‘μ.
- κ·Έλ¦Ό νμΌ(.jpg), μμ (.mp3), λμμ, μ€ν νμΌ(.exe) λ± λͺ¨λ ννμ λ°μ΄λ리 λ°μ΄ν°λ₯Ό κΉ¨μ§ μμ΄ μλ²½νκ² μ μ‘ν μ μμ.
- ν΄λμ€ μ΄λ¦ μ λ―Έμ¬: μ λ ₯μ ~InputStream, μΆλ ₯μ ~OutputStream νμμ μ·¨ν¨. (μ: FileInputStream)
- λ¬Έμ μ€νΈλ¦Ό (Character Stream):
- λ°μ΄ν°λ₯Ό 2λ°μ΄νΈ(2byte, 16bit) λ¨μλ‘ μͺΌκ°μ΄ μ μ‘νλ©°, μ μ‘ κ³Όμ μμ μλ° λ΄μ₯ μΈμ½λ©(UTF-16 λ±) κ·κ²©μ λ§μΆ° λ¬Έμ(Text)λ‘ μλ λ²μν΄ μ£Όλ ν΅λ‘μ.
- μ€μ§ ν μ€νΈ νμΌ(.txt, .csv, μμ€ μ½λ) μ μ©μ΄λ©°, μμ΄ μΈμ μ μΈκ³ λ¬Έμ(νκΈ, νμ λ± 2λ°μ΄νΈ μ΄μ λ¬Έμ)κ° κΉ¨μ§μ§ μλλ‘ λ³΄μ₯ν¨.
- ν΄λμ€ μ΄λ¦ μ λ―Έμ¬: μ λ ₯μ ~Reader, μΆλ ₯μ ~Writer νμμ μ·¨ν¨. (μ: FileReader)
κΈ°μ€ β’: μ€νΈλ¦Όμ μν λ° κ²°ν© μν€ν μ²μ λ°λ₯Έ λΆλ₯
- κΈ°λ° μ€νΈλ¦Ό (1μ°¨ μ€νΈλ¦Ό): νμΌμ΄λ λ©λͺ¨λ¦¬ κ°μ λ°μ΄ν° μμ€μ μ§μ λΉ¨λλ₯Ό κ½μ ν΅λ‘λ₯Ό κ°μ€νλ μ€νΈλ¦Όμ. νΌμμ λ°μ΄ν°λ₯Ό μ§μ νΌ μ¬λ¦΄ μ μμ. (μ: FileInputStream, FileReader)
- 보쑰 μ€νΈλ¦Ό (2μ°¨ μ€νΈλ¦Ό / νν° μ€νΈλ¦Ό): λ°μ΄ν° μμ€μ μ§μ μ°κ²°ν μ μμ. λμ μ΄λ―Έ κ°μ€λ 1μ°¨ κΈ°λ° μ€νΈλ¦Ό μ£Όλ³μ κ°μΈμ λ²νΌ κΈ°λ₯(μλ ν₯μ), λ¬Έμ μΈμ½λ© λ³ν, μ±λ₯ μ κ·Έλ μ΄λ λ± λΆκ° κΈ°λ₯λ§ λ°μ½λ μ΄μ ν΄ μ£Όλ νΉμ μ€νΈλ¦Όμ. (μ: BufferedInputStream, BufferedReader)
β File ν΄λμ€
νλλμ€ν¬ κ°μ 물리μ μ μ₯ μ₯μΉμ μ‘΄μ¬νλ μ€μ νμΌμ΄λ λλ ν°λ¦¬(ν΄λ)λ₯Ό μλ° κ°μ²΄ μν€ν μ²λ‘ μΆμννμ¬ μ μ΄νλ λꡬμ.β File ν΄λμ€μ κ°μ²΄ νμ±(μμ±) λ°©μ λ° λ©μ»€λμ¦
- μ λ κ²½λ‘: λλΌμ΄λΈμ μ΅μμ 루νΈλΆν° νμΌμ΄ μλ μμΉκΉμ§ μ 체 κ²½λ‘λ₯Ό μ λΆ λ€ μ μ΄μ£Όλ λ°©μμ.
- μμ: C:\java_project\test.txt
- μλ κ²½λ‘: νμ¬ νλ‘κ·Έλ¨(νλ‘μ νΈ ν΄λ)μ΄ μ€νλκ³ μλ μμΉλ₯Ό κΈ°μ€μ (./)μΌλ‘ μ‘κ³ νμΌμ μμΉλ₯Ό μ°Ύμκ°λ λ°©μμ. κ²½λ‘ μ μ°μ±μ΄ λμ μ€λ¬΄ μν€ν
μ²μμ ν¨μ¬ μ νΈλ¨.
- μμ: src/data/test.txt
β File κ°μ²΄ νμ± λ° ν΅μ¬ λ©μλ μ μ΄ μμ
import java.io.File;
import java.io.IOException;
public class FileExample {
public static void main(String[] args) {
// π‘ 1. λλ ν°λ¦¬(ν΄λ) μ μ΄μ© File κ°μ²΄ νμ±
File dir = new File("src/myFolder");
// π‘ 2. νμΌ μ μ΄μ© File κ°μ²΄ νμ± (κ²½λ‘μ νμΌλͺ
κ²°ν©)
File file = new File(dir, "sample.txt");
try {
// β 물리μ ν΄λ μμ± λ©μ»€λμ¦
if (!dir.exists()) { // ν΄λΉ κ²½λ‘μ ν΄λκ° μ‘΄μ¬νμ§ μλλ€λ©΄
dir.mkdir(); // νλλμ€ν¬μ μ§μ§ ν΄λλ₯Ό νλ
System.out.println("π ν΄λ μμ± μλ£");
}
// β 물리μ νμΌ μμ± λ©μ»€λμ¦
if (!file.exists()) { // ν΄λΉ νμΌμ΄ μ‘΄μ¬νμ§ μλλ€λ©΄
file.createNewFile(); // π₯ Checked Exception λ°μνλ―λ‘ try-catch νμ ꡬ쑰, μ§μ§ νμΌ μμ±
System.out.println("π νμΌ μμ± μλ£");
}
// β νμ±λ File κ°μ²΄λ₯Ό ν΅ν μν λ°μ΄ν° μ‘°ν κΈ°λ₯
System.out.println("--------------------------------");
System.out.println("νμΌ μ λκ²½λ‘: " + file.getAbsolutePath());
System.out.println("νμΌ ν¬κΈ°(Byte): " + file.length());
System.out.println("μ½κΈ° κ°λ₯ μ¬λΆ: " + file.canRead());
System.out.println("μ°κΈ° κ°λ₯ μ¬λΆ: " + file.canWrite());
System.out.println("μ΄κ²μ νμΌμΈκ°?: " + file.isFile());
System.out.println("μ΄κ²μ ν΄λμΈκ°?: " + file.isDirectory());
System.out.println("--------------------------------");
// β νμΌ μμ λ©μ»€λμ¦ (ν
μ€νΈ νμ μ μ£Όμ ν΄μ )
// if (file.exists()) {
// file.delete(); // 물리 νμΌ μμ
// System.out.println("ποΈ νμΌ μμ μλ£");
// }
} catch (IOException e) {
// printStackTraceλ₯Ό νμ©ν κ²½λ‘ μμΆμ μλ¬ λ‘κ·Έ μΆλ ₯
e.printStackTrace();
}
}
}
β β οΈ μ£Όμ μ¬ν λ° κ΅¬λ ν©νΈ
- κ°μ²΄ μμ± vs 물리 νμΌ μμ± λΆλ¦¬: File file = new File("test.txt"); λ¬Έμ₯μ μ€ννλ€κ³ ν΄μ νλλμ€ν¬μ νμΌμ΄ μ¦μ λ§λ€μ΄μ§λ κ²μ΄ μλ. λ¨μ§ λ©λͺ¨λ¦¬ μ€ν μμμ μ£Όμ μμ(μλ° κ°μ²΄)λ§ νμ§ μνμ.
- μ‘΄μ¬ μ¬λΆ νμΈ νμ: λ°λμ κ°μ²΄ νμ± μ΄ν file.exists() λ©μλλ‘ νμΌμ΄ μ€μ νλλμ€ν¬μ μλμ§ νμΈν λ€, createNewFile()μ΄λ mkdir() λ©μλλ₯Ό λͺ μμ μΌλ‘ κ°λν΄μΌ 물리 곡κ°μ ν λΉλ¨.
- μλ μ½λλ μλ κ²½λ‘ κ΅¬μ‘°λ₯Ό μ¬μ©νμ¬ μ€μ νμΌ μμ€ν μ 물리μ νμΌκ³Ό ν΄λλ₯Ό νμμν€κ³ μμ±μ μ‘°ννλ μ 체 μνμ€μ.
- File κ°μ²΄λ₯Ό μμ±νκΈ° μν΄μλ λμ νμΌμ΄ μμΉν 물리μ κ²½λ‘(Path) λ¬Έμμ΄μ μ§μ ν΄μΌ ν¨. μ΄λ κ²½λ‘λ λ κ°μ§ λ°©μμΌλ‘ λ§€νν μ μμ.
- μ€μ νμΌ λ΄λΆμ λ°μ΄ν° μλ§Ήμ΄λ₯Ό μ½κ³ μ°λ κΈ°λ₯μ μμΌλ©°, νμΌμ κ²½λ‘, μ΄λ¦, ν¬κΈ°, μμ λ μ§ λ±μ μ‘°ννκ±°λ νμΌμ μμ±, μμ , μ΄λ¦ λ³κ²½νλ λ±μ μΈνμ κ΄λ¦¬ κΈ°λ₯λ§ μνν¨.
'κ°λ°μ νΈμμΈ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| [Class-13] μ λ€λ¦ / 컬λ μ (0) | 2026.06.04 |
|---|---|
| [Class-12] κΈ°λ³Έ API (0) | 2026.06.02 |
| [μ£Όκ° KPT] 5μ 26μΌ~29μΌ / λκ°λ¦¬ λΉ‘λΉ‘μΉλ©° (0) | 2026.05.29 |
| [Class-10] λ€νμ± Polymorphism (0) | 2026.05.29 |
| [Class -08] μ κ·Ό μμ€ μ§μμ / κ°μ²΄ λ°°μ΄ (0) | 2026.05.27 |