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을 이렇게 못한다.
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 |
댓글