ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 추상클래스 다형성과 오버라이딩에 대하여
    java/자바공부 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
Designed by Tistory.