추상 클래스

추상 클래스

  • 객체를 직접 생성할 수 있는 클레스들의 공통적인 특성을 추철해서 선언한 클래스
  • 추상클래스가 부모, 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고 추가적인 특성(필드, 메소드)을 가질 수 있음

 

추상 클래스의 용도

  • 공통된 필드와 메소드의 이름을 통일할 목적
  • 실체 클래스를 작성할 때 시간 절약
  • 작성해야할 클래스가 다수이고 이 클래스들이 동일한 필드와 메소드를 가져야 할 경우, 설계자는 공통된 부분을 춯상 클래스로 설계하는 것이 좋음
  • 추상 클래스를 상속해서 구체적인 클래스를 만듦

 

추상 클래스 선언

public abstract class 클래스 {
	//필드
    //생성자
    //메소드
}
  • abstract를 붙이면 new 연산자를 이용해서 객체 못만들고 상속을 통해 자식 클래스만 만들 수 있음
  • new 연산자로 직접 호출할 수는 없지만 자식 객체가 생성될 때 super(...)를 호출해서 추상 클래스 객체를 생성
  • 추상 클래스도 생성자가 반드시 있어야 함

 

public abstract class Phone {
	//필드
    public String owner;
    
    //생성자
    public Phone(String owner) v{
    	this.owner =owner;
    }
    
    //메소드
    public void turnOn() {
      System.out.println("폰 전원을 켭니다.");
    }
    public void turnOff() {
      System.out.println("폰 전원을 끕니다.");
    } 
  }

 

  • 부모 클래스의 super(owner) 코드로 생성자를 호출함

 

public abstract class SmartPhone extends Phone {
    
    //생성자
    public SmartPhone(String owner) v{
    	super(owner);
    }
    
    //메소드
    public void internetSearch() {
      System.out.println("인터넷 검색을 합니다.");
    }
    
    } 
  }

 

추상 메소드와 재정의

  • 추상클레스는 실체 클래스의 멤버(필드, 메소드)를 통일하는 게 목적
  • 모든 실체들이 가지고 있는 메소드의 실행 내용일 동일하면 추상 클래스에 메소드를 작성
  • 메소드 선언만 통일하고 실행 내용은 실체 클래스마다 달라야 하는 경우 -> 추상 클래스는 추상 메소드 선언 가능

 

[public | protected] abstract 리턴타입 메소드이름(매개변수, ...);
  • 추상 클래스 설계 시 하위 클래스가 실행 내용을 반드시 채우도록 강제하고 싶은 메소드가 있을 경우 추상 메소드 선언
  • 자식 클래스는 반드시 추상 메소드를 재정의해서 실행 내용 작성해야함 -> 아니면 컴파일 에러 발생

 

확인문제

  • 추상 클래스는 직접 new 연산자로 객체를 생성할 수 없다 (o)
  • 추상 클래스는 부모 클래스로만 사용 (o)
  • 추상 클래스는 실체 클래스들의 공통된 특성(필드, 메소드)로 구성된 클래스이다. (o)
  • 추상 클래스에는 최소한 하나의 추상 메소드가 있어야 한다 (x)
  • 추상 메소드는 선언부만 있고 실행 블록을 가지지 않는다 (o)
  • 추상 메소드는 자식 클래스에서 재정의 해서 실행 내용을 결정해야 한다 (o)
  • 추상 메소드를 재정의 하지 않으면 자식 클래스도 추상 클래스가 되어야 한다 (o)
  • 추상 메소드가 있더라도 해당 클래스가 꼭 추상 클래스가 될 필요는 없다 (x)

+ Recent posts