질문
====================================================================================
interface Add16 { public int add(int op1, int op2); }
interface Sub16 { public int sub(int op1, int op2); }
class Operation16 implements Add16, Sub16 {
int result = 0;
public int add(int op1, int op2) {
result = op1 + op2;
return result;
}
public int sub(int op1, int op2) {
result = op1 - op2;
return result;
}
}
class test {
public static void main(String args[]) {
Operation16 test = new Operation16();
System.out.println( test.add(4, 5) );
System.out.println( test.sub(7, 4) );
}
}
위 구문에서 빨강색 public은 있으나 없으나 에러가 안났습니다.
하지만 파랑색 public은 반드시 필요했습니다.
각각의 public의 역할을 알려주시면 감사하겠습니다.
또한 .왜 그런것인지 궁금합니다.
답변부탁드립니다.
[답변]
인터페이스는 상수와 추상메소드들만을 포함합니다. 즉 객체의 정의가 추상화 되어 있는것이
인터페이스이며 이 말은 인터페이스가 사용되기 위해서는 인터페이스를 상속받아서 추상메소드
를 재정의 해야지 비로소 사용할 수 있게 된다는 뜻이죠. 이렇게 반드시 재정의 되어야만 사
용될 수 있는 추상메소드에 public 이 없다면, 다른패키지에서는 해당 인터페이스를 상속받
을 수 없게 되므로 오류가 납니다. 반드시 재정의 해야 되는데 상속받을 수 없다면 모순이죠.^^;
님의 질문은 interface 내에서는 public 을 안 써줘도 에러가 없는데 왜 상속받아 재정의 할
때는 에러가 나느냐 인데요. 이유는 간단 합니다.
interface 내에서는 명시적으로 public를 써주지 않더라도 묵시적으로 public 으로 정의해 줍
니다. 즉 님이 정의하신 메소드는 int add() 이렇게 정의 하더라도 실제로는
public abstract int add(); 이렇게 자동적으로 정의가 되는 것이죠. 인터페이스니까요..
인터페이스 내에 정의되는 상수도 마찬가지 입니다. 만약 인터페이스 내에 int ONE = 0x31; 이
라고 정의해 주면 명시적 표현은 저렇다 하더라도 자동적으로
public static final int ONE = 0x31; 이렇게 정의가 되는 것입니다.
인터페이스 내에서는 public 를 안써주더라도 public으로 자동적으로 정의 되기 때문에 하위 클
래스에서 public를 안써주면 메소드재정의 원칙이 어긋나므로 당연히 에러가 나는 것이죠.
이와 비슷한 예를 하나 들어 볼까요.
어떤 객체를 정의하는 클래스에서 생성자가 어떠한 인수나 수행문이 없는 경우에는 생성자를
생략하기도 하는데요.. 이 경우에는 이 클래스로 부터 객체를 생성할 수 없나요? 당근 아니죠.
이 경우는 묵시적으로 다음과 같은 생성자를 자동으로 가지게 됩니다.
public class_name(){};
[출처] : http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10106&eid=/IpGilXejkpC04GpBGQFm+Zmaf+dFF0D&qb=aW50ZXJmYWNlvLG+8A
'프로그램 > Java & Jsp' 카테고리의 다른 글
JSP의 액션 태그 알아보기 - include 태그 (0) | 2009.04.29 |
---|---|
[펌] - JSP태그 - 지시자(Directive) (0) | 2009.04.29 |
Beans, DTO, DAO (1) | 2009.04.02 |
[펌] - 클래스 변수 (static) (0) | 2009.04.02 |
[펌] - Singleton Pattern-2 (싱글턴 패턴) (0) | 2009.04.01 |