Java/Java icia 10일차

오버라이딩 , 상속 , 추상화

swkn 2023. 3. 7. 15:01

추상화

 

추상화 == 같은 메소드를 쓰는 것들을 한 클래스에 몰아넣고 나머지 클래스는 다 상속시켜서 불필요한 코드를 줄인다.

추상클래스 와 추상메소드가 있다.

 

추상메소드가 1개라도 있다면 그 클래스는 추상클래스가 된다.

 

추상화의 표현은 abstract를 붙여서 사용한다

 

추상클래스 상속받는쪽이 무조건 재정의해줘야하는 클래스

추상메소드 특징 : abstract가 붙고 중가로가 없다. 실행구간은 상속받는쪽에서 재정의하기때문에 없다.

    //어떻게 우는지
	public abstract String cry();
	
	//어떻게 움직이는지
	public abstract String move();
	
	//무엇을 먹는지
	public abstract String food();
	
	public abstract void print();

 

 

 

AnimalMain , Animal , dog , cat , bird 클래스를 만들어서 dog , cat , bird에서 사용될 메소드를 Animal에 

 

추상화로 정리할 수 있다.

 

package day10_1;

public abstract class Animal { // 추상클래스 상속받는쪽이 무조건 재정의해줘야하는 클래스
	String name;
	
	public Animal() {
		
	}
	
	public Animal(String name) {
		this.name = name;
	}
	
	// 추상메소드 특징 : abstract가 붙고 중가로가 없다. 실행구간은 상속받는쪽에서 재정의하기때문에 없다.
	
	public String getName() {
		return this.name;
	}
	//추상메소드가 하나라도 있으면 추상클래스다 .
	
	//어떻게 우는지
	public abstract String cry();
	
	//어떻게 움직이는지
	public abstract String move();
	
	//무엇을 먹는지
	public abstract String food();
	
	public abstract void print();
	
	
	
	
	

}

abstract를 붙이게 되면 하위 메소드에서 꼭 재정의 해줘야한다.

 

cat class

package day10_1;

public class Cat extends Animal{
	String cry;
	String move;
	String food;
	
	@Override
	public String cry() {
		return cry;
	}

	@Override
	public String move() {
		return move;
	}

	@Override
	public String food() {
		return food;
	}

	@Override
	public void print() {
		System.out.println(getName()+" / "+cry+ " / "+move+" / "+food);
	}

}

dog class

package day10_1;

public class Dog extends Animal{
	String cry;
	String move;
	String food;

	@Override
	public String cry() {
		return cry;
	}

	@Override
	public String move() {
		return move;
	}

	@Override
	public String food() {
		return food;
	}

	@Override
	public void print() {
		System.out.println(getName()+" / "+cry+ " / "+move+" / "+food);
		
	}

	}

bird class

package day10_1;

public class Bird extends Animal{
	String cry;
	String move;
	String food;
	
	@Override
	public String cry() {
		return cry;
	}

	@Override
	public String move() {
		return move;
	}

	@Override
	public String food() {
		return food;
	}

	@Override
	public void print() {
		System.out.println(getName()+" / "+cry+ " / "+move+" / "+food);
	}

}

각각 Override로 메소드를 재정의해서 각 출력값이 다르게 나오게 된다.

 

Animal class Main

package day10_1;

public class AnimalMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Dog dog = new Dog();
		dog.name = "강아지";
		dog.cry = "멍멍";
		dog.move = "성큼성큼";
		dog.food = "뼈다귀";

		Cat cat = new Cat();
		cat.name = "고양이";
		cat.cry = "야옹";
		cat.move = "사뿐사뿐";
		cat.food = "생성";
		
		Bird bird = new Bird();
		bird.name = "새";
		bird.cry = "짹짹";
		bird.move = "펄럭펄럭";
		bird.food = "애벌레";
		
		dog.print();
		cat.print();
		bird.print();
	}

}

 

출력값

강아지 / 멍멍 / 성큼성큼 / 뼈다귀
고양이 / 야옹 / 사뿐사뿐 / 생성
새 / 짹짹 / 펄럭펄럭 / 애벌레

으로 나오게 된다.

 

Animal class에서 abstract로 메소드만 만든후에 각 class로 재정의해서 출력한것이다.