// 추상 클래스 vs 일반 클래스
- 추상 클래스는 일반 클래스를 가질 수 없다. (객체를 생성할 수 없다.)
추상 클래스 | 일반 클래스 | |
일반 필드 | O | O |
static final 필드 | O | O |
추상 메서드 | O | X |
일반 메서드 | O | O |
직접적으로 객체 생성 | 불가능 | 가능 |
상속을 통해 객체 생성 | 가능 | 가능 |
- 일반클래스가 추상 클래스가 되는 방법 2가지
1. abstact 키워드가 붙으면 추상 클래스가 된다.
abstract class Test {
}
2. 추상 메서드가 포함된 클래스는 추상 클래스가 된다.
~ 추상 메서드 : 정의를 내리지 않고(블럭문{} 없이) 메서드만 사용하거나 앞에 abstract 키워드가 붙은 메서드
void();
abstact void a();
abstact void a(int speed);
- ★★추상 클래스는 상속을 통해 일반 클래스로 전환된다. (extends)
~ 상속 시 부모 클래스가 추상 메서드를 포함하고 있다면, 자식 클래스는 추상 메서드를 재정의(오버라이딩) 해주어야 한다.
package ex01.sample01;
abstract class Car { //추상 클래스
int speed = 0; //일반 변수
String color; // 참조 변수
void upSpeed(int speed) {
this.speed += speed; // this => 객체를 가리킴
}
}
class Sedan extends Car {} //추상 클래스를 상속 받아 일반 클래스가 됨
public class Exam1013 {
public static void main(String[] args) {
Sedan sedan1 = new Sedan();
System.out.println("승용차 인스턴스 생성");
}
}
package ex02.sample02;
abstract class Car1 {
int speed = 0;
String color;
void upSpeed(int speed) {
this.speed += speed;
}
abstract void work();
}
class Sedan1 extends Car1 {
void work() {
System.out.println("Sedan1은 사람을 태우고 있다.");
}
}
class Truck1 extends Car1 {
void work() {
System.out.println("Truck1은 짐을 싣고 있다.");
}
}
public class Exam1013_1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Sedan1 sedan = new Sedan1();
sedan.work();
Truck1 truck = new Truck1();
truck.work();
}
}
// 인터페이스
인터페이스 | |
일반 필드 | X |
static final 필드 | O |
추상 메서드 | O |
일반 메서드 | X |
- interface 인터페이스명 {}
- interface는 다중 상속을 위해 필요하다.
~ 상속 키워드(extends) 를 사용하지 않고 implements를 사용한다.
- 인터페이스 안에서는 어떤 것을 폐쇄형으로 선언할 수 없다.(private x)
- 변수를 가질 수 없다. (상수는 가능)
- 인터페이스는 추상 메서드를 멤버로 가진다. > ★★★추상 메서드 들의 집합
- 인터페이스는 구현 멤버를 가질 수 없다.
※구현 멤버 : 변수, 구현부를 가지는 메서드
- interface A implements B {}
~ A : 자식
~ B : 부모
- 클래스가 인터페이스를 상속 받아 구현해야 한다.
> 자식 클래스의 의무!
- 인터페이스를 상속한다는 표현보다는 구현한다는 표현을 주로 사용한다.
package ex03.sample03;
interface Car2 {
static final int CAR_COUNT = 0;
abstract void work();
}
class Sedan3 implements Car2 {
public void work() {
System.out.println("Sedan1은 사람을 태우고 있다.");
}
}
class Truck3 implements Car2 {
public void work() {
System.out.println("Truck3은 사람을 태우고 있다.");
}
}
public class Exam1013_2 {
public static void main(String[] args) {
Sedan3 sedan = new Sedan3();
sedan.work();
Truck3 truck = new Truck3();
truck.work();
}
}
'자바(JAVA)' 카테고리의 다른 글
[자바(Java)] 접근 지정자(제어자), Getter Setter (0) | 2022.10.18 |
---|---|
[자바(Java)] GUI (0) | 2022.10.13 |
이클립스 단축키 (0) | 2022.10.11 |
[자바(Java)] 상속 (0) | 2022.10.07 |
[자바(Java)] 선언, 리턴 (0) | 2022.10.06 |