[Java] 자바의 인터페이스(interface)와 추상클래스(abstract class)


♦ 자바의 인터페이스와 추상클래스
상속은 객체지향 프로그래밍의 핵심이다. 상속을 적용하면 코드의 재사용 및 다형성, 메소드 오버라이딩을 통해서 객체지향적인 프로그램을 개발할 수 있다. 하지만 상속을 적용시켜도 하위 클래스에서 부모의 메소드를 상속받아서 사용하지 않고 개발한다면 상속의 장점을 얻을 수 없다.

상속은 강제성이 없기 때문이다. 따라서 객체지향적인 프로그램 개발을 위해서 반드시 부모클래스의 메소드를 사용하도록 강제할 필요성이 등장하게 되는데 이를 해결할 수 있는 것이 바로 인터페이스와 추상클래스이다.

인터페이스(interface)
인터페이스의 특징
확장자는 java 이다.
구성요소는 상수 및 추상 메소드(abstract method)만 가질 수 있다. 상수는 public static final 키워드를 사용하며 추상 메소드는 구현되지 않고 ;(세미콜론)으로 끝난다. abstract 키워드는 생략 가능하다.
추상 메소드를 가지고 있기 때문에 객체생성이 불가능하다. 인터페이스를 사용하기 위해서는 implements 키워드를 이용해서 일반 클래스가 인터페이스를 구현한다. 인터페이스를 구현한 클래스는 반드시 추상메소드를 오버라이딩 규칙에 따라 구현해야 한다.
클래스는 단일 상속만 지원되지만 인터페이스는 다중 구현을 지원한다.
인터페이스 간에도 extends 키워드를 사용하여 상속이 가능하며 단일 상속이 아닌 다중 상속을 지원한다.
객체 생성은 불가능하지만 변수의 데이터 형으로 사용할 수 있다.
강제성과 통일성을 부과한다.

인터페이스 형식

public interface 인터페이스명 {
	public static final String name = "정대만";  // 상수

	public abstract String getName();  // 추상 메소드
}

 

인터페이스 사용예

interface Student{
	public abstract void getInfo();
}

class Middle implements Student{
	public void getInfo(){System.out.println("중학생 입니다.");}
}
class High implements Student{
	public void getInfo(){System.out.println("고등학생 입니다.");}
}
class College  implements Student{
	public void getInfo(){System.out.println("대학생 입니다.");}
}

public class Test01 {
	public static void main(String[] args) {
		Student middle = new Middle();
		Student high = new High();
		Student college = new College();
		
		middle.getInfo();
		high.getInfo();
		college.getInfo();
	}
}

 

추상클래스(abstract class)
추상클래스의 구성요소
인스턴스 변수
생성자
일반 메소드
추상메소드

추상클래스 형식

public abstract class 클래스명 {
	인스턴스 변수
        생성자
	일반 메소드
        추상 메소드
}

 

추상클래스의 특징
추상메소드를 포함할 수 있기 때문에 객체생성이 불가능하다. 추상 클래스를 사용하기 위해서 일반 클래스를 이용한다. extends 키워드를 이용하여 추상클래스를 상속받고 추상 메소드가 존재하면 오버라이딩 규칙에 따라 구현한다.
추상클래스도 클래스이기 때문에 단일상속만 지원된다.
객체 생성은 불가능하지만 변수의 데이터형으로 사용이 가능하다.
강제성과 통일성을 제공한다.
하위 클래스에게 전체 메소드가 아닌 특정 메소드만 강제할 경우에 사용한다.

추상클래스 사용예

abstract class Student {
	public abstract void getInfo();	// 하위 클래스에서 반드시 구현
	public void school() {System.out.println("학교에 갑니다.");}
}

class Middle extends Student{
	public void getInfo(){System.out.println("중학생 입니다.");}
}
class High extends Student{
	public void getInfo(){System.out.println("고등학생 입니다.");}
}
class College extends Student{
	public void getInfo(){System.out.println("대학생 입니다.");}
	public void school() {System.out.println("대학교에 갑니다.");}
}

public class Test01 {
	public static void main(String[] args) {
		Student middle = new Middle();
		Student high = new High();
		Student college = new College();
		
		middle.getInfo();
		high.getInfo();
		high.school();
		college.getInfo();
		college.school();
	}
}

 

답글 남기기