추상抽象 ; 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용.
지금까지 상속에 관한 내용을 하면서 계속 해온 이야기이다. 부모클래스에서 공통된 멤버를 만들어 전체적인 설계의 틀을 만들고
자식클래스가 그것을 상속받아 각각의 객체를 만들었다.
추상클래스도 비슷하다. 예를 들어 고양이, 강아지, 새 ,,, 는 전부 '동물'이라는 공통점으로 묶인다.
삼성, 현대 롯데는 '회사'라는 카테고리로 묶을 수 있다. 이렇게 구체적인 실체가 아니라 동물, 회사 등의 공통 특성을 모아놓은 카테고리를
추상적인 것 이라고 한다.
추상 클래스는 어떠한가? 위의 이야기와 같다. 객체를 생성할 수 있는 클래스를 실체클래스라고 할 때 실체 클래스들의 공통된 부분들을
묶어서 만든 클래스가 추상 클래스 이다. 추상클래스와 실체클래스는 항상 상속관계에 있다.
상속관계로서 실체클래스는 추상클래스의 모든 특성을 물려받고 새로운 특성을 가질 수도 있다.
책의 추상 메소드의 설명에서 조금 다른 느낌을 받은게 있는데 지금까지 상속관계로 만들어왔던 부모클래스는 항상 부모 클래스가 먼저 만들어지고
자식클래스는 부모 클래스를 상속받아 새로운 특성으로 재정의 하거나 중복을 방지했다.
결국 부모가 먼저라는 이야기. 추상클래스의 설명에서는 '실체 클래스의 공통된 부분을 추출해서' 라는 설명을 보았다.
그렇다면 추상클래스가 먼저가 아니라 실체클래스가 먼저라는 것인가??
공부하다보면 알수있겠지 지금은 일단 넘어가자
이 이야기를 하는 이유는 이것 때문이다.
추상클래스는 실체클래스의 공통된 특성을 추출해서 만든 클래스이기 때문에 객체를 만들수없다.
Animal 이라는 추상클래스가 있다고 할때 Animal animal = new animal();
이런 식으로 객체생성이 불가능하다는 이야기이다. 추상 클래스는 새로운 실체클래스를 위한 부모클래스 만으로 사용된다.
용도
그러면 추상클래스를 만들어 쓰는 이유는>??
- 실체 클래스들의 공통괸 필드, 메소드의 이름을 통일할 목적
실제 프로그래밍 이란일은 여러 사람의 협업으로 이루어 지는 경우가 많다. 이때 같은 프로젝트를 진행하면서 공통된 특성을 사용하지만 개개인이 만든 코드의 멤버, 필드의 이름이 다 틀리다면??
서로 일하기도 어렵고 나중에 코드를 하나로 합칠때 아주 많은 문제가 생긴다. 동일한 기능을 가진 객체이지만 이름이 다르니 각각 사용법이 달라지는것이다.
이때 추상클래스에 공통된 멤버를 만들고 상속해서 개발한다면 멤버의 이름을 통일할수있다.
- 실체 클래스의 작성시간 절약
간단히 말해 전체적인 규격을 설계하는 것이다. 위에서 말했듯이 공통된 멤버를 추상클래스로 만들었을때 개발하는 사람을 그것을 받아 새로 개발하는 곳에는 상속만하고 새로운 특성만을 작성하면된다. 프로젝트를 총괄하는 설계자 역시 전체적인 틀을 짠 후 프로그래머들에게 개발을 지시 했을 때 더욱 편하게 지시할수 있다. 큰 규격이 정해져있으니 프로그래머들역시 크게 설계자의 의도와 벗어나지 않고 작업을 할 수 있을 것이기 때문이다.
자동차를 만드는 공장이라고 생각을 해보자 A 자동차를 만든다고 했을때 규격도 틀도 없이 작업을 지시한다면??
작업자 개개인의 마음대로인 규격으로 작업시간도 오래걸린다. 하지만 정해진 규격으로 만들어지 틀이 있다면??
새로운 부분만 추가하면 될 뿐 이다. 이 틀이 추상클래스 이다.
사실 이건 추상 클래스의 장점이라기 보다는 앞에서 봤던 상속의 장점이다. 그만큼 중요하다는 이야기 이겠죠?
추상클래스 선언은 간단하다. 보통의 클래스 만드는 법에서 class 의 앞에 abstract를 붙이는것.
public abstract class 클래스{
///필드
//// 생성자
///// 메소드
}
이런 모양으로 만든다 전체적인 사용법은 보통의 클래스와 같고 자신의 객체는 new연산자로 생성할 수 없다.
추상메소드 오버라이딩
지난번에 오버라이딩에 대해 배웠다 상속받은 부모클래스의 메소드를 자식메소드에서 재정의 해서 새로은 값을 출력 할 수 있도록 하는 것이 재정의 이다.
일단 이것은 원래 부모의 출력값이 있었지만 자식에서 재정의, 새로 써서 새로운 값을 출력해 내는것이다.
추상클래스는 자식의 멤버를 통일 시키기 위해 사용된다. 그런데 만약 값이 들어가 있다면??
예를 들어 보자 Aniaml이라는 추상 클래스가 있다. 이 추상 클래스를 상속받아 Dog와 Cat이라는 실체 클래스를 만든다고 하자 Aniaml클래스에 Sound메소드가 있고 그 안에 "우우우"라는 값이 있다면? 세상의 모든 동물들이 "우우우"라는 소리를 내면 괜찮지만 모든 동물의 소리는 다양하다. 그러면 Sound메소드는 실체 메소드에서 따로 만들어야 할까? 실체 메소드에 각각 작성하게 한다면 시간도 길어지고 깜빡 쓰지 않고 넘어 가는 일도 있을것이다.
이때 쓰는게 추상메소드이다. 추상 클래스는 메소드의 실행 내용없이 메소드를 만들수가 있는데 이 메소드가 있다면 하위 클래스 즉 실체클래스에서 이 메소드의 실행 부분을 꼭 작성하고 넘어가야한다. 그리고 그 메소드가 바로 추상메소드이다. 추상메소드는 하위 클래스에서 실행부분이 작성되지않으면 컴파일에러가 발생한다.
선언 방법
public abstract 리턴타입 메소드명(매개변수1,,,,,,,);
메소드 이름 앞에 추상클래스와 마찬가지로 abstract를 붙이고 실행부분인{..}가없다.
사용하는 예를 들어보자
public abstract class Animal{
public abstract void sound();
}
public class Dog extends Animal{
@Override
public void sound(){
System.out.println("멍멍");
};
}
이런식으로 쓴다.
'Java' 카테고리의 다른 글
인터페이스(Interface)2 (1) | 2018.12.31 |
---|---|
인터페이스 (Interface) (0) | 2018.12.29 |
강제타입변환 Casting 및 몇가지 (0) | 2018.12.22 |
매개변수의 다형성 (0) | 2018.12.21 |
배열로 객체관리하기 (0) | 2018.12.21 |