본문 바로가기
Java

abstract 클라스, 추상클라스 vs 인터페이스

by Ms.Pudding 2022. 1. 8.

 

magicZoo 프로젝트를 abstract클래스로 완성하였다.

차근차근 살펴보자 !

 

 

1.abstract클라스는 프로토타입(메소드 바디 X)으로 적는 것도 가능하며, 메소드 바디 작성으로 미리 동작을 구현하는 것 가능하다. 

 

abstract class Animal{
	String name;
//오버라이드하지 않는 이상 bark()를 가지고 있는 모든 클라스는 woo가 작동된다.
public void bark(){
	System.out.println("woo")
}
//바디가 없기 때문에 하위클라스에서 새로 정의해준다. 
public abstract void move();

}

여기서 한가지 인터페이스와 다른 점을 발견할 수 있는데, 인터페이스의 경우 프로토타입으로만 정의가 가능하였다.

즉 , 인터페이스에서의 메소드 구현은 클라스를 상속받을 때 구현되며 abstract클라스의 경우 디폴트 메소드가 정해져있는 경우도 있어서 정의하지 않아도 디폴트 메소드 구현이 가능하다.

또한 바디가 없는 메소드 작성시 abstract이라고 추가해준다 public abstract void move(){}

 

2.한개의 abstract 클라스만 받을 수 있다.

Interface는 class Zebra implements Animal,Earth이런식으로 두개를 가져올 수 있는데, abstract을 이렇게 못한다.

 

3.변수 위치는 abstract 클라스 내부에 있다,
abstract class AAnimals{
//변수를 abstract 클라스 안에 정의해줌 
    String animalName;
    public String getAnimalName(){
        return this.animalName;
    }
    
    public void setAnimalName(String animalName){
        
        this.animalName = animalName;
    }
}

class Zebra extends AAnimals {
    public Zebra() {
        this.animalName = "zebra";
    }
}
 
** 인터페이스의 경우, 변수정의는 상속받는 클라스 안에다가 해줘야함 
interface SMent{

    public void dance();

}

class SMentCeleb implements SMent, Jyp{

    String name;

    public SMentCeleb(String name){

        this.name = name;
    }

 

4.super()메소드로 abstract 클라스의 생성자를 받아올 수 있다.

 

public class Main{
	public static void main(String[] args){

	Hamburger hamburger = new Hamburger("chicken burger","5000");

	}
}


abstract class AmericanFoods{
	String name;
	int price;
	AmericanFoods(String name,int price){
		this.name; 
		this.price;
	}
	public void language(){
		System.out.printlnt("we speak only in English!");
	}
	public abstract void taste();
}

abstract 클래스 안에 변수 정의와 생성자 정의를 해줬다. super()를 사용하여 abstract클라스의 생성자를 불러온다 

class Hamburger{
	public Hamburger(String name,int price){
		super(name,price);
	}

@Override
public String getName(){
		return this.name;
	}
@Override
public int getPrice(){
	return this.price;
}

@Override
public String setName(String name){
	this,name = name;
}

@Override
public int setPrice(){
	this.price = price;
}

@Override
public void taste(){
	System.out.println("very delicious~~");
}

}

 

 


이제 인터페이스에 대해 알아보자 !

 

인테페이스랑 동일한 목적안에 동일한 기능을 사용하기 위해서 쓴다. 오버라이드로 기능을 조금씩 수정할 수 있다.

 

1.인터페이스는 추상 클라스의 한 종류라서 new 객체를 생성할 수 없다.

public class PracticeInterface {
    public static void main(String[] args){

       
        Vehicle Plane = new Plane("korean air",100);
        Vehicle Trunk = new Trunk("ford",200);
        Plane.drive();
        Trunk.drive();

    }
}

   Vehicle이라는 인터페이스를 만들었는데 new객체를 생성한 것이 아니라서  Vehicle plane = new Vehicle("");로 쓸 수 없고 Vehicle plane = new Plane(""); 이렇게 썼다.

 

2.인터페이스에 들어있는 모든 메소드는 상속받는 다른 클라스에서 오버라이드로 마음껏 쓸 수 있다.

interface Vehicle{
  //자바에서는 변수를 인터페이스에 쓰지 않고 클라스에 써준다.
  //still use return type
  void drive();

        }

인터페이스 안에 메소드를 지정해준다. 프로토타입으로 넣어서 오버라이드로 구현해준다.

 

3.변수는 클라스 안에 쓰며, 오버라이드로 메소드 구현 

class Plane implements Vehicle{
        String name ;
        int speed ;
    public Plane(String name,int speed){
        this.name = name;
        this.speed = speed;
    }

    @Override
    public void drive() {
        System.out.println("비행하다");
    }
    
    
 class Trunk implements Vehicle{
        String name;
        int speed;
        public Trunk(String name,int speed){
            this.name = name;
            this.speed = speed;
        }
    @Override
    public void drive() {
        System.out.println("운전하다");
    }

 

비행기와 트럭 모두 운전해서 가는 vehicle이다. 하지만 비행기는 하늘을 날면서 비행하고 트럭은 땅에서 운전한다.

즉 기능은 같지만 메소드 동작 방법이 다를 때 interface를 활용할 수 있다.

 

 

'Java' 카테고리의 다른 글

인텔리제이에서 Javadoc 생성하기  (0) 2022.01.13
오버라이딩 vs 오버로딩  (0) 2022.01.08
자바의 자료구조- Map,HashMap  (0) 2022.01.07
자바의 자료구조-Set,HashSet 개념 및 사용법  (0) 2022.01.07
Stringbuffer 클래스  (0) 2022.01.07

댓글