KEEP GOING

[JAVA] 추상화 : 추상 클래스와 인터페이스 본문

language/java

[JAVA] 추상화 : 추상 클래스와 인터페이스

jmHan 2022. 5. 31. 15:43
반응형

객체지향 프로그래밍의 특징인 추상화를 대표하는 기능으로 추상 클래스와 인터페이스가 있다.

 

추상화 

- 클래스간의 공통점을 찾아 공통의 조상(클래스)를 만드는 작업

 

추상 클래스(abstract class)

- 미완성 설계도 

- 생성자 그리고 일반 메서드멤버변수를 가지지만 추상 메서드를 포함하고 있는 클래스 

- 추상 클래스는 반드시 상속받은 자식 클래스에서 추상 메서드를 구현해야 한다. 

- 추상 클래스는 추상 메서드를 가지므로 인스턴스를 생성할 수 없다. 

- 추상 메서드에 abstract를 붙이는 이유는 반드시 해당 메서드를 자식 클래스에서 구현하도록 하기 위함이다. 

 

[추상 클래스 작성] 

abstract class 추상클래스{
	...
}

 

- 추상 메서드는 선언부(함수명, 매개변수, 리턴 타입)만 정의하고 구현부를 정의하지 않은 채 남겨둔다.

- 구현부를 정의하지 않는 이유는 자식 클래스마다 메서드 내용을 다르게 구현하기 위해서이다.

- 구현부가 없기 때문에 괄호 {}가 없다. 

 

[추상 메서드 작성]

abstract 리턴타입 추상메서드명();

 

[예시]

abstract class Car { 
    abstract void run();
}

public class Hyundai extends Car { 
    void run() { 
        System.out.println("부왕!"); 
    }
}

public class Audi extends Car { 
    void run() { 
        System.out.println("부릉~"); 
    } 
}

public class CarExam {
	public static void main(String[] args) {
        // Car c = new Car(); // 추상 클래스는 인스턴스를 생성할 수 없음.
        Hyundai c1 = new Hyundai();
        Audi c2 = new Audi();
        
        c1.run();
        c2.run();
    }
}

 

인터페이스(interface)

- 기본 설계도

- 추상 메서드와 달리 일반 메서드나 멤버 변수를 가질 수 없고 상수와 추상 메서드만 멤버로 가질 수 있다.

(추상 클래스보다 인터페이스가 추상화 정도가 더 높다)

- 키워드로 class 대신 interface를 사용한다.

 

[인터페이스 작성]

interface 인터페이스명{
    public static final 상수명 = 값;
    public abstract 추상메서드명();
}

- 상속이 아닌 구현이라는 용어를 사용한다.

- 모든 멤버변수는 public static final 이어야 하고, 이를 생략할 수 있다.

- 모든 메서드는 public abstract 이어야 하고, 이를 생략할 수 있다.

- 인터페이스는 인터페이스로부터만 상속(extends)받을 수 있고 여러 개의 인터페이스를 상속받을 수 있다.

(다중 상속)

 

  • final

'최종'이라는 뜻을 가진 final 키워드는 필드, 지역 변수, 클래스 앞에 위치할 수 있다.

클래스 앞인 경우 변경∙확장∙상속 불가, 메서드 앞인 경우는 오버라이딩 불가, 변수 앞인 경우는 값 변경이 불가하다.

final class Final {
    final int a = 100;
   
   final void run() {
   	final int x = 3;
       return x;
    }
}

Final 클래스는 변경∙확장∙상속이 안 되고, int a는 변경할 수 없고, run() 메서드는 오버라이딩이 불가하다.

 

[인터페이스 상속]

interface 인터페이스명 extends 인터페이스1, 인터페이스2{
	...
}

 

[인터페이스 구현]

class 클래스명 implements 인터페이스명{
	// 인터페이스에 구현된 추상 클래스를 구현해야 한다.
    ...
}

- 인터페이스를 구현할 때 인터페이스의 추상 메서드 중 일부만 구현할 경우 

  abstract 키워드를 붙여서 추상 클래스로 선언해야 한다. 

abstract class 클래스명 implements 인터페이스명 { ...}

- 상속(extends)과 구현(implements)을 동시에 할 수 있다. 

 

 

[예시]

public interface Dog {
	public int age = 4;
	public void bark();
	// public void sleep() {}; // 불가능
}

public class Chiwawa implements Dog{
	public void bark() {
		System.out.println("와르르!");
	}
}

public class Poodle implements Dog{
	public void bark() {
		System.out.println("멍멍!");
	}
}
반응형
Comments