<부모 클래스>
// 부모 클래스 public class Animal { private String name; private String kinds; // 생성자 선언 ... public String bark() { return "짖는다."; } }<자식 클래스>
// 자식 클래스 public class Dog extends Animal { private int weight; // 생성자 선언 ... @Override public String bark() { return "멍멍~ " + super.bark(); } }ex)
// Dog 클래스 타입의 객체를 Animal 클래스 타입의 참조 변수에 대입 Animal animal = new Dog(); // 자식 클래스에서 오버라이딩 된 코드가 실행된다. System.out.println(animal.bark()); // "멍멍~ 짖는다." 출력 ```java // Cat 클래스 타입의 객체를 Animal 클래스 타입의 참조 변수에 대입 Animal animal = new Cat(); // 자식 클래스에서 오버라이딩 된 코드가 실행된다. System.out.println(animal.bark()); // "야옹~ 운다." 출력똑같은 실행 코드로 다양한 실행 결과를 이용할 수 있는 것을 ex)를 통해 알 수 있고 이를 다형성이라 한다
Animal animal = new Dog(); // 클래스 간의 형 변환은 반드시 상속 관계에 있는 클래스들끼리만 가능하다. Dog dog = (Dog) animal; // 상속 관계가 아니기 때문에 오류 // Cat cat = (DOg) animal;
// animal이 참조하는 객체가 Dog 클래스로 생성된 객체이면 true // animal이 참조하는 객체가 Dog 클래스로 생성된 객체가 아니면 false if(animal instanceof Dog) { ... // animal이 참조하는 객체가 Cat 클래스로 생성된 객체이면 true // animal이 참조하는 객체가 Cat 클래스로 생성된 객체가 아니면 false } else if (animal instanceof Cat){ ... }
public interface Runable { void run(); // public abstract 생략 가능 }
// 인터페이스 구현 방법 public class Cat implements Runable { ... @Override public void run() { ... } }
// 인터페이스의 다중 구현 시 콤마(,)로 구분한다. public class Cat implements Runable, Swimable { ... @Override public void run() { ... } @Override public void swim() { ... } }
Cat cat = new Cat(); cat.run(); cat.swim();
- 컴파일 에러 : 소스코드 상의 문법 에러로 소스코드를 수정하여 해결
- 런타일 에러 : 프로그램 실행 중에 발생하는 에러로 사용자로부터 잘못된 값을 입력받거나 계산식의 오류 등으로 발생
- 시스템 에러 : 컴퓨터 하드웨어 오작동 또는 고장으로 발생하는 에러로 소스코드를 수정하여 해결이 불가능
Checked Exception
- 반드시 예외 처리해야 하며 되어있지 않으면 컴파일 에러 발생조건
- 소스코드 수정으로는 해결이 되지 않는다. 주로 외부에 매개체와 입출력이 일어날 때 발생한다.
Unchecked Exception
- 컴파일 시 예외 처리 코드가 있는지 검사하지 않는 예외를 말한다
try-catch-finally 문
- try 블록에는 예외가 발생할 가능이 있는 코드가 위치
- try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행
- finally 블록은 생략 가능, 예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우에 finally 블록 작성
try { ... } catch (Exception e) { ... } finally { // 예외 발생 여부와 상관없이 실행해야 하는 코드 }
throws