ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 추상클래스(Abstract class)
    Study/Java 2021. 4. 25. 16:09

    추상클래스란?

    자바에서는 하나 이상의 추상 메소드를 포함하는 클래스

    클래스의 공통적인 변수, 메소드를 뽑아 선언한 클래스

    객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합

    => 반드시 사용해야 하는 메소드를 추상클래스에 선언해두면, 이 추상 클래스를 상속받는 모든 클래스에서는 이 추상 메소드를 반드시 재정의 해야함

    하나의 부모클래스만 상속 받을 수 있음

     


    추상클래스를 사용하는 이유

    1. 상속을 강제하기 위함

    부모클래스에서는 메소드의 시그니처만 정의해놓구 실제 동작방법은 자식 클래스가 한다.

     

    2. 공통된 필드와 메소드 통일

    여러 클래스에서 동시에 사용하는 변수와 메소드를 뽑아 부모클래스에 정의해둔다. 

    중복코드를 줄이고 필드와 메소드 이름이 통일되므로 유지보수성을 높일 수 있음

     

    3. 구현 시 시간절약

    강제로 주어지는 필드와 메소드를 가지고 클래스를 생성하면 되므로 설계시간 절약

     

    4. 규격에 맞는 클래스 구현 가능

    추상클래스에서 만든 규격에 맞게 클래스를 구현되고, 수정시에도 쉽게 수정이 가능


    추상클래스 사용방법(문법)

    클래스명 앞에 abstract 키워드를 붙이면 된다.

    public abstract class 클래스명 {
    	// 필드
    	public 타입 변수명;
    	// 생성자
    	public 클래스명() { ... }
    	// 메소드
     	public void 메소드이름() { ... }
    	// 추상메소드
    	public abstract void 메소드이름();
    }

    필드, 생성자, 메소드: 부모의 것을 사용해도 되고, 오버라이드 하여 변경하여 사용해도 된다.

    추상메소드: 추상메소드는 부모 클래스에서 선언만 가능. 본문을 작성할 수 없고, 오버라이드하여 작성해야한다.


    예시

    객체화

    public abstract class Animal {}
    public class Dog extends Animal {}
    public class AbstractClassMain {
    	public static void main(String[] args) {
    		// 추상클래스는 객체화 할 수 없음
    //		Animal animal = new Animal(); // 오류 메세지: Cannot instantiate the type Animal
    
    		Animal dog = new Dog();
    	}
    }

    필드 및 생성자 예시

    public abstract class Animal {
    	public String kind = "Animal";
    	
    	public Animal() {
    		System.out.println(kind);
    	}
    }
    public class Dog extends Animal {
    	public String kind = "개";
    
    	public Dog() {
    		System.out.println(kind);
    	}
    }
    public class Cat extends Animal {
    	public int age;
    
    	public Cat(int age) {
    		super();
    		this.age = age;
    		System.out.println(this.age + "살");
    	}
    }
    public class AbstractClassMain {
    	public static void main(String[] args) {
    		Animal dog = new Dog();
    		Animal cat = new Cat(3);
    	}
    }
    
    Animal

    Animal
    3살

    Animal dog = new Dog(); 객체화를 할 경우 Animal의 생성자를 실행한 뒤 Dog의 생성자를 실행한다.

     

    메소드 예시

    public abstract class Animal {
    	// 추상메소드
    	// abstract 반환타입 메소드이름();
    	public abstract void cry();
    
    	public void eat() {
    		System.out.println("물을 먹음");
    	}
    }
    public class Dog extends Animal {
    	// 에러메세지: The type Dog must implement the inherited abstract method Animal.cry()
    	// 추상메소드는 무조건 상속 받아야 함
    	@Override
    	public void cry() {
    		// TODO Auto-generated method stub
    		System.out.println("멍멍");
    	}
    }
    public class Cat extends Animal {
    	@Override
    	public void cry() {
    		System.out.println("야옹");
    	}
    	
    	@Override
    	public void eat() {
    		System.out.println("생선을 먹음");
    	}
    }
    
    public class AbstractClassMain {
    	public static void main(String[] args) {
    		Animal dog = new Dog();
    		dog.eat();
    		
    		Animal cat = new Cat();
    		cat.eat(); // Override
    		
    		 
    		
    	}
    }

     

    클래스 형변환

    자동 형변환을 이용하여 공통 함수를 생성할 수 있다 (다형성)

    public abstract class Animal {
    	public abstract void cry();
    }
    public class Dog extends Animal {
    	@Override
    	public void cry() {
    		System.out.println("멍멍");
    	}
    }
    public class Cat extends Animal {
    	@Override
    	public void cry() {
    		System.out.println("야옹");
    	}
    }
    public class AbstractClassMain {
    	public static void main(String[] args) {
    		Animal dog = new Dog();
    		animalSound(dog); //자동 타입변환
    		
    		Animal cat = new Cat();
    		animalSound(cat); //자동 타입변환
    	}
    	
    	private static void animalSound(Animal animal) {
            animal.cry();
        }
    }

     

     

    참고

Designed by Tistory.