ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • final과 추상화, interface
    개인 공부/java 2021. 7. 6. 07:34
    728x90
    반응형

    final 이란

    final은 더 이상 확장이 불가능함을 알리는 예약어이다. 적용할 수 있는 범위는 변수, 메서드, 클래스이다.

    변수에서 final

    변수에 final을 적용시키면 프로그램이 종료되어질 때까지 값을 변경하지 못하는 상수화가 된다. 그리고 static 예약어와 함께 정적화하여 특정 클래스의 객체가 여러개 생성되는 것을 방지하는 것이 보통이다. 또한 상수화가 되므로 변수의 이름은 대문자로 하는것도 관례이다.

    • 하지만 웹에서 개발을 할때 싱글톤으로 개발하기 위해 변수명에 final을 붙여 생성자를 생성하는 경우가 있다. 그때는 static이나 대문자로 표시하지 않고 'private final 변수명'으로 생성하는 경우도 있다.

    메서드 final

    메서드의 final은 더이상 오버라이드를 하지 못하게 하는 기능을 수행한다.

    class final

    class의 final은 더이상 상속받지 못하게 하는 기능을 수행한다.

    추상화

    • 추상화란

      추상화라는 것은 일반적으로 사용할 수 있는 단계가 아닌 미완성적인 개념을 가진다. java에서는 추상화를 method와 class에 적용시킬 수 있는데. method에 적용시키면 추상(abstract) method, class에 적용시키면 추상(abstract) class가 된다. 이때 추상 메서드를 하나라도 가지게 되는 클래스가 바로 추상 클래스이며 추상 메서드를 하나 이상 가지게된 클래스에는 abstract를 항상 명시해야 한다.

        pulbic abstract int getA();

      이렇게 추상 메서드의 경우 {}를 생략하여 미완성된 메서드로 생성한다.

        pulbic abstract class TestClass{}

      추상 클래스의 경우 하나 이상의 추상 메서드를 가진 클래스를 의미한다.

    • 추상 클래스의 상속 관계

      추상 클래스의 상속에 대해서 알아보면 추상 클래스를 일반 클래스에서 상속했을 경우 미완성된 추상 메서드에 대해 오버라이드 해야하는 의무를 가진다. 또한 추상 클래스에서 추상 클래스로 상속이 가능한데. 이때 추상 메서드에 대해서 오버라이드를 하지 않아도 된다.

    • 추상 클래스의 활용

      지금까지 추상화에 대해 학습했는데 도대체 어떻게 써야하며 왜 미완성의 메서드를 만들어내는지 이해할 수 없을 수도 있다. 추상화는 특정 클래스에서 일부 기능은 공통되지만 또 일부의 기능은 클래스 마다 특징적인 변화가 있을 때 상속에 의해 다른 부분만 오버라이딩하여 사용하기 위해서 이다.

      예를 들어 우리가 스타크래프트를 만든다는 가정을 해보자

        abstract class Unit{
            String name;
            int energy;
            public abstract void hasAttack();
        }

      위와 같이 Unit class에서 이름과 에너지 그리고 공격했을때의 메서드를 각각 만들었다. hasAttack의 메서드를 왜 추상 메서드로 만들었냐면 스타크래프트의 각 종족마다 공격했을때 상대방 에너지를 줄이는 양이 다르기 때문이다.

        class Terran extends Unit{
            public Terran(Strng name){
                this.name = name;
                energy = 100;
            }
            public void hasAttack(){
                energy -= 6;
            }
        }
        class Zerg extends Unit{
            public Zerg(Strng name){
                this.name = name;
                energy = 100;
            }
            public void hasAttack(){
                energy -= 10;
            }
        }
        class Protoss extends Unit{
            public Protoss(Strng name){
                this.name = name;
                energy = 100;
            }
            public void hasAttack(){
                energy -= 8;
            }
        }

      다음과 같이 세 종족에 대한 정의를 했는데 공격을 했을때 hasAttack에 대한 메서드를 각각 정의할 수 있었고 추상 클래스를 상속받은 일반 클래스는 추상 메서드에 대해 정의할 의무를 가지기 때문에 내가 아닌 다른 개발자가 종족을 늘리거나 새로 변경하려고 할때 컴파일러에서 오류를 내주므로 알아보기 쉽게 코딩할 수 있다.

      정리해보면 추상 클래스라는 것은 공통된 부분들만 구현하고, 공통으로 정의하지 않는 부분들에 abstract라는 예약어를 사용한 미완성 클래스이다. 클래스의 객체를 자체적으로 생성할 수 없으며 다른 클래스로 상속되어 미완성된 부분들을 반드시 재정의 해줘야한다.

      이런 추상 클래스가 필요한 이유는 여러개의 클래스들이 공통된 점을 그대로 상속받고 각자 정의 해야하는 부분에 대해서는 개별적으로 따로 작성할 수 있도록 하는 것이 효율적이기 때문이다.

    인터페이스

    • 인터페이스란

      인터페이스는 항상 추상화와 상속들과 연관되어 헷갈리는 존재다. 하지만 인터페이스는 인터페이스만의 특징이 존재하는데. 그것은 서비스 요청에 따른 중계자 역할을 한다는 것이다. 개발자들은 이를 음식점의 메뉴판에 많이 비유한다. 음식점에 갔을때 손님은 음식점 자체에서 메뉴를 시키는 것이 아니라 메뉴판을 보고 메뉴를 정해서 시킨다. 또한 음식점은 자신이 메뉴판에 적은 메뉴는 모두 손님에게 제공할 수 있어야한다.

      또한 인터페이스에서의 변수와 메서드 선언은 변수의 경우 자동으로 상수로 static final로 설정되며 메서드의 경우도 자동적으로 추상 메서드로 정의된다.

    • 인터페이스의 상속

      인터페이스는 인터페이스끼리만 상속이 가능하다. 또한 java에서의 상속은 단일 상속만 알고 있는데. 인터페이스의 경우 다중 상속도 제공한다. 하지만 인터페이스는 실제 구현력이 없으므로 상속을 받았다고 해서 인터페이스 자체에서 메서드들을 구현하진 않는다.

      또한 일반 클래스에서 인터페이스를 사용할때 상속(extends)가 아닌 구현력(implements)를 사용하여 인터페이스를 사용할 수 있는데

        public class TestClass implements InterfaceClass{}

      와 같이 사용한다. 이렇게 했을때 인터페이스에 선언되어 있는 모든 추상 메서드들을 구현받은 클래스에서 모두 오버라이딩 해야한다. 그리고 위에서 인터페이스들 끼리의 상속은 가능하다고 말했었는데. 만약 일반 클래스가 상속받은 인터페이스를 구현받았을 경우 일반 클래스가 구현 받은 인터페이스의 부모 클래스에 존재하는 추상 메서드들까지 모두 구현해야한다.

    인터페이스는 다른 여러 객체들의 공통된 점들을 제안하고 이를 공유하여 인터페이스에 정의된 추상 메서들를 각 객체에 맞도록 재정의하여 사용하는 것이다. 그리고 인터페이스간의 상속은 다중 상속이 허용되어 여러개의 인터페이스를 구현하는 클래스에서 다형성을 함께 제공하며 객체 자체가 여러가지 타입을 가질 수 있게 해준다.

    • instance of

      instance of 예약어는 클래스의 형식을 비교하는 연산자이다.

        객체 instance of 클래스명

      과 같이 사용할 수 있는데. 생성된 객체가 오른쪽 클래스로부터 생성되었는지에 대해 true false로 반환해준다.

    728x90
    반응형
Designed by Juno.