본문

일반클래스 상속, 추상클래스 상속

반응형

# 일반클래스 상속, 추상클래스 상속


# 일반클래스 상속

음식점 본사에서는 "이러한 메뉴은 꼭 있어야 한다." 라고 규칙을 정했고, 체인점에서는 "알겠다." 하고 그 메뉴 그대로 판매를 했다.
손님에게 메뉴판을 보여주었을 때 체인점 지점장은 놀랬다. 모든 메뉴들이 0원으로 되어있기 때문이다.
아래에 있는 예제를 실행해보면 모든 메뉴가 전부 0원이라며 본사의 문구가 찍혀있는 것을 볼 수 있다.
본사에서 "꼭 너희가 원하는 메뉴 가격을 다시 정해라"라는 주의사항을 알려주지 않았기 때문에 발생한 것이다.
이럴 때 "꼭!!! 너희가 다시 정의해"라는 주의 메세지를 주는 것이 "추상 클래스의 역할"이다.

Source01) 본사.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package testAbstract;
 
public class 본사 {
    // default 생성자
    public 본사(){}
    
    public void 김치찌개() {
        System.out.println("김치찌개 0원");
    }
    public void 부대찌개() {
        System.out.println("부대찌개 0원");
    }
    public void 비빔밥() {
        System.out.println("비빔밥 0원");
    }
    public void 순대국() {
        System.out.println("순대국 0원");
    }
}
cs

Source02) 체인점.java
1
2
3
4
5
6
7
8
9
package testAbstract;
 
public class 체인점  extends 본사{
    String 매장명 = "인천 부평점";
    
    public 체인점(){
        System.out.println(매장명 + "입니다.");
    }
}
cs

Source03) Main.java
1
2
3
4
5
6
7
8
9
10
11
12
package testAbstract;
 
public class Main {
    public static void main(String[] args) {
        // 체인점 메뉴판 보여주기
        체인점 메뉴 = new 체인점();
        
        System.out.println(메뉴.매장명 + "의 메뉴는");
        메뉴.김치찌개();
        메뉴.부대찌개();
    }
}
cs

Result)

1
2
3
4
인천 부평점입니다.
인천 부평점의 메뉴는
김치찌개 0원
부대찌개 0원
cs


# 추상클래스 상속

1. 꼭 재정의 해야해 ! 하는 메소드가 하나라도 있다면 클래스가 추상클래스가 된다.

즉, 클래스 안에 

public abstract void 메소드명(); 이라고 선언되어있다면

이 메소드를 포함한 클래스는 abstract라고 같이 선언하지 않으면 오류가 난다.

ex) ParentClass.java


2. 추상메소드는 { } 대괄호 안에 정의 해놓지 않는다. 

상속받는 자식클래스들이 무.조.건. 재정의를 해주어야 하기 때문에 필요가 없는 것이다.

ParentClass 예제의 7번째 줄 speek(); 부분을 보면 된다.


3. abstract 클래스는 인스턴스 생성이 불가능하다.

ParentClass를 new로 객체 생성하려 한다면 다음과 같이 나온다.

speek가 추상메소드이기에 정의해주어야만 사용이 가능하다며 ..

1
2
3
4
5
ParentClass cc = new ParentClass() {
   @Override
   public void speek() { 
   }
  };
cs



Source01) 부모클래스.java

1
2
3
4
5
6
7
8
9
package testAbstract;
 
public abstract class 부모클래스 {
    public abstract void 말하다();
    
    public void 아침인사를하다(){
        System.out.println("안녕히 주무셨어요?");
    }
}
cs


Source02) 자식클래스.java
1
2
3
4
5
6
7
8
9
package testAbstract;
 
public class 자식클래스 extends 부모클래스 {
    @Override
    public void 말하다() {
        System.out.println("아부지");
        System.out.println("어무이");
    }
}
cs

Source03) Main.java
1
2
3
4
5
6
7
8
9
package testAbstract;
 
public class Main {
    public static void main(String[] args) {
        자식클래스 나 = new 자식클래스();
        나.말하다();
        나.아침인사를하다();
    }
}
cs

Result)

1
2
3
아부지
어무이
안녕히 주무셨어요?
cs



Q) 그렇다면, 일반클래스의 상속과 추상클래스의 상속 중 어떤 것이 더 좋을까 ?

A) JAVA를 공부하면서 많은 기능을 보며 항상 궁금해한다. 어떻게하는 것이 더 좋을까 ? 라고

답은 항상 정답은 없다고, 어떤 상황에서 이렇게 많이 쓴다더라 ~ 여서 가독성 때문에 그렇게 하는 거라는 식이었다.

개인적인 생각인데 추상클래스에는 프로젝트에 따라서 다르겠지만, 웬만해서는 추상메소드만 선언하는 것이 나을 것 같다.

패턴을 하게되면 모든 것을 알게된다 한다. 패턴을 공부합시다 


- 출처 및 참고 : http://smilennv.blog.me/220443312153

반응형

공유

댓글