본 포스팅은 기본 문법 정리를 포함하지 않습니다.
하나의 메소드가 다양한 방법으로 동작하는 것을 의미합니다.
키보드를 누를때 '버튼을 누른다'라는 동일한 행동을 하지만
누른 키가 어떤 키이느냐에 따라 다르게 동작하는 것으로 이해하시면 됩니다.
class A{
public String x(){return "A.x";}
}
class B extends A{
public String x(){return "B.x";}
public String y(){return "y";}
}
class B2 extends A{
public String x(){return "B2.x";}
}
public class AbstractDemo {
public static void main(String[] args) {
A obj = new B();
A obj2 = new B2();
System.out.println(obj.x()); //b.x
System.out.println(obj2.x()); //b2.x
//System.out.println(obj.y());
//얘는 안된다 -> 왜? A에 y메소드가 없기때문에
}
}
위의 코드를 보시면 동일한 데이터타입 A(같은 동작)을 가지고 있는 객체
B,B2의 x를 호출했을때 서로 다르게 동작하는 것을 확인하실 수 있습니다.
간단히 정리하자면 A에 있는 메소드만 사용할 수 있되
B,B2에 있는 메소드랑 이름이 겹치면 오버라이딩됩니다.
abstract class A_class{
public abstract int A_method();
}
추상 메소드는 시그니처만이 정의되어있는 메소드를 의미합니다.
추상 메소드는 내용이 없기 때문에 인스턴스로 호출하여
사용할 수 없다는 특징을 가집니다.
추상메소드를 사용하기 위해서는 추상메소드를 상속하여
하단의 코드에서 구체적인 정의(오버라이딩)를 해주어야 합니다.
abstract class A{
public abstract int b();
public abstract int c();
public int d(){return 3;} //추상클래스 내부 추상메소드+일반메소드 가능
}
class B extends A{
//상속 후 오버라이딩
public int b(){return 1;}
public int c(){return 2;}
}
public class AbstractDemo {
public static void main(String[] args) {
B obj = new B();
//인스턴스화 호출 가능
System.out.println(obj.b());
System.out.println(obj.c());
System.out.println(obj.d());
}
}
추상의 개념을 활용하여 부모 클래스에 들어있는 공통된 메소드는 상위에 두고
상황에 따라 함께 쓰기도, 따로 쓰기도 해야하는 메소드들을
하위 클래스에 구현하도록 하면 코드의 중복을 줄이고 직관성을 높여 유지보수에 좋습니다.
final 은 한번 정해진 값, 메소드, 클래스를 바꾸지 못하게 하는 필드입니다.
메소드와 클래스 앞에 final 을 붙이면 상속이 제한됩니다.
interface I{
public void z();
}
class A implements I { //A는 I의 구현부 == I에 있는 메소드 무조건 포함
public void z(){
System.out.println("Happy?");
}
}
public class AbstractDemo {
public static void main(String[] args) {
A obj = new A();
obj.z();
}
}
인터페이스는 기능의 기본 골격이라고 생각하시면 편합니다.
메소드의 스펙을 제시하여 같은 기능이지만
클래스마다 다른 방법으로 동작하게끔 만드는 것입니다.
이는 다시말해 클래스의 다형성
을 실현하게 해준다고 할 수 있습니다.
또한 이 메소드의 구현을 강제하기 때문에 객체의 동작을 보장할 수 있습니다.
인터페이스에는 다음과 같은 규칙이 있습니다.
1. 하나의 클래스는 하나이상의 인터페이스를 구현할 수 있습니다(다중인터페이스 구현)
각 인터페이스 내의 모든 메소드를 구현해야 합니다.
2. 인터페이스의 맴버는 public이어야 합니다
추상클래스는 기능을 상속받아 그를 확장시키는 것이 목적입니다.
추상클래스 내에서는 구체적인 로직과 상태를 가질 수 있습니다.
그와달리 인터페이스는 구체적인 로직과 상태를 가질 수 없는 껍데기입니다.
메소드의 구현을 강제하는것에 목적이 있으며
이를 통해 메소드를 포함한 객체의 같은 동작을 보장합니다.