본문 바로가기

Developer/Java-oop

#017. abstract (추상화) 알아보기...

#017. abstract (추상화) 알아보기...

 

1. 추상화란 상속받는 자식 클래스가 꼭! 구현해야 하는 메서드를 정의 하는 것이며, 자식클래스가 오버라이딩으로 메서드 재정의를 하지 않는다면 컴파일이 안된다.

오버라이딩으로 메서드를 재정의하지 않으면, 오버라이딩 특성상 컴파일이 안되기 때문에 자식 클래스의 메서드의 이름 과 사용방법의 통일이 될 것이다. 추상화 클래스는 new로 객체를 만들 수 없다.

 

2. 이번엔 abstract 를 테스트 하기 위해 아래와 같은 작업을 할 것이다.

부모 = Parent Class 를 Abstract (추상화)로 만든다. 추상화 메서드 who 를 만든다.

자식1 = Son Class 에 Parent 를 상속받고, who 메서드 재정의를 한다.

자식2 = Daughter Class 에도 Parent 를 상속받고, who 메서드 재정의를 한다.

테스트 = AbstractDemo Class 에 Parent 객체에 자식의 클래스로 upcasting 을 한 뒤 자식의 overriding 된 who 메서드를 실행 해본다.

 

1) 부모 class (Parent.java)

코드

package oop2;

 

// 추상화 클래스로 Parent 를 만든다.

public abstract class Parent {

 

    // 구현이 없는 추상화 메서드 who 를 만든다.

    public abstract void who();

    

}

설명

문장4,7: abstract 라는 예약어를 사용한다.

문장7: 구현부분 { } 가 없다.

 

2) 아들 class (Son.java)

코드

package oop2;

 

public class Son extends Parent {

    

    // Parent 의 who 메서드를 overriding 로 재정의 합니다.

    @Override

    public void who() {

        System.out.println("아들의 정보가 출력 됩니다.");

    }

}

설명

문장6~9: who 메서드를 만들지 않으면 오류가 발생된다.

 

3) 딸 class (Daughter.java)

코드

package oop2;

 

public class Daughter extends Parent {

 

    // Parent 의 who 메서드를 overriding 로 재정의 합니다.

    @Override

    public void who() {

        System.out.println("딸의 정보가 출력 됩니다.");

    }

}

설명

문장6~9: who 메서드를 만들지 않으면 오류가 발생된다.

 

4) 데모 class (AbstractDemo.java)

코드

package oop2;

public class AbstractDemo {

 

    public static void main(String[] args) {

        

        // Abstract 클래스는 new 객체를 생성할 수 없습니다.

        // Parent pa = new Parent();

        

        Parent p = null;

        

        p = new Son();

        p.who();

        

        p = new Daughter();

        p.who();    

    }

}

결과

아들의 정보가 출력 됩니다.

딸의 정보가 출력 됩니다.

설명

문장9: 부모의 객체를 생성한다.

문장11: 부모의 객체 p에 Son의 객체를 upcasting 해서 넣는다.

문장12: overriding의 규칙으로 자식의 who() 메서드를 실행하게 된다.

문장13~14: 위 Son 의 객체처럼 Daughter 의 객체도 같은 방법으로 실행된다.

 

3. 위 예제에서 Parent 객체를 new 로 바로 생성하지 못하지만, 아래와 같이 하면 가능하다.

코드

package oop2;

public class AbstractDemo {

    public static void main(String[] args) {

        // Abstract 클래스는 new 객체를 생성할 수 없습니다.

        // Parent pa = new Parent();

 

        Parent p = null;

        p = new Son();        p.who();

        p = new Daughter();        p.who();

        

        // 아래 코드만 변경됨

        Parent p1 = new Parent() {

            @Override

            public void who() {

                System.out.println("바로 구현이 가능하기도 함...");

            }

        };

        p1.who();

    }

}

결과

아들의 정보가 출력 됩니다.

딸의 정보가 출력 됩니다.

바로 구현이 가능하기도 함...

설명

문장12~16: 객체 생성 후 { } 문으로 바로 기능을 구현하여 사용할 수 있다.

 

추상화는 여러 사람이 프로젝트를 개발할 때. 어떠한 규칙을 만들기 위해서 많이 사용된다.

그럼 다음 시간엔 새로운 예제로 interface (인터페이스) 를 알아보자...

 

잡담. 오늘도 고생하셨고, 모두 화이팅 입니다*^^* 오늘도 12:30분.. 새벽에 잠듭니다. ㅠ