JAVA/객체 지향 프로그래밍

추상 클래스와 인터페이스

나주나주 2023. 12. 28. 15:49

추상 (abstract)

:실체간의 공통되는 특성을 추출한 것

 

추상 클래스

1. abstract를 사용해 선언

2. 추상 클래스는 new 생성자를 이용해 인스턴스화 할 수 없다. 대신, 자식 객체(실체 클래스)를 통해(extends) 생성 된다.

 

추상 메서드

실행 블록 { } 이 없다.

 

 

인터페이스

: 객체의 사용 설명서, 객체 생성 불가,컴파일러(javac.exe)를 통해 .class형태로 컴파일 되기 때문에 물리적인 형태는 클래스와 동일

//상수      (다양화를 위해 인터페이스는 데이터를 저장할 수 없다 BUT 상수 필드는 정적 필드이므로...)
//메서드    (public이 생략되어 있다)

 

장점

1. 객체의 교환성을 높여준다

2. 객체마다 실행 내용과 리턴값이 달라 코드 변경 없이 코드 다양화 

 

 

상수

초기값 필수

대문자와 underLine ( _ )을 사용하여 작명

public static final 생략 가능

 

메서드

1.추상 메서드

abstract 생략 가능

 

2. default 메서드

인터페이스에 선언된 인스턴스 메서드이기 때문에 구현 객체(자식 클래스)가 있어야 사용 가능

 

3. 정적 메서드

객체 생성 없이 인터페이스만으로 호출 가능

정적 메서드는 public을 가지고 있다

 

 

구현 클래스

public 생략 시 오류 발생

→ 구현 클래스에서 인터페이스의 추상 메서드들에 대한 실체 메서드를 작성할 때 모든 메서드는 public을 가지고 있기 때문에, public보다 낮은 접근 제한(ex) default)으로 설정 불가

 

익명 구현 클래스

package ch10.interface_exam;

public class AnonymousExam {
	public static void main(String[] args) {
		// 인터페이스로 Guest 객체(익명, 일회성) 생성하기 (구현 클래스 사용 X)
		// {}; (필수)
		
		//인터페이스에 선언된 추상 메서드를 실체 메서드로 작성
		//추가적인 필드와 메서드 선언 가능하나 게스트 객체 안에서만 사용 가능
		
		RemoteControl rc = new RemoteControl() {
			
			@Override
			public void turnOn() {
				System.out.println("전원을 켭니다.");
			}
			
			@Override
			public void turnOff() {
				System.out.println("전원을 끕니다.");
			}
			
			@Override
			public void setVolume(int volume) {
				System.out.println("현재 볼륨: " + volume);
			}
			
		};
		rc.turnOn(); //main() 안에서 실행 가능
		rc.turnOff();
		rc.setVolume(5);
	}
    //구현 클래스를 만들어 사용하는 것이 일반적이고, 클래스를 재사용 할 수 있어 편리하다.
    //그러나 일회성의 구현 객체를 만들기 위해 소스파일을 만들고 클래스를 선언하는 것은 비효율적이다.
}

 

다중 인터페이스 구현 클래스

public class 구현클래스명 implements 인터페이스A, 인터페이스B

 

 

인터페이스의 매개변수 활용

public interface Vehicle {
	public abstract void run(String name);
}
public class Bus implements Vehicle { //구현 클래스
	String vehicleName = "버스";
	@Override
    public void run(String name) {
		System.out.println(vehicleName + "가 달립니다.);
       }
}
public class Taxi implements Vehicle { //구현 클래스
	String vehicleName = "택시";
	@Override
    public void run(String name) {
		System.out.println(vehicleName + "가 달립니다.);
       }
}
public class Driver {
	String name;
	public void drive(Vehicle vc) { //인터페이스(public)를 매개변수로 선언
    vc.run(name);
    }
}
public class DriverExam {
	public static void main(String[] args) {
		Vehicle temp = null; // 임시값
		Scanner in = new Scanner(System.in);
		Driver driver = new Driver();
		System.out.println("기사님, 어떤 차량을 운전하시겠어요?");
		System.out.println("[1] 버스  [2] 택시");
		int select = in.nextInt();
		if (select == 1)
			temp = new Bus();
		if (select == 2)
			temp = new Taxi();
            
        driver.drive(temp);    
	}
}

→  Bus와 Taxi의 메서드 선언부(signature, 호출방법)가 동일하므로, 인터페이스를 매개변수로 선언하면, 유지보수 시에 객체 생성 부분만 수정하면 된다! 

 

인터페이스 상속

public interface 하위인터페이스 extends 상위인터페이스1, 상위인터페이스2

 

 

마치며...

다형성(하나의 타입에 대입되는 객체에 따라 다양한 실행 결과가 나온다)은 인터페이스를 통해 구현하는 경우가 많다.

상속: 같은 종류의 하위 클래스를 만듦
인터페이스: 사용 방법이 동일한 클래스를 만듦

 

Tip) this == 필드의 값을 가져옴

'JAVA > 객체 지향 프로그래밍' 카테고리의 다른 글

상속과 다형성  (0) 2023.12.27