질문

====================================================================================

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

+ Recent posts