본문 바로가기
Java

추상 클래스 ( Abstract Class ) / 인터페이스 ( Interface )

by KDW999 2023. 1. 10.

추상 클래스

ㅡ 클래스를 설계도라고 하면 추상 클래스는 미완성 설계도

ㅡ 추상 클래스는 인스턴스 생성 X, 상속을 통해 하위 클래스에서만 완성

ㅡ 추상 메서드를 포함하는 것 말곤 일반 클래스와 유사함

 

abstract class 클래스 명 { } ← 이렇게 생성

 

추상화 : 클래스 간의 공통점을 찾아내서 공통 상위 클래스 만드는 작업

구체화 : 상속을 통해 클래스 구현 [ 확장 ]

 

*추상 클래스를 상속한 클래스는 추상 클래스의 메서드를 작성해줘야 한다.

추상 메서드

ㅡ 선언부만 작성, 구현부는 작성하지 않는다.

ㅡ 하위 클래스에서 구현부를 작성한다

 

abstract class Animal {
    String arms;
    String legs;

    abstract void eat(); // {} 코드 블럭은 적지 않는다.
}

class Chicken extends Animal {
    String tails;
    
    void eat(){
       System.out.println("밥 먹기");
    }
}

public class Abstract {
	public static void main(String[] args) {
//		Animal animal = new Animal(); 추상 클래스는 인스턴스 생성이 안됨 / 정해진 값이 없기에
        Chicken ch = new Chicken();
        ch.eat();
	
	}
}

 


인터페이스

ㅡ 추상 클래스의 일종

ㅡ 추상 클래스보다 추상화의 정도가 높기에 일반 메서드, 일반 멤버 변수를 선언할 수 없음

ㅡ class 대신 interface를 붙인다.

 

class 클래스명 → interface 인터페이스명

 

* 인터페이스에 작성된 추상 메서드는 구현한 클래스에서 작성해줘야 한다.

 

*제약

1. 모든 멤버 변수는 public static final이어야 하며, 생략 X

2. 모든 메서드는 public abstract이어야 하며, 생략 O ( jdk 8버전부터 생략 가능하며 static, default 메서드도 가능하다는 것 같다 ) 

    abstract과 static를 같이 사용하면 abstract, static, default 중 하나만 사용하라는 문구가 뜬다.

 

인터페이스는 기존의 상속관 다르게 다중 상속이 가능하다 / 인터페이스 상속은 인터페이스만 가능

interface Captain {
    void Attack();
}

interface Pirate{
    void Clean();
}

interface Pirate2 extends Pirate, Captain {}

 

인터페이스 구현

인터페이스도  그 자체로 인스턴스를 생성할 순 없다.

인터페이스를 구현한 클래스에서 인스턴스 생성이 가능하다.

 

class 클래스명 implements 인터페이스명 {

        인터페이스명 참조변수 = new 클래스명(); 

}

이런 느낌?

 

public interface IExample01 {
	
	// 인터페이스에는 static final로 선언된 상수만 선언 가능
	public static final int NUMBER = 0;

	// 인터페이스에는 추상메서드만 선언 가능, public abstract 생략한 상태?
	void hello();
}

class Example implements IExample01{
	
	IExample01 ex = new Example();
	
	// 인터페이스에 작성된 추상 메서드는 반드시 = 추상 클래스도 마찬가지
	// 모두 구현 해야함
	public void hello() {
          System.out.println("하이");		
	}
}

댓글