ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 추상 클래스 & 인터페이스
    Language/Java 2022. 9. 21. 14:04

    추상 클래스

    추상 클래스란?

    추상 클래스는 클래스 구현부 내부에 추상 메서드가 하나 이상 포함되거나 abstract 키워드로 정의된 클래스를 의미한다. 이러한 추상 클래스를 상속받은 클래스(하위 클래스)는 자기의 성질에 맞게 추상 메서드를 오버라이딩하여 사용한다.

     

    추상 클래스의 특징

    ㆍ 추상 클래스는 new 연산자를 사용하여 객체를 생성할 수 없다.

    ㆍ 추상 클래스(부모)와 일반 클래스(자식)는 상속의 관계에 놓여있다.

    ㆍ 추상 클래스는 새로운 일반 클래스를 위한 부모 클래스의 용도로만 사용된다.

    ㆍ 공통된 필드와 메서드를 통일하여 일반 클래스 작성 시 시간을 절약할 수 있다.

    추상 클래스는 단일 상속만 가능하며 일반 변수를 가질 수 있다.

    추상 클래스는 동일한 부모를 가지는 클래스를 묶는 개념으로 상속을 받아서 기능을 확장시키는 것이 목적이다.

     

    추상 클래스의 사용
    public abstract class Animal {
        public abstract void sound();
    }

    위 코드는 Animal이라는 이름으로 추상 클래스를 선언한 것이다.

     

    public class Dog extends Animal {
    
        @Override
        public void sound() {
            System.out.println("멍멍");
        }
    }
    pulic class Cat extends Animal {
    
        @Override
        public void sound() {
            System.out.println("야옹");
        }
    }

    위 코드는 Dog, Cat이라는 클래스가 추상 클래스 Animal을 상속받은 것이다.

    특정 클래스가 추상 클래스를 상속받는다면 해당 클래스는 반드시 추상 클래스 내에 선언되어 있는 추상 메서드를 재정의해야 한다.

     

    public class Main {
        public static void main(String[] args) {
        
            Dog dog = new Dog();
            Cat cat = new Cat();
            
            dog.sound();
            cat.sount();
        }
    }
    멍멍
    야옹

     

    new 키워드를 사용해서 Dog, Cat 클래스를 객체화한 후 sound( ) 메서드를 호출한 결과는 위와 같다.

     

    public abstract class Animal {
        public abstract void sound();
        
        public void eat() {
            System.out.println("냠냠");
        }
    }

    추상 클래스에서는 일반 메서드 또한 구현이 가능하다. 

    Dog와 Cat의 sound는 각각 다르지만 밥을 먹는 행위는 공통적이기 때문에, Animal 추상 클래스 내에 eat( ) 메서드를 정의하였다.

     

    public class Main {
        public static void main(String[] args) {
        
            Dog dog = new Dog();
            Cat cat = new Cat();
            
            dog.sound();
            cat.sount();
            
            dog.eat();
            cat.eat();
        }
    }
    멍멍
    야옹
    냠냠
    냠냠

    new 키워드를 사용해서 Dog, Cat 클래스를 객체화한 후 sound( ), eat( ) 메서드를 호출한 결과는 위와 같다.


    인터페이스

    인터페이스란?

    인터페이스는 모든 메서드가 추상 메서드인 경우를 말한다. 이러한 인터페이스는 추상 클래스보다 한 단계 더 추상화된 클래스라고 볼 수 있다. 즉, 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 역할을 하는 추상 자료형이다. 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 인터페이스를 사용한다.

     

    인터페이스의 특징

    ㆍ 인터페이스 내에 있는 모든 메서드들은 추상 메서드로 간주되기 때문에 abstract 키워드를 적지 않는다.

    ㆍ 기존에는 인터페이스에 일반 메서드를 구현할 수 없었지만, Java 8 버전부터 default 키워드를 통해 일반 메서드 구현이 가능하다.

    ㆍ 인터페이스는 구현 객체의 동일한 동작을 보장하기 위한 목적으로 static final 필드만 가질 수 있다.

    ㆍ 인터페이스는 추상 클래스와 마찬가지로 new 키워드를 통해 객체를 생성할 수 없다.

    인터페이스는 구현 객체가 같은 동작을 하도록 보장하는 것이 목적이다.

    인터페이스는 추상 클래스와는 반대로 다중 상속이 가능하다.

     

    인터페이스의 사용
    public interface Animal {
        
        String eat = "냠냠";
        
        void sound();
    }

    Animal이라는 이름으로 인터페이스를 생성한다.

     

    public class Lion implements Animal {
        
        @Override
        public void sound() {
            System.out.println("어흥");
            System.out.println("밥을 " + eat + "먹는다.");
        }
    }

    Lion이라는 이름의 클래스를 만들고 Animal 인터페이스를 구현한다.

     

    public class Main {
        public static void main(String[] args) {
            Lion lion = new Lion();
            
            lion.sound();
        }
    }
    어흥
    밥을 냠냠 먹는다.

    new 키워드를 사용해서 Lion 클래스를 객체화한 후 sound( ) 메서드를 호출한 결과는 위와 같다.

     

    위 예제는 단순히 인터페이스의 사용법의 이해를 돕기 위한 코드로, 인터페이스를 정의하는 목적이 아니다. 인터페이스에서 위와 같이 상수를 사용하는 것을 안티 패턴이라고 하는데, 실제로 인터페이스를 구현하는 경우 위처럼 사용해서는 안된다. 상수를 사용해야 할 경우 상수만 모아놓은 클래스를 따로 만들어서 사용하는 것이 좋은 방법이다.


    추상 클래스와 인터페이스

    추상 클래스와 인터페이스의 공통점

    ㆍ 추상 클래스와 인터페이스는 선언부만 있고 구현은 없는 클래스이다.

    ㆍ 추상 클래스와 인터페이스는 인스턴스화 할 수 없다.

    ㆍ 추상 클래스를 extends로 상속받은 자식들과 인터페이스를 implements로 구현한 자식들만 객체로 생성이 가능하다.

     

    추상 클래스와 인터페이스의 차이점

    추상 클래스는 단일 상속만 가능하고, 인터페이스는 다중 상속이 가능하다.

    추상 클래스의 목적은 상속을 받아서 기능을 확장시키는 것에 있다.

    인터페이스의 목적은 구현하는 모든 클래스에 대해 특정한 메서드가 반드시 존재하도록 강제하는 역할이다. 즉, 구현 객체가 같은 동작을 하도록 보장하는 역할을 한다.


    출처

    https://dev-coco.tistory.com/12?category=962739 

     

    728x90

    'Language > Java' 카테고리의 다른 글

    Java - 예외 처리  (0) 2022.09.29
    Java - Exception  (0) 2022.09.29
    Java - final  (0) 2022.09.20
    Java - '==' 연산자 와 'equals()'를 이용한 문자열 비교  (0) 2022.09.20
    Java - Wrapper Class  (0) 2022.09.20

    댓글

Designed by Tistory.