: 상속관계에서 같은 이름의 method를 자식클래스에서 재정의.
접근지정자 달라고 된다.
=> (광의의 접근지정자로만 변경가능.)
==> default -> protected -> public
=> (부모보다 더 넓은 범위의 접근지정자로 변경.)
반환형, method명, 매개변수 같아야 함.
부모클래스명 객체명 = new 자식클래스의 생성자();
ex) Test t = new TestSub();
객체 다형성
is 관계로 객체화를 하면 자식클래스를 사용하여 생성하고, 부모클래스를 사용한 객체에 할당하는 것.
객체명으로는 부모클래스의 자원(변수, method) 사용가능.
overrride된 method는 사용가능.
자식클래스로 객체화
TestSub ts = new TestSub();
// 부모의 변수와 자식의 변수 다 사용 가능
// 자식의 method 호출가능
is a 관계의 객체화
Test t = new TestSub();
// Test의 변수 사용가능
// Test에 없고, 자식에만 있는 변수는 사용불가
// 자식에만 있는 method도 사용불가
// overriding한 method가 존재하면 무조건 자식 method호출(자식 최우선)
@annotation명
@Deprecated : method위 설정, 비추천 method로 표현(정상동작하지만, 아닐 때도 있을 때)
@SuppressWarnings : 지역변수위, method위 설정. 경고를 무시
@SafeVargs : V.A의 데이터 형을 제한
@FuncationalInterface : abstract method가 하나인 인터페이스를 만들 때.
(Lamda식을 사용할 목적으로 인터페이스를 만들 때.)
@Override // override 잘 되고 있는지 확인
System.out.println();에 객체를 넣으면, 그 안에서 입력된 객체의 toString()를 호출해준다.
=> 주소가 아닌 메시지 출력이 가능.
: 자식클래스가 존재하지 않으면 error 발생
부모클래스)
public sealed class 클래스명 permit 자식클래스,,,,,{
}
자식클래스)
public non-sealed class 클래스명 extends 부모클래스명{
}
상속을 위해 만드는 부모클래스.
abstract method를 가진다.
직접 객체화가 되지 않는다. 자식클래스가 객체화 되면 그때 객체화가 가능.
접근지정자 abstract class 클래스명 extends 부모클래스명 implments 구현인터페이스,,,{}
method body를 가지지 않는 method
public void method(){ <= method header
일X <= method body 가지지 않음.
}
접근 지정자 abstract 반환형 method명(매개변수,,,,);
ex) public abstract String msg();
모든 자식클래스가 method를 반드시 가져야하지만, 부모가 제공하는 기능을 사용하지 않고, override해서 사용해야하는 경우.
추상 클래스의 자식클래스는 부모클래스의 모든 abstract method를 override해야한다.
abstract method는 자식클래스가 해야할 일의 목록.
변수 final - 선언 시에만 값 할당 가능. 변경안됨.
ex) public final int i = 30;
method final - override 막을 때 사용.
ex)
public class Test{
public final void test(){
}
}
public class TestSub extends Test{
public void test(){
^^ 오버라이딩 불가 < 부모가 주는대로 써야 함.
}
}
class final - 상속을 막을 때
- 클래스가 제공하는 기능을 변경없이 사용해야 할 때
- abstract과 함께 사용불가.(abstract은 무조건 상속해야하니까.)
public final class Test(){
}
public class Sub extends Test(){ <== 상속불가. 부모클래스 있는 그대로 사용.
}