java/자바공부

추상클래스 다형성과 오버라이딩에 대하여

Dev갱이 2020. 7. 1. 13:07
728x90

추상클래스는 다형성과 오버라이딩으로 이점을 볼 수 있다.

 

[다형성이란]

타입 변수 = new 생성자();

여기서 타입으로는 부모 타입이 놓일 수 있고, 생성자 위치에는 자식들이 놓일 수 도 있다.

쉽게 말해 생성자 자리에 서로 다른 클래스가 놓일 수 있는 즉 타입이 다양할 수 있다는 성질.

타입은 조상 클래스 중 어느것이든 사용가능.

바꿔 말하면 조상 클래스를 타입으로 선언한 변수에는 어떤 자손 클래스든 담을 수 가 있습니다.

class Object{
	public void action(){
		System.out.println("action");
	}
}

class Block1 extends Object{
	public void action(){
		System.out.println("네모회전");
	}
}

class Blcok2 extends Object{
	public void action(){
		System.out.println("작대기회전");
	}
}
public class Test4 {

	public static void main(String[] args) {
		Object object = new Object(); //조상 클래스
		Object block1 = new Block1(); //자식 클래스
		Object block2 = new Blcok2(); // 자식 클래스
		
		block1.action(); //결과 : 네모회전
		block2.action(); //결과 : 작대기회전
	}

}

여기서 최상위 조상의 역할을 하는게 Object object = new Object();클래스

여기서 Object 어떠한 클래스 및 생성자 사용가능. 사용가능한 생성자(조상 클래스를 상속받는 생성자)

더보기

여기까지 다형성과 오버라이딩. --- 여기서 인터페이스 개념은 제외함 ----

[추상클래스]

테트리스 블럭들을 모두 클래스로 따로따로 만든다는 상황을 생각할 수 있는데요

테트리스에는 7개의 블록이 있는데, 모두 회전하는 기능이 있고, 이 회전이 블록마다 조금씩 다르게 적용된다고 합시다.

그러면 rotate()라는 메서드를 만들고 싶은데 얘네가 부모로 묶여있지 않고 다 각각의 클래스라면

공통된 부모가 Object 클래스뿐입니다.
그러면 이 7개 블록 클래스 중 어떤 객체든 담을 수 있는 변수를 만들려면

Object block ;
이처럼 Object 타입의 변수를 선언해두어야 합니다.그러나 Object 클래스에는 rotate라는 메서드가 없기 때문에 회전을 사용할 때마다

if( block instanceof LBlock ) {
    ( (LBlock) block).rotate();
}

이러한 느낌으로 조건 검사를 거쳐야 할 겁니다. 7개 블록 클래스 모두에 대해서요. 그러나 rotate 메서드를 갖는 부모 클래스만 있었다면 if, else if 구조를 작성할 필요도 없이 다형성과 오버라이딩을 통해 block.rotate();코드를 약 13~15줄 정도는 줄일 수 있습니다.그러나 부모로 묶자니... 객체화할 수 있는 부모를 정하기는 애매하죠 그래서 추상클래스 정도 되는 부모를 둬버리는 겁니다.

abstract class Block {
    // ...
    public void rotate() {
        // 기본적인 회전을 구현해둬도 되고 추상메서드로 하셔도 되고...
    }
}

이렇게 부모클래스로 쓸 Block 추상클래스를 만들고

Block block ;

선언해두고... 상황에 따라

block = new LBlock() ;

이와 같이 다양한 객체가 들어올 수 있겠지만 결국 회전을 시킬 때는 여기 뭐가 담겼는지 생각할 필요 없이

block.rotate(); 하나로 회전이 매우 가능입니다.

abstract class Block {
	
   public abstract String rotate();
}

class Figure1 extends Block{

	@Override
	public String rotate() {
		// TODO Auto-generated method stub
		System.out.println("작대기도형 회전");
		return "작대기도형 회전";
	}
}
class Figure2 extends Block{

	@Override
	public String rotate() {
		// TODO Auto-generated method stub
		System.out.println("네모 도형 회전");
		return "네모 도형 회전";
	}

}
class Figure3 extends Block{

	@Override
	public String rotate() {
		// TODO Auto-generated method stub
		System.out.println("삼각형 도형 회전");
		return "삼각형 도형 회전";
	}

}

public class Test4 {

	public static void main(String[] args) {
		Block block;
		block = new Figure1();
		block.rotate(); // 작대기도형 회전
		block = new Figure2();
		block.rotate(); // 결과 네모 도형 회전
		block = new Figure3();
		block.rotate(); //결과 삼각형 도형 회전
		
		
	}

}
728x90