ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 추상클래스
    언어/Java 2021. 1. 9. 20:28

    객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면 이 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상 클래스라고 합니다. 추상 클래스와 실체 클래스는 상속의 관계를 가지고 있습니다. 추상 클래스가 부모, 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 ㅁ든 특성을 물려받고 추가적인 특성을 갖습니다.

    용도

    필드와 메소드의 이름 통일

    실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있습니다. 

    예를 들어 소유자의 이름을 저장하는 필드를 Telephone 클래스에서는 owner라 하고 Smartphone 클래스에서는 user라 할 수 있습니다. 또한 전원을 켜는 메소드를 turnOn()이나 powerOn()으로 지을 수도 있습니다.

    이처럼 데이터나 기능이 동일하지만 다른 이름으로 지을 수 있기 때문에 Phone 이라는 추상 클래스에 소유자인 owner 필드와 turnOn() 메소드를 선언하고 Telephone과 Smartphone 클래스에서 Phone 추상 클래스를 상속해서 통일하는 것이 좋습니다.

    실체 클래스를 작성할 때 시간 절약

    공통적인 필드와 메소드는 추상 클래스인 Phone에 모두 선언해두고 다른 점만 실체 클래스에 선언하면 실체 클래스를 작성하는 데 시간을 절약할 수 있습니다.


    추상 클래스에 공통적으로 사용되는 필드나 메소드를 정의할 수 있고 공통적인 규격을 정의해 실제 클래스를 개발하는데 중구난방 식의 개발을 방지할 수 있고 시간 절약이 가능합니다.

    선언

    추상 클래스는 abstract 키워드를 붙입니다. 해당 키워드를 붙이면 new 연산자를 사용해 객체화를 못하고 상속을 통해 자식 클래스에서만 사용할 수 있습니다. 추상클래스도 일반 클래스와 마찬ㄴ가지로 필드, 생성자, 메소드를 선언할 수 있습니다. new 연산자로 직접 생산자를 호출할 수는 없지만 자식 객체가 생성될 때, super(...)로 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 합니다.

    public abstract class Phone {
        public String owner;
    
        public Phone(String owner) {
            this.owner = owner;
        }
    
        public void turnOn() {
            System.out.println("turn on");
        }
    
        public void turnOff() {
            System.out.println("turn off");
        }
    }
    
    
    public class Smartphone extends Phone{
        public Smartphone(String owner) {
            super(owner);
        }
    
        public void search() {
            System.out.println("search");
        }
    }
    
    
    Phone phone = new Phone(); // 에러
    
    Smartphone smartphone = new Smartphone("David");
    smartphone.turnOn();
    smartphone.search();
    smartphone.turnOff();

    재정의

    모든 실체 클래스가 가지고 있는 메소드의 실행 내용이 동일하다면 추상 클래스에 메소드를 작성하는 것이 좋습니다. 하지만 특정 메소드는 모든 실체 클래스에 존재해야 하지만 세부 내용이 다르게 동작해야 한다면 추상 메소드를 사용해서 표현할 수 있습니다.

    추상 메소드는 abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호 {} 가 없는 메소드를 말합니다.


    한마디로 상속을 받은 실체 클래스에 해당 메소드의 세부 구현을 필수로 하도록 강제하는 기능입니다.

    [접근제어자] abstract [리턴타입] [메소드이름] ([매개변수...]);


    public abstract class Phone {
        public abstract void manufacturer();
    }
    
    
    
    public class Smartphone extends Phone{
        @Override
        public void manufacturer() {
            System.out.println("Apple");
        }
    }
    
    
    public class Telephone extends Phone{
        @Override
        public void manufacturer() {
            System.out.println("Samsung");
        }
    }
    
    
    Smartphone smartphone = new Smartphone();
    Telephone telephone = new Telephone();
    
    smartphone.manufacturer();
    telephone.manufacturer();
    
    
    
    
    // Apple
    // Samsung


    댓글