2011-04-14 4 views
11

아래에는 Person 클래스, 구현 클래스 및 Person 클래스를 초기화하고 다시 출력하는 드라이버 클래스가 있습니다.인터페이스 대 콘크리트 클래스

Person person = new PersonImpl(); 

대신

PersonImpl person = new PersonImpl(); 

의 인터페이스 구현을 숨기고하도록되어 사용의 장점은 무엇입니까? 이것이 인터페이스를 사용하는 올바른 방법입니까?

public class Driver { 

    public static void main(String [] args) 
    { 
     Person person = new PersonImpl(); 
     person.setName("test name"); 
     System.out.println("Name is "+person.getName()); 
    } 

} 


public interface Person { 

    public void setName(String name); 

    public String getName(); 

} 


public class PersonImpl implements Person{ 

    private String name; 

    public String getName() { 
     return this.name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 
+0

그래, 괜찮 았어. –

+1

고맙지 만, 완전히 이해하지 못하고, 더 큰 그림을 보지 못했을 것이다. 왜 PersonImpl person = new PersonImpl(); person.setName "test name"); System.out.println ("Name is"+ person.getName()); – user701254

+0

물론 사람 유형이 한 가지만 있다고 예상하면 인터페이스가 전혀 필요 없습니다. 'Person' 클래스를 직접 구현할 수 있습니다. 이는 특히 동일한 서브 시스템 또는 모듈 *에있는 코드에 해당됩니다. 일반적으로 다른 패키지에서 볼 수있는 클래스에 대한 인터페이스를 정의하는 것이 좋습니다. –

답변

10

인터페이스를 사용하는 방법입니다.

이유는 나중에 Person을 사용하는 코드를 변경하지 않고도 다른 구현을 작성할 수 있기 때문입니다.

이제는 PersonImpl을 사용할 수 있지만 나중에 OtherTypeOfPersonImpl이 필요할 수 있습니다.

동일한 인터페이스를 구현하는 새 클래스를 만들 수 있으며 Person을 필요로하는 다른 코드와 함께 새 클래스를 사용할 수 있습니다.

좋은 예가 List 인터페이스입니다.

ArrayList, LinkedList 등과 같이 List의 구현이 여러 개 있습니다. 이들 각각에 장단점이 있습니다. List을 사용하는 코드를 작성하여 각 개발자가 어떤 유형의 List이 가장 효과적인지 결정할 수 있으며 변경없이 이들 중 하나를 처리 할 수 ​​있습니다.

+0

메신저로 조금 혼란스러워. 왜 다른 유형의 사람을 만들고 싶습니까? 좋아, 나는 내가 입력하는 것처럼 학습을 생각합니다. 예를 들어 getName과 같이 반환하기 전에 문자열 이름을 수정할 수 있습니까? – user701254

+1

정확히 말하자면, 'Person', 'Child','Adult'의 두 가지 유형이 있는데 'Child'는 이름을 반환하고'Adult'는 제목 앞에 이름이있는 Person을 반환합니다. 나는 이것이 왜 유용한 지에 대한 나의 대답에 더 좋은 예를 덧붙였다. –

4

당신이 한 것은 정확합니다. Person person = new PersonImpl()을 사용할 때의 이점은 인터페이스와 구체적인 구현간에 느슨한 결합이 유지된다는 것입니다. 은 단단히 결합되어 있습니다. Person person = new Person()도 컴파일되지 않습니다.

거대한 응용 프로그램이 있고 많은 코드가 PersonImpl 객체에 의존한다고 상상해보십시오. 이제 PersonImpl을 변경하고 PersonImpl2라는 새로운 클래스를 만들고 싶다고 가정 해 보겠습니다. 이제는 전체 프로젝트를 수동으로 스캔하여 어디서나 변경해야합니다. 이것은 심지어 코드를 깨뜨릴 수도 있습니다. 이것은 단단한 커플 링 (tight coupling)이라고 불리며, 나쁜 것입니다. PersonImpl2가 Person을 구현하기 때문에 코드의 나머지 부분이 Person 객체에 의존한다면, 새로운 PersonImpl2 클래스를 만들더라도 문제가 해결됩니다.

2

내가 생각할 수있는 장점 중 하나는 사용자가 매우 다른 두 가지 유형이 있지만 런타임 (사용자 입력, 설정 파일 등)을 기반으로 어느 것이 사용할 것인지 결정할 때까지 기다리고 싶다는 것입니다. 다음과 같이 할 수 있습니다.

Person person = null; 
if ... 
    person = new PersonImpl(); 
else 
    person = new PersonImpl2(); 
0

구체적인 클래스 대신 인터페이스를 사용하면 나중에 구현을 변경할 수 있습니다.

JDBC에 관한 모든 내용은 인터페이스를 기반으로하므로 드라이버는 나중에 구현할 수 있습니다.

예를 들어 ResulSet을 사용할 때 실제로 구현 방법이 무엇인지 또는 어떤 것이 있는지 상관하지 않습니다 (Oracle 드라이버는 OracleResultSet과 비슷하지만 MySQL 드라이버는 MySQLResultSet과 같을 수 있습니다).하지만 어떤 메소드가 사용할 수 있습니다.같은

그것은 당신이 사람을 사용하는 방법에 따라 달라집니다 대신 ArrayList를 또는 HashMap의

2

의, 목록 또는지도로 이동합니다.

사실 그대로 인터페이스를 사용하면 실질적인 이점을 얻지 못합니다.

그러나 Person으로 정의 된 행동 (말하기 (walks), 생각 (thinks), 느낌 (feel))) 때문에 "사람"으로 간주 될 수있는 외계인이 있다고 가정 해보십시오. "포유류"계층 구조의 "인간"과 "거미류"계층 구조의 "외계인"이라는 매우 다른 두 계층 구조의 개인이 모두 구현할 수 있도록 "사람"과 "외계인"을 분리 할 수 ​​있습니다. Person 인터페이스.

관련 문제