티스토리 뷰
자바에는 "추상 클래스"라는 것이 존재한다.
미완성된 메소드를 하나 이상 포함하는 클래스를 추상 클래스라 하는데, 이때 미완성된 클래스를 "추상 메소드" 라고 한다.
추상 클래스의 특징에는 다음과 같은 것들이 있다.
[ 추상 클래스 (Abstract Class) ]
- class 예약어 앞에 abstract를 명시해서 클래스를 정의한다.
- 형태만 정의되고 실제 구현은 되지 않은 메소드가 존재할 수 있다.
- 형태만 정의된 메소드를 만들 때는 abstract 예약어를 붙여 메소드를 정의한다.
- 생성자는 존재하지만 단독으로 객체 생성은 불가능하다.
- 추상클래스 Type의 id가 필요하다면 추상 클래스를 상속받은 자식클래스를 정의해서 객체를 생성한다.
- 추상클래스를 상속받은 자식클래스는 부모의 추상 메소드를 모두 Override(재정의)해야 한다.
예시를 통해 쉽게 접근해보자.
1. "추상클래스도 데이터 type 역할을 할 수 있다!"
Weapon.java - 추상 메소드 attack()을 가진 추상 클래스 Weapon
package test.mypac;
//미완성된 추상 메소드를 클래스의 멤버로 가지려면 abstract 예약어를 클래스에 명시해야 한다.
public abstract class Weapon {
public void prepare() {
System.out.println("무기 작동을 준비 합니다.");
}
//미완성된 추상 메소드를 만들 때는 abstract 예약어를 메소드에 명시해야 한다.
public abstract void attack();
}
Weapon 클래스는 prepare() 메소드와 추상 메소드인 attack()을 가진다.
attack()은 추상 메소드 이므로 abstract 예약어를 명시해야 한다.
위의 추상 클래스에 대한 설명에서, 하나 이상의 추상 메소드를 가지는 클래스는 추상 클래스라 했으므로 abstracct 예약어를 클래스에 명시해야 한다.
따라서, Weapon은 추상 클래스이다.
MainClass01.java - 추상 클래스 단독 객체 생성 불가
package test.main;
import test.mypac.Weapon;
public class MainClass01{
public static void mian(String[] agrs){
Weapon w1 = null;
//Weapon 추상 클래스로 객체가 생성될까?
//Weapon w2 = new Weapon(); //추상 클래스 단독 객체 생성 불가
}
}
추상 클래스인 Weapon으로 객체를 생성하려했지만 오류가 떴다.
위의 추상클래스에 대한 설명에서, 추상 클래스의 단독 객체 생성은 불가하다고 되어 있었다.
또한, 추상클래스 type이 필요하다면 자식 클래스에서 override로 추상 메소드를 재정의하고 자식 메소드 객체를 생성하여 추상클래스 type 변수에 담으라고 되어있다.
그러면 Weapon을 상속받은 MyWeapon클래스를 만들어보자!
MyWeapon.java - Weapon 클래스를 상속받은 MyWeapon클래스
package test.mypac;
public class MyWeapon extends Weapon{
@Override
public void attack() {
System.out.println("원숭이를 공격해요~");
}
}
추상 클래스인 attack()을 Override해주었다.
이제 다시 MainClass01으로 돌아가보자.
MainClass01.java
package test.main;
import test.mypac.MyWeapon;
import test.mypac.Weapon;
public class MainClass01 {
public static void main(String[] args) {
//추상클래스도 데이터 type역할을 할 수 있다.
Weapon w1 = null;
//Weapon 추상 클래스로 객체가 생성될까?
//Weapon w2 = new Weapon();//추상클래스 단독으로 객체 생성 불가
//Weapon type이 필요하다면?
Weapon w2 = new MyWeapon();
w2.prepare();
w2.attack();
}
}
MyWeapon객체를 생성하여 Weapon타입 변수에 넣어주니 올바르게 실행되었다.
w2.attack()을 호출하면, MyWeapon에서 재정의한 attack()메소드를 호출하여 "원숭이를 공격해요!"가 출력되는 모습을 확인할 수 있다.
2. "추상 클래스의 자식 클래스에 강제 Override한 메소드만 있다면 객체 생성에만 이용하고 data type으로 사용하지 않아도 된다."
문제
Weapon 추상클래스를 상속받는 클래스를 정의하고
해당 클래스를 활용해서 아래의 useWeapon() 메소드를 호출해보세요.
MainClass02.java
package test.main;
import test.mypac.Gun;
import test.mypac.Weapon;
public class MainClass02 {
public static void main(String[] args) {
/*
* 여러분이 직접 Weapon 추상클래스를 상속받아 클래스를 정의하고
* 해당 클래스를 활용해서
* 아래의 useWeapon() 메소드를 호출해보세요.
*/
}
//Weapon 추상클래스 type을 메소드의 인자로 전달받는 static 메소드
public static void useWeapon(Weapon w) {
w.prepare();
w.attack();
w.attack();
}
}
Solution.
1. Weapon을 상속받은 Gun클래스를 생성한다.
package test.mypac;
public class Gun extends Weapon{
}
2. 추상 메소드 attack()을 오버라이드한다.
package test.mypac;
public class Gun extends Weapon{
@Override
public void attack() {
System.out.println("총으로 무언가를 공격해요 빵빵~~");
}
//강제 Override한 메소드 외에 추가한 메소드는 없다.
}
3.-1 MainClass02에서 useWeapon은 static 메소드이다.
따라서, MainClass02.useWeapon()으로 호출할 수 있지만, 현재 MainClass02안이므로 그냥 useWeapon()으로 호출 가능하다.
인자로는 Weapon타입을 받으므로 다음 코드를 작성한다.
useWeapon(new Gun());
3-2. 3-1에서는 Gun타입 객체를 전달했는데, Gun클래스에는 강제 오버라이드한 메소드 외에 추가된 메소드가 없다.
따라서, Gun 클래스는 객체를 생성하는데 사용되고 type으로는 사용하지 않아도 된다.
그러므로, Weapon타입의 지역변수에 담아 인자로 전달할 수 있다.
Weapon g = new Gun();
useWeapon(g);
전체 코드
MainClass02.java
package test.main;
import test.mypac.Gun;
import test.mypac.SampleWeapon;
import test.mypac.Weapon;
public class MainClass02 {
public static void main(String[] args) {
/*
* 여러분이 직접 Weapon 추상클래스를 상속받아 클래스를 정의하고
* 해당 클래스를 활용해서
* 아래의 useWeapon() 메소드를 호출해보세요.
*/
MainClass02.useWeapon(new Gun());
//Gun 클래스는 객체를 생성되는데 사용되고 type으로는 사용하지 않아도 된다!
Weapon g = new Gun();
MainClass02.useWeapon(g);
}
//Weapon 추상클래스 type을 메소드의 인자로 전달받는 static 메소드
public static void useWeapon(Weapon w) {
w.prepare();
w.attack();
w.attack();
}
}
다음 게시물에서 추상 클래스에 대해 더 알아보도록 하겠다.
'development > Java' 카테고리의 다른 글
[Java] 인터페이스 Interface / 함수형 인터페이스 FuntionalInterface, 람다식 (0) | 2021.11.08 |
---|---|
[Java] 추상 클래스 Abstract Class #2 / 내부 클래스 inner class, 로컬 내부 클래스 local inner class, 익명의 클래스 (0) | 2021.11.07 |
[Java] final , static final (0) | 2021.11.07 |
[Java] 접근 지정자 / public, protected, default, private (0) | 2021.11.03 |
[Java] 상속 Inheritance #3 / 매개변수를 갖는 부모 클래스의 생성자 (0) | 2021.11.03 |
- Total
- Today
- Yesterday
- baekjoon
- Django
- python
- 백준
- brute force
- R
- web
- 단계별로풀어보기
- jsp
- jQuery
- 스프링
- javascript
- 장고
- 정렬
- 큐
- Case When
- 자바
- 고득점 키트
- CSS
- 문자열
- Java
- 프로그래머스
- append
- Oracle
- 자바스크립트
- 덱
- 브루트 포스
- html
- bootstrap
- 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |