티스토리 뷰

Java

abstract추상화

Xion 2018. 8. 17. 16:36


추상화(Abstract)


추상적이란 것은 눈으로 볼 수 없는 것을 의미한다.

추상화는 구체적인 개념으로부터 공통된 부분들만 추려 일반화하는 것을 말한다.




< 이미지 : 구글>



롤이라는 게임은 탑, 미드, 바텀, 정글이라는 포지션으로 구성 된다.

그림과 같이 각각의 챔피언들은 공통된 포지션으로 추려져 크게 탑, 미드, 바텀(정글 제외)으로 나눠진다.

각각의 챔프들을 추상화한 것이다.


이 때 카밀, 피즈나 제드와 같은 챔프는 눈으로 확인할 수 있지만(생김새 또는 행동) 탑, 미드, 바텀이라는 그 자체는 우리가 눈으로 확인할 수 없다.

탑, 미드, 바텀 자체를 눈으로 확인할 수 없듯 추상 클래스는 자바에서 인스턴스화가 불가능하다.

자, 그럼 추상 클래스를 사용하는 이유는 무엇일까?


추상 클래스


추상 클래스를 사용하는 대표적인 이유는 상속과 오버라이딩이다.

다시 롤을 예를 들어 생각해보자.


LgOfLegend라는 추상 클래스를 생성했다. 그리고 champ()라는 추상 메소드1를 선언했다.

(이 때 추상 메소드가 선언되어 있는 클래스는 반드시 추상 클래스여야 한다. 하지만 추상 클래스안에 반드시 추상 메소드만 있어야 하는 것은 아니다)

Top, Mid, Bottom 클래스는 champ() 메소드를 상속받았다. 그리고 champ() 메소드를 각 포지션에 해당하는 챔피언 메세지로 재정의(오버라이딩)해서 사용한다.

Play클래스에서 만든 객체 top, mid, bot은 추상 메소드 champ()와 일반 메소드 main()을 사용할 수 있게 된다.


LgOfLegend.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package biz.test;
 
public abstract class LgOfLegend {
    abstract void champ();
    /**
     *@param args
     */
    public static void main() {
        System.out.println("챔피언을 고르세요!");
    }
}
 
class Top extends LgOfLegend {
    public void champ(){
        System.out.println("탑 : 카밀");
    }
}
 
class Mid extends LgOfLegend {
    public void champ(){
        System.out.println("미드 : 피즈");
    }
}
 
class Bottom extends LgOfLegend {
    public void champ(){
        System.out.println("바텀 : 이즈리얼");
    }
}
 
class Play {
    public static void main(String[] args) {
        Top top = new Top();
        Mid mid = new Mid();
        Bottom bot = new Bottom();
        Top.main();
        top.champ();
        mid.champ();
        bot.champ();
    }
}
cs


-Console-





추상 클래스 개념 정리 끝!

나중에 인터페이스와의 차이에 대해서도 다뤄봐야겠다.


+피드백은 언제나 환영입니다 :)


  1. 부모 클래스에서 선언만 하고 정의는 하지 않은 메고드, 쉽게 { }(중괄호)가 없다고 생각하면 된다.



abstract- abstract라고 하는 이 객체지향의 개념에서 주목해야 할 특징

1.abstract로 지정되어 있는 메소드나 클래스는 직접적인 사용 X

2.반드시 상속한 클래스를 만들어서 상속한 클래스를 사용하도록 강제하는 것.

즉, 상속해서 사용하도록 강제하는것 = abstract





기본 문법


- 추상 메서드

아무런 일도 하지 않는 메서드를 말한다.

추상메서드는 자식클래스에서 사용할 메서드의 이름만 갖고 있다(미구현상태) 즉,{}를 갖지 않는다.





abstract class A {

ex)             abstract int b();



}

class B extends A

 {

}


[메인]

public class a {

pulbic static void main(String[] args) {

}





[바뀐코드]


class B extends A {} 를

class B extends A{

public int b(){

return 1;

}


 ->이렇게 extends A를 받는 B에게 추상화된 B 메소드를 오버라이딩하며 재정의하면 오류가 사라진다 .

->여기서 b() 메소드를 사용하기 위해서는 abstact된  즉, 추상화 메소드를 오버라이딩 하여 정확히 해줘야 한다.

 ->이것을 통하여 알수있는 것은 결국 ★abstract 는 상속을 강제하고 있다.

 ->동시에, 추상메소드 OR 추상 클래스는 구체적인 로직이 아닌 형식의 시그니처만을 가지고 있다 !

 ->그것에 대한 구체적인 구현의 책임은 사용하는 쪽에 책임을 넘긴다.

 ->또한 abstract로 정의된 메소드는 그 안에서 정의를 해봤자 오류가나므로 반드시 상속하는 곳에서 오버라이딩을 해줘야 한다.

->abstract class A가 먼저 정의된 것이 아니라 그 안의 내용인 pulbic abstract int b()가 추상 메소드여서 클래스는 자동적으로 abstract화가 된것이다. 


                                                              결과적으로 abstract는 

1.상속을 강제한다 . 


2.abstract로 정의된 메소드는 그 안에서 정의해 봤자 오류가 나므로 상속받는 class안에서 오버라이딩을 해줘야 한다.


3.abstract class로 먼저 정의할수 있지만 그 안에서 abstract로된 메소드 또는 멤버가 있다면 그 메소드로 인해  abstract가 아닌 보통의 class역시 abstract화 되어 abstract class가 자동적으로 된다.





why ? 상속을 강제하지 ?






앱스트랙트는 

ex_

abstract class A

{

public abstract int b();


//본체가 있는 메소드는 abstract를 가질수 없습니다.

//public abstract int c()

{

syso("hi")

}

->이것은 본체가 앱스트랙트안에 정의되어있으므로 유려가남


특징

//추상 클래스 내에는 추상 메소드가 아닌 메소드가 존재할수없습니다

즉 앱스트랙트 클래스 안에는 앱스트랙트 메소드만이 존재 가능.


b라는 추상메소드를 정의해줘야함 오버라이딩하여서


ex

class B extends A    // A를 사용하기위해 상속을 강제하고있음 B에게

{

public int b( )    //오버라이딩 하여 재정의함.

{

return 1;

}


추상클래스는 그것을 사용하기 위해서는 반드시 그것을 상속받은 클래스를 만들어서

그 클래스를 사용해야함



'Java' 카테고리의 다른 글

Exception을 직접 발생시키는 방법  (0) 2018.08.28
예외처리 finally  (0) 2018.08.21
JAVA - 다형성 (polymorphism)  (0) 2018.08.17
abstract(추상 클래스)와 interface의 차이점  (0) 2018.08.17
자바 인터페이스(interface)  (0) 2018.08.17