[Java] 자바 내용정리4(fin)

🌟Java 언어공부4(fin)

본 포스팅은 기본 문법 정리를 포함하지 않습니다.

🎯Polymorphism

하나의 메소드가 다양한 방법으로 동작하는 것을 의미합니다. 키보드를 누를때 ‘버튼을 누른다’라는 동일한 행동을 하지만 누른 키가 어떤 키이느냐에 따라 다르게 동작하는 것으로 이해하시면 됩니다.

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

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 은 한번 정해진 값, 메소드, 클래스를 바꾸지 못하게 하는 필드입니다. 메소드와 클래스 앞에 final 을 붙이면 상속이 제한됩니다.

🎯interface

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이어야 합니다

🎯abstract vs interface

추상클래스는 기능을 상속받아 그를 확장시키는 것이 목적입니다. 추상클래스 내에서는 구체적인 로직과 상태를 가질 수 있습니다. 그와달리 인터페이스는 구체적인 로직과 상태를 가질 수 없는 껍데기입니다. 메소드의 구현을 강제하는것에 목적이 있으며 이를 통해 메소드를 포함한 객체의 같은 동작을 보장합니다.


Written by@이주형
平常心

GitHubFacebook