[Java]공부 abstract, interface

ohjihyung·2022년 6월 19일
0


세상에는 여러 동물이 있고 그 동물마다 특징을 나타내는 상속 클레스를 만들어 보았다.
개 , 고양이, 독수리 , 상어 등 동물들은 모두 동물이라는 것부터 시작을 하게 되고 개가 먹는것과 고양이가 먹는다는 기능은 같은 기능으로서
부모클래스 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

클래스는 여러개를 상속받을 수가 없다 .
이로인해 포유류 동물끼리 묶을 수는 있지만 수영을 할 수 있는 동물들을 묶을 수 가없다 ( 여러개를 상속받지 못하기 때문)

자바의 클래스가 여러개를 상속받지 못하는 개념을 보충하기위해 사용되는것이
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();
		}

이런식으로 인터페이스를 통해 서로다른 객체를 상속받은 인스턴스들을 연결 시킬 수 있다.

profile
웹 개발자의 기초부터 심화까지

0개의 댓글