Java(추상클래스, 인터페이스)

2023. 3. 9. 01:57WEB개발/TIL

반응형

추상클래스

: 하나 이상의 추상 메서드를 포함하는 클래스

참고) 추상 메서드 없이도 abstract키워드를 붙여 추상클래스 생성 가능

 

추상메서드

: 선언은 되어 있으나 구현이 되어있지 않은 메서드

따라서, 추상 클래스를 상속받는 서브클래스에서 추상 메서드를 오버라이딩 해줘야 함

 

추상클래스 사용 이유

: 설계와 구현 분리를 위함

  • 슈퍼(부모) 클래스에서 설계: 개념 정의
  • 서브(자식) 클래스에서 구현: 구체적 행위 구현

 

추상클래스 예시)

// 추상클래스(슈퍼클래스)
public abstract class Abstract {
	public int num;
	public void test1() {};

	// 추상메서드
	public abstract void test(); // 설계
}

// 서브클래스
public class Sub_Abstract extends Abstract {
	// 추상메서드 오버라이딩
	public void test() {
		// 구현
	}
}

// Main클래스
public class Main_Abstract {
	public static void main(String[] args) {
		Abstract a = new Abstract(); // 에러 발생
		Sub_Abstract s = new Sub_Abstract(); // 에러X
	}
}
  • 추상클래스는 객체 생성 불가
  • 추상클래스를 상속 받는 서브클래스는 기본적으로 추상클래스가 됨

    => 서브클래스는 슈퍼클래스에서 정의된 필드와 메서드를 모두 물려받기 때문

  • 서브클래스를 객체로 만들고 싶은 경우(=일반클래스가 되려면), 부모클래스의 모든 추상메서드를 구현해야 함

 

 


인터페이스

: 추상 메서드의 모음

여러 구현체(=서브 클래스)에서 공통적인 부분을 추상화하는 역할

= 서브 클래스가 같은 동작을 한다는 것을 보장하기 위해 사용

 

예시)

인터페이스: phone

서브클래스: samsung, iphone

  • 휴대폰 공통 기능: sendCall, receiveCall, sendMessage, receiveMessage
// Phone 인터페이스
public interface Phone {
	void sendCall();
	void receiveCall();
	void sendMessage();
	void receiveMessage();
}

// Samsung 서브클래스
public class Samsung implements Phone {
	@Override
	public void sendCall() {
		System.out.println("따르릉따르릉");
	};
	public void receiveCall() {
		System.out.println("전화가 왔습니다!");
	};
	public void sendMessage() {
		System.out.println("또롱");
	};
	public void receiveMessage() {
		System.out.println("문자가 왔습니다!");
	};
}

// Iphone 서브클래스
public class Iphone implements Phone {
	@Override
	public void sendCall() {
		System.out.println("뚜둥뚜둥");
	};
	@Override
	public void receiveCall() {
		System.out.println("전화를 받으세요!");
	};
	@Override
	public void sendMessage() {
		System.out.println("슈웅");
	};
	@Override
	public void receiveMessage() {
		System.out.println("문자를 확인하세요!");
	};
}
// Main 클래스
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Phone phone = null;
		System.out.println("휴대폰 기종이 무엇인가요? -알파벳 소문자로 작성-");
		Scanner scanner = new Scanner(System.in);
		String model = scanner.next();
		if (model.equals("samsung")) phone = new Samsung();
		else if (model.equals("iphone")) phone = new Iphone();
		else System.out.println("연결 실패");
        	// samsung, iphone 이외 문자 작성, "연결 실패"
		
		if (phone != null) {
			phone.sendCall();
			// samsung으로 작성, "따르릉따르릉"
			// iphone으로 작성, "뚜둥뚜둥"
			phone.sendMessage();
			// samsung으로 작성, "또롱"
			// iphone으로 작성, "슈웅"
		}

	}
}

 

추상클래스와 다른점?

1) 추상메서드의 유무

추상클래스: 추상메서드가 없어도 상관없음

인터페이스: 추상메서드 무조건 있어야 함

 

2) 필드(=변수) 선언, 메서드 구현

추상클래스: 필드(변수) 선언 및 메서드 구현 가능

인터페이스: 필드(변수) 선언 불가(예외, public 상수 선언 가능-final 키워드 사용-)

 

3) 일반클래스로의 변환

추상클래스의 서브클래스는 추상클래스로 남는 것 or 일반클래스로 변환하는 것 모두 가능

인터페이스의 서브클래스는 무조건 일반클래스로 변환되어야 함

이유) 서브클래스는 인터페이스의 모든 추상메서드를 반드시 구현해야 하기 때문

 

인터페이스 문법

1) 변수 선언 불가, 상수 선언 가능

// Interface
public interface Interface {
	public int num; // 필드(변수) 선언 불가
	public final int num = 1; // 상수 선언 가능
	int num2 = 2; // public final 생략 가능

	public abstract void test(); 
	void test1(int num); // public abstract 생략 가능
}

// Interface의 서브클래스
public class Sub_Interface implements Interface {
	@Override // 오버라이드 메서드 위에 작성
	public void test() {
		
	};
	@Override
	public void test1(int num) {
		
	};
}

 

2) 다중 상속 가능

: 클래스가 동시에 두 개 이상의 클래스를 상속받는 것

// 다중상속 가능
public class Sub_Interface implements Interface, InterfaceTest {
	@Override
	public void test() {
		
	};
	@Override
	public void test1(int num) {
		
	};
	@Override
	public int test2() {
		return 0;
	};
}
반응형

'WEB개발 > TIL' 카테고리의 다른 글

REST API  (0) 2023.03.21
Spring 정의, Spring Boot, Thymeleaf 문법  (0) 2023.03.21
Java(클래스의 상속)  (1) 2023.03.06
Java(Array, Class)  (0) 2023.03.06
Java(개발환경구축, 프로젝트 생성, 기본 문법)  (0) 2023.03.06