세상에는 여러 동물이 있고 그 동물마다 특징을 나타내는 상속 클레스를 만들어 보았다.
개 , 고양이, 독수리 , 상어 등 동물들은 모두 동물이라는 것부터 시작을 하게 되고 개가 먹는것과 고양이가 먹는다는 기능은 같은 기능으로서
부모클래스 animal을통해 abstract 추상화를 시켜 만들수가 있다.
추상 - abstract
public abstract class animal { // 추상클래스
abstract void eat(); // 추상메서드
abstract void sound();
abstract void move();
}
추상클래스 (abstract)
- 추상클래스는 인스턴스를 생성할 수 없다
- 단 타입으로서 의미를 가지고 있다.
어떻게 사용을 하느냐 --- override 을 하면 abstract 클래스나 메서드를 사용할 수 있다 .
public abstract class mammal extends animal{
abstract void 포유류특성();
}
public class dog extends mammal{
@Override
void 포유류특성() {
// TODO Auto-generated method stub
System.out.println("개만의 기능");
}
@Override
void eat() {
// TODO Auto-generated method stub
System.out.println("개 먹는다");
}
@Override
void sound() {
// TODO Auto-generated method stub
System.out.println("개 소리낸다");
}
@Override
void move() {
// TODO Auto-generated method stub
System.out.println("개 움직인다");
}
}
public class animalMain {
public static void main(String[] args) {
penguin ob1 = new penguin();
whale ob2 = new whale();
eagle ob3 = new eagle();
dog ob4 = new dog();
cat ob5 = new cat();
shark ob6 = new shark();
//포유류끼리 묶기
mammal[] ma = new mammal[] { ob1, ob4, ob5};
//동물 배열로 묶기
animal[] ani = new animal[] { ob1, ob2, ob3, ob4, ob5};
animal[] ani2 = new animal[] { ma[0], ani[2] };
for(int i = 0 ; i < ani.length; i++) {
ani[i].eat();
}
이런식으로 추상클래스를 상속받아 객체를 만들고
이렇게 만든 것들은 포유류끼리나 동물로 묶을 수 있는 기능들이 있다.
- 설계 1. has ~ a 2. is ~ a 가 있다
- ex 티비와 리모콘처럼 관계를 연결해야되면 has ~ a (포함개념)
상속이나 추상화하는 개념과 동떨어진다 .- ex 개와 고양이의 공통점이 있고 이를 동물로 하는 dog is a animal?
클래스는 여러개를 상속받을 수가 없다 .
이로인해 포유류 동물끼리 묶을 수는 있지만 수영을 할 수 있는 동물들을 묶을 수 가없다 ( 여러개를 상속받지 못하기 때문)
자바의 클래스가 여러개를 상속받지 못하는 개념을 보충하기위해 사용되는것이
Interface 다
public interface inWater {
//interface 는 관계가 없는 애들을 묶어주기 위한 접점의 역할을 해줌
// interface는 여려곳에서 상속받아도됨 -- 모양이 없어서
public abstract void inwater();
}
이를 인터페이스로 만들게 되고 해당 객체에 넣어주는데
extends 가 아닌 implement을 사용하게 된다
public class whale extends mammal implements inWater{
@Override
void 포유류특성() {
// TODO Auto-generated method stub
System.out.println("고래가 가지는 특성");
}
@Override
void eat() {
// TODO Auto-generated method stub
System.out.println("고래가 먹는다");
}
@Override
void sound() {
// TODO Auto-generated method stub
System.out.println("고래가 소리낸다");
}
@Override
void move() {
// TODO Auto-generated method stub
System.out.println("고래가 움직인다");
}
@Override
public void inwater() {
// TODO Auto-generated method stub
System.out.println("고래가 물에서 생성");
}
}
inWater[] water = new inWater[] { ob1, ob2, ob6 };
for(int i = 0 ; i < water.length; i++) {
water[i].inwater();
}
이런식으로 인터페이스를 통해 서로다른 객체를 상속받은 인스턴스들을 연결 시킬 수 있다.