본문 바로가기

자바(JAVA)
[자바(Java)] 추상 클래스, 인터페이스

// 추상 클래스 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