본문 바로가기
JAVA/★객체지향

interface // (abstract와 비슷하다 차이점 구별해두자)

by SEOKIHOUSE 2023. 3. 13.
  1. interface: 어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시 메소드들을 구현해야하는데 그렇지 않다면 컴파일도 안된다!.

abstract:"하위클래스에서 상속하도록 오버라이딩 하도록 비어있는 내용의 abstract메소드 있지만

구체적인 메소드나 필드가 존재할 수 있는(오버라이딩)

interface : 구체적인 로직 interface안에 포함x 반드시 본체가 없는 메소드 들만

 

package practice0407;

abstract class A {
	int a;

	abstract void f();
}

class B extends A implements C {
	@Override
	public void f() {
		System.out.println("배고프다");
	}

	@Override
	public void ss() {
	}
}
interface C {
	void f();
	void ss();
}

public class Abstract {
	public static void main(String[] args) {
		C c = new B(); //인터페이스도 타입으로 존재가능함ㅇㅇ
		A a = new B();
//		A a1 = new A(); //추상 클래스를 상속받는 하위 클래스를 통해 객체를 생성하여 사용가능.
		a.f();
	}
}

 인터페이스도 타입으로 존재가 가능하다

  1. 인스턴스 생성 여부:  인터페이스를 구현한 클래스의 인스턴스를 생성하여 사용.
  2. 추상 클래스를 상속받는 하위 클래스를 통해 객체를 생성하여 사용.

 


2) 실질적인 쓰임~ 알아보자고!

상황 : 개발자 A는 계산기 만드는 작업을 하고 B는 계산기 사용하는 작업을 하기로 했는데 가짜 클래스를 만들어서 서로 코딩 후 3개월 뒤에 만났다.

 

아닛??! 왜 인자가 3개 하랬더니 2개야.... 오류났잖아 어뜩해 잉?

어.... 우리 그냥 인터페이스 도입합시다 !!! 

도입 후 

서로 합의해서 인터페이스를 만든다!

이런 형식으로 작성하세욧!!

return 60 20 -> 계산된 값이 아닌 임의의 값이 박혀있음



3) 인터페이스의 접근 제어자는 반드시 public!!!! ( 조작장치라 생각하면 된다)


자바에서 클래스를 상속할 때는 상속받는 클래스(하위클래스)는 하나의 부모클래스만 상속받을 수 있다

but 인터페이스는 여러개 구현가능~


인터페이스도 상속이 된당


결합도, 응집도 설명~

package practice0407;

class SamsungTv implements Tv {
	@Override
	public void turnOn() {
		System.out.println("Samsung 전원 on~");
	}

	@Override
	public void turnOff() {
		System.out.println("Samsung 전원 off~");
	}
}

class LgTv implements Tv {
	@Override
	public void turnOn() {
		System.out.println("Lg 전원 on~");
	}

	@Override
	public void turnOff() {
		System.out.println("Lg 전원 off~");
	}
}

interface Tv {
	public void turnOn();

	public void turnOff();
}

public class Abstract {
	public static void main(String[] args) {
		SamsungTv st1 = new SamsungTv(); //결합도↑ 응집도 ↓
		Tv st = new SamsungTv(); //결합도↓ 응집도↑
		st = new LgTv();
		st.turnOn();
		st.turnOff();
	}
}

▼▼결합도가 낮으면 유지보수가 쉬워진다▼▼

package practice0407;

class SamsungTv implements Tv {
	@Override
	public void turnOn() {
		System.out.println("Samsung 전원 on~");
	}

	@Override
	public void turnOff() {
		System.out.println("Samsung 전원 off~");
	}
}

class LgTv implements Tv {
	@Override
	public void turnOn() {
		System.out.println("Lg 전원 on~");
	}

	@Override
	public void turnOff() {
		System.out.println("Lg 전원 off~");
	}
}

class BeanFactory {
	public Object getBean(String beanName) {
		if (beanName.equals("samsung")) {
			return new SamsungTv();
		} else if (beanName.equals("lg")) {
			return new LgTv();
		}
		return null;
	}
}

interface Tv {
	public void turnOn();

	public void turnOff();
}

public class Abstract {

	public static void main(String[] args) {
		BeanFactory factory = new BeanFactory();
		Tv st = (Tv) factory.getBean("samsung");
//		Tv st = (Tv)factory.getBean(args[0]);  //bean 어떤 객체를 생성해주는것
		st.turnOn();
		st.turnOff();
	}
}