IT/Java

자바 추상클래스

노마드오브 2018. 7. 21. 00:27

추상클래스로 만드는 경우

  1) 해당 클래스의 객체 생성을 막고자 하는 경우

  2) 추상메소드를 1개 이상 포함할 경우


추상메소드는 하위클래스에서 모두 구현해야함.

일련의 하위클래스들을 위한 규약의 일부를 정의하기 위한 것 -> 다형성!


추상클래스로는 객체생성 할 수 없음

추상클래스 : 클래스임. 참조변수로는 사용가능.

          모든멤버변수, 일반메소드+추상메소드

          미완성 설계도. 단일상속



package test;



abstract class Animal /* extends Object */ {  // 추상클래스

int age;

void eat () {

System.out.println("먹는다");

}

abstract void speak() ;  // 추상메소드

}


class Puppy extends Animal{ // 추상 클래스를 상속 받았으로 추상메소드를 오버라이딩 해야한다

@Override

void speak() {

System.out.println("멍멍~");

}

}


class Cat extends Animal{ // 추상 클래스를 상속 받았으로 추상메소드를 오버라이딩 해야한다

@Override

void speak() {

System.out.println("야옹~");

}

}


public class Test4 {


public static void main(String[] args) {


// new Animal(); // 추상클래스로부터는 객체생성 안됨

Animal ani = new Puppy(); // 추상클래스로 객체생성은 안되지만, 참조변수로는 사용가능

ani.speak();

ani = new Cat();

ani.speak();

}


}




예제소스


package test;



// 추상클래스 Shape

abstract class Shape {

// 추상클래스 void draw()

abstract void draw();

}


// 클래스 Circle 상속 Shape  메소드 오버라이딩 출력 "원을 그린다"

class Circle extends Shape {

@Override

void draw() {

// super.draw(); // 에러. 추상메소드는 호출안됨.

System.out.println("원을 그린다");

}

}


//클래스 Rectangle 상속 Shape  메소드 오버라이딩 출력 "사각형을 그린다"

class Rectangle extends Shape {

@Override

void draw() {

System.out.println("사각형을 그린다");

}

}


//클래스 Triangle 상속 Shape  메소드 오버라이딩 출력 "삼각형을 그린다"

class Triangle extends Shape {

@Override

void draw() {

System.out.println("삼각형을 그린다");

}

}



public class Test5 {

public static void main(String[] args) {

// 추상클래스 타입으로 업캐스팅 -> 다형성

Shape shape = new Circle();

shape.draw();

shape = new Rectangle();

shape.draw();

shape = new Triangle();

shape.draw();

}

}