본문 바로가기
Programming/Java * Spring

[Java] 10. 인터페이스(Interface), 의존성 주입

by 고막고막 2019. 3. 28.
無常 : 만물이 끊임없이 변해 한 순간도 동일한 상태로 머물러 있지 않음

이처럼 개발환경도, 소프트웨어도, 고객의 요청도 계속 변한다. 이에 프로그램 설계의 유연성을 위해 등장한 것이 인터페이스이다.

Interface : 접점, 규약, 약속

  • 클래스의 상속(extends): 하위 분류 A는 상위 분류B의 한 종류이다(A is a kind of B)
  • 인터페이스의 상속(implements): 구현 클래스A는 인터페이스B 할 수 있어야 한다(→A is able to B)

  • 인터페이스에 선언하는 매서드는 자동으로 public abstract가 붙는다.
  • 인터페이스에 선언하는 필드는 자동으로 public final static가 붙는다.

의존성 주입(Dependency Injection) : 클래스 내부에서 결정하지 않고, 외부에서 상속받은 다양한 객체를 전달할 수 있으므로 프로그램 설계의 유연성을 가져올 수 있다.

public interface APersonalNumberStorage {
	 void addPersonalInfo(String name, String perNum);	
	 String searchName(String perNum);
}

public class PersonalNumInfo {
	private String name, number;
	
	public PersonalNumInfo(String name, String number) {
		this.name = name;
		this.number = number;
	}	
	String getName() {
		return name;
	}	
	String getNumber() {
		return number;
	}
}

public class PersonalNumberStorageImpl implements APersonalNumberStorage {

	PersonalNumInfo[] perArr;
	int numOfPerInfo;
	
	PersonalNumberStorageImpl(int sz) {
		perArr = new PersonalNumInfo[sz];
		numOfPerInfo = 0;
	}
    
	@Override
	public void addPersonalInfo(String name, String perNum) {
		perArr[numOfPerInfo] = new PersonalNumInfo(name, perNum);
		numOfPerInfo++;
	}
    
	@Override
	public String searchName(String perNum) {
		for(int i=0;i<numOfPerInfo;i++) {
			if(perNum.compareTo(perArr[i].getNumber())==0)
				return perArr[i].getName();
		}
		return null;
	}
}

public class PersonaMain {
	public static void main(String[] args) {
		PersonalNumberStorageImpl storage = new PersonalNumberStorageImpl(100);
		// 부모객체에 storage를 담을 수도 있음
		APersonalNumberStorage sto = storage;
		storage.addPersonalInfo("루피", "1234-5678");
		storage.addPersonalInfo("나미", "8765-4321");
		System.out.println(storage.searchName("1234-5678"));
		System.out.println(storage.searchName("8765-4321"));
	}
}