* Polymorphism(다형성)
- 객체다형성 : is a 관계
- method 다형성 : 같은 이름의 method를 작성
1) Overload(Overloading) : 클래스 하나에서 같은 이름의 method를 여러 개 작성.
2) Override(Overriding) : 상속관계의 클래스에서 같은 이름의 method를 작성.
* Override(Overriding)
- 상속관계에서 같은 이름의 method를 자식클래스에서 재정의 하는 것.
- 부모가 제공하는 기능이 자식에게 맞지 않을 때, 자식이 자신의 상황에 맞게 바꿔 사용하는 것.
- final이 있는 method는 Override가 되지 않는다. (부모의 기능을 변경하지말고 사용할 때)
- Overriding된 method는 자식 클래스의 method가 최우선적으로 호출된다.
- 규칙)
접근지정자 달라도 된다.(광의의 접근 지정자로만 변경 가능. default -> protected -> public)
반환형, method명, 매개변수 같아야 한다.
// Object -> 모든 클래스의 부모 클래스
public class Test{
public void method(){
A에 대한 일
}
}
public class TestSub extends Test{
@Override
public void method(){
B에 대한 일
}
}
// 자식클래스로 객체화
TestSub ts = new TestSub();
ts.method(); // B에 대한 일 수행
// is a 관계의 객체화 -> 부모클래스명 객체명 = new 자식클래스의 생성자();
Test t = new TestSub();
t.method(); // 부모의 method를 호출하지 않고 자식의 method를 최우선으로 호출한다.
* is a 관계의 객체화
- 객체 다형성
- is a 관계로 객체화를 하면 자식 클래스를 사용하여 생성하고, 부모 클래스를 사용한 객체에 할당하는 것.
- 객체명으로는 부모 클래스의 자원(변수, method)을 사용할 수 있고, 자식 클래스가 Override한 method는 사용 가능하다.
public class Test{
int i;
public void printI(){
i를 출력하는 일
}
}
public class TestSub extends Test{
int j;
public void test(){
B에 대한 일
}
@Override
public void printI(){
j를 출력하는 일
}
}
// 자식클래스로 객체화 : 나와 나의 부모 객체에서 제공하는 모든 것 사용 가능
TestSub ts = new TestSub();
ts.i = 10; // 부모의 변수 사용 가능
ts.j = 20; // 자식의 변수 사용 가능
ts.test(); // 자식의 method 호출 가능
ts.printI(); // 자식의 printI 호출 가능
// is a 관계의 객체화 : 부모의 제공 기능, 자식이 Override한 method
Test t = new TestSub();
t.i = 100; // 변수 사용 가능
t.j = 200; // 자식이 가진 변수 사용 불가(Test 클래스에는 j가 없다.)
t.test(); // 자식이 가진 method 사용 불가(Test 클래스에는 test method가 없다.)
t.printI(); // 호출 가능. 단, Overriding한 method가 존재하면 부모 것이 아닌 자식의 method 호출
* System.out.println()에 객체를 넣어주면 그 안에서 입력된 객체의 toString()을 호출해 준다.
=> 주소가 아닌 메시지 출력이 가능.
=> 이 또한 toString() method를 Override 한 것 !
* annotation (주석 달기)
- JDK1.5에서부터 지원되는 기능.
- compiler에게 컴파일 시에 명령을 전달하는 기능을 하는 주석.
- 작성 위치는 class 위, method 위, 지역변수 위.
- 사용법)
// @annotation명
@Deprecated // method 위 설정, 비추천 method로 표현
@Override // method 위 설정, Override의 작성
@SuppressWarnings // 지역 변수 위, method 위 설정, 경고를 무시
@SafeVargs // V.A의 데이터형을 제한
@FuncationalInterface // abstract method가 하나인 인터페이스를 만들 때(Lamda식을 사용할 목적으로 인터페이스를 만들 때)
* 특정 클래스만 상속을 받아야 할 때.
- JDK1.5에서부터 제공되는 기능.
- 자식 클래스가 존재하지 않으면 error 발생.
- 사용법)
// 부모클래스
public sealed class 클래스명 permit 자식클래스,,,, { // 자식클래스가 존재하지 않으면 error
}
// 자식클래스
public non-sealed class 클래스명 extends 부모클래스명{
}
* class의 다양한 형태

* abstract class (추상클래스)
- 상속을 위해서 만드는 부모 클래스.
- abstract method를 가진다.
- 직접 객체화가 되지 않는다. 자식 클래스가 객체화되면 그 때에는 객체화 가능.
- 작성법)
접근지정자 abstract class 클래스명 extends 부모클래스명 implements 구현인터페이스,,,,{}
* abstract method
- method body를 가지지 않는 method.
- method의 정보만 가지고 있는 method로 일을 할 수 없다.
- 자식 클래스가 반드시 구현해야 할(Override) 일의 목록을 정의할 때 사용. => 구현의 강제성
- Overload가 된다. (같은 이름의 추상 method를 여러 개 만들 수 있다.)
- 추상 method는 직접 호출할 수 없다. (body가 없음)
- 작성법)
접근지정자 abstract 반환형 method명(매개변수,,,,);
- 모든 자식 클래스가 method를 반드시 가져야 하지만, 부모가 제공하는 기능을 사용하지 않고 Override해서 사용해야 하는 경우.
public abstract class Test{
public Test(){
}
public abstract String msg(); // 구현의 강제성
}
public class TestSub extends Test{
public TestSub(){
super();
}
@Override
public String msg(){
return "비와 같은 눈";
}
}
// * 객체화 - 추상클래스는 직접 객체화 불가능
Test t = new Test(); // 불가능
// * 자식클래스로 객체화
TestSub ts = new TestSub();
String str = ts.msg();
// * is a 관계의 객체화
Test t = new TestSub();
String str = t.msg();

* final
- 변수, method, class에 사용할 수 있다.
* 변수 final - 선언 시에만 값 할당 가능.
public final int i = 30;
i = 200; // error
* method final - override 막을 때 사용.
public class Test{
public final void test(){
}
}
// Override 불가
public class TestSub extends Test{
public void test(){
}
}
* class final
- 상속을 막을 때 사용.
- 클래스가 제공하는 기능을 변경 없이 사용해야 할 때.
- abstract과 함께 사용할 수 없다.
public final class Test{
}
// 상속 불가
public class Sub extends Test{
}