-
추상클래스 다형성과 오버라이딩에 대하여java/자바공부 2020. 7. 1. 13:07728x90
추상클래스는 다형성과 오버라이딩으로 이점을 볼 수 있다.
[다형성이란]
타입 변수 = 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