본문 바로가기

java,jsp,spring/java

java 추상클래스, 인터페이스

추상 클래스

  • 실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스
  • 객체 생성을 하지 못함
  • 종류 : 추상 메소드 포함 / 미포함
  • 상속

1. 단순 상속 : 추상클래스를 상속 받고 추상 메소드를 오버라이딩하지 않으면 서브클래스에도 abstract를 붙여야함

2. 구현 상속

abstract class Calculator {
	public abstract int add(int a, int b);
	public abstract int subtract(int a, int b);
	public abstract double average(int[] a);
}

public class GoodCalc extends Calculator{
	@Override // annotation: 시스템 주석
	public int add(int a, int b) {
		return a+b;
	}
	@Override
	public int subtract(int a, int b) {
		return a-b;
	}
	@Override
	public double average(int[] a) {
		double sum = 0;
		for (int i = 0; i < a.length; i++) {
			sum += a[i];
		}
		return sum/a.length;
	}
	public static void main(String[] args) {
		GoodCalc c = new GoodCalc();
		System.out.println(c.add(2, 3));
		System.out.println(c.subtract(2, 3));
		System.out.println(c.average(new int[] {2,3,4}));
	}
}

인터페이스

  • 인터페이스는 다중 상속 가능
  • 추상 클래스와 같이 객체 생성 불가능
  • 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있음 > 다형성
  • 인터페이스끼리의 상속은 extends로 하며 다중 상속이 됨 클래스가 상속 받을 때는 implements로 함
  • 인터페이스에 선언된 모든 메서드는 public abstract로 선언되며 생략가능 **필드(영역)**는 public static final로 선언되며 생략가능
추가된 기능 사용
default 구현부 사용 가능, 오버라이딩 가능
static 오버라이딩 불가, 클래스명으로 호출 해야함
private 자바 9부터 사용 가능, private (static) method() {}> 멤버들의 접근지정자가 public이어야하는 한계를 벗어나기 위해 만들어짐, 구현부가 있어 abstract는 선언 불가능
interface PhoneInterface2{
	final int TIMEOUT = 100;
	void sendCall();
	void receiveCall();
	default void printLogo() {
		System.out.println("** Phone **");
	} // default 메소드는 구현부 사용 가능
}
interface MobilePhoneInterface extends PhoneInterface2{
	void sendSMS();
	void receiveSMS();
}
interface MP3Interface{
	public void play();
	public void stop();
}
class PDA{
	public int calculate(int x, int y) {
		return x+y;
	}
}
class SamsungPhone2 extends PDA implements MobilePhoneInterface, MP3Interface {
	public void sendCall() {
		System.out.println("띠리리리링");
	}
	public void receiveCall() {
		System.out.println("전화가 왔습니다.");
	}
	public void flash() {
		System.out.println("전화기에 불이 켜졌습니다.");
	}
	public void play() {
		System.out.println("음악 연주합니다.");
	}
	public void stop() {
		System.out.println("음악 중단합니다.");
	}
	public void sendSMS() {
		System.out.println("문자 발신");
	}
	public void receiveSMS() {
		System.out.println("문자 수신");
	}
	public void schedule( ) {
		System.out.println("일정 관리합니다.");
	}
}
public class InterfaceEx2 {
	public static void main(String[] args) {
		SamsungPhone2 phone = new SamsungPhone2();
		phone.printLogo();
		phone.sendCall();
		phone.receiveCall();
		phone.flash();
		phone.play();
		phone.schedule();
		System.out.println("3과 5를 더하면 "+phone.calculate(3, 5));
	}
}​

내부 클래스

  • 클래스 안의 다른 클래스 정의
  • 특정 멤버 변수를 private로 유지하면서 자유롭게 사용 가능
  • 특정한 곳에서만 사용되는 클래스들을 모을 수 있음
  • 유지 보수가 쉬워짐
class OuterClass{
//	private String secret = "Time is money"; // 내부 클래스에서는 접근 가능
	public String secret = "Time is money";
	public OuterClass() {
		InnerClass obj = new InnerClass(); // 외부 클래스에서는 생성 가능
		obj.method();
	}
	private class InnerClass{
		public InnerClass() {
			System.out.println("내부 클래스의 생성자입니다.");
		}
		public void method() {
			System.out.println(secret);
		}
	}
}
public class OuterClassTest {
	public static void main(String[] args) {
		OuterClass o = new OuterClass(); 
//		new InnerClass();// 접근 지정자와 상관없이 내부클래스는 객체 생성 불가
	}
}

무명 클래스

  • 클래스 몸체는 정의되지만 이름은 없는 클래스
  • 하나의 객체만 생성하면 되는 경우 사용
  • 클래스 정의하면서 객체 생성

new ClassOrInterface(){클래스 몸체}
ClassOrInterface : 부모 클래스 이름이나 인터페이스 이름

interface RemoteControl {
	void turnOn();
	void turnOff();
}
public class AnonymousClassTest {
	public static void main(String[] args) {
//		new RemoteControl(); // 인터페이스는 객체 생성 불가능
		RemoteControl rc = new RemoteControl() { // 무명클래스
			@Override
			public void turnOn() {
				System.out.println("TV turnOn()");
			}
			@Override
			public void turnOff() {
				System.out.println("TV turnOff()");
			}
		};
		rc.turnOn();
		rc.turnOff();
	}
}

'java,jsp,spring > java' 카테고리의 다른 글

java 스레드, 메모리 사용 영역  (1) 2022.08.01
java 패키지  (0) 2022.08.01
java 상속  (0) 2022.07.31
java 접근 지정자, static  (0) 2022.07.25
java 객체 배열 등  (0) 2022.07.25