java

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ java ] in KIDS
글 쓴 이(By): Noryae (solo wolf)
날 짜 (Date): 1998년03월20일(금) 17시06분04초 ROK
제 목(Title): Re: abstract.



매우 어려운 질문이라 그냥 지나치려고 했는데..
촤~~밍(?)이라고 하시니... :p

추상화의 개념 자체가 광범위하고 추상적이다 보니 
그거 가 커버하려면 책 한권 써야 하지 않을까...쩝.

간단히 Java에서 abstract 키워드의 사용법만 아는데로 
말씀드리죠.

abstract를 method의 specifiation에 쓸 수 있는데 
이 경우 method의 body를 정의하지 않습니다:

class Animal {
   public abstract String livesIn();
}

이렇게 선언하면 Animal이란 클래스는 추상클래스가 됩니다.
즉, instance를 가질 수 없고 구체화된 클래스(specialized class)에서만
instance를 가질 수 있게 됩니다.
Specialized class란 abstract class의 상반되는 개념으로 
abstract class에서 선언한 abstract method의 실제 body를 
제공하는 클래스입니다.

class Monkey extends Animal {
   public String livesIn() { return "trees"; }
}

class Penguin extends Animal {
   public String livesIn() { return "ice"; }
}

위에서 Monkey와 Penguin은 Animal의 specialized class가 되는 겁니다.

그러니까 추상화의 개념은 구체적인 것들을 일반화시키는 것이죠.
livesIn이란 method는 동물이면 누구나 가질 수 있는 성질이죠.
근데 동물의 livesIn에서 return하는 value는 livesIn이 추상적이기 때문에
어떤 특정한 값이 있을 수 없죠.
반면 원숭이나 펭귄은 특정한 동물들이기 때문에 어디 사는지 알 수 있죠.

위의 예는 좀 간단한 예이고, 만약 livesIn이란 method를 더 광범위하게 
제공하고 싶다. 예를 들어서... 꼭 동물만 사냐? 모든 생물체는 다 사는 곳이
있지 안냐?  하고 반문할 수 있죠. 그럼 다음과 같이 정의할 수도 있습니다.

interface AnyLivingBeing {
    public abstract String livesIn();
}

class Monkey implements AnyLivingBeing {
    public String livesIn() { return "trees"; }
}
class Penguin implements AnyLivingBeing {
    public String livesIn() { return "ice"; }
}
class Bacteria implements AnyLivingBeing {
    public String livesIn() { return "dirty places"; }
}
....

이렇게 선언하면 꼭 어떤 클래스로부터 subclass인 객체들에 한정되지 
않죠.
Java에서 interface는 기본적으로 abstract method들만 선언하는 
타입이라고 보시면 됩니다. 그래서 abstract 키워드를 제외하고 써도 되죠.

두서 없이 설명했는데 이해가 가시는지... 

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.