보호된 접근
여러분이 이미 알다시피, 클래스의 인스턴스 필드는 보통 private 태그가 붙고, 메소드는
public 태그가 붙는다. private 으로 선언된 특성은 다른 클래스에서 보이지 않는다. 이것은
또한 하위 클래스에서도 마찬가지이다. 하위 클래스는 상위 클래스의 은폐 데이터를 접근할 수
없다.
하지만, 하위 클래스가 메소드나 데이터를 접근하고자 할 때도 있다. 이 경우, protected 로
선언해야 한다. 예를 들면, 기반 클래스인 Employee 가 hireDay 객체를 private 대신
protected 로 선언하면, Manager 메소드는 이것을 직접 접근할 수 있다.
실제로는 protected 특성을 주의하여 사용해야 한다. 여러분의 클래스가 다른 프로그래머에
게 사용되고 있고, 이것이 보호된 데이터를 포함하고 있다고 가정하자. 여러분이 모르는 다른
프로그래머가 여러분의 클래스로부터 파생하여 보호된 인스턴스 필드를 접근할런지 모른다. 이
경우에 다른 프로그래머를 방해하지 않고 여러분의 클래스의 구현을 변경할 수 없다.
보호된 메소드의 경우를 살펴보자. 클래스는 메소드를 protected 로 선언할 수 있다. 이것은
하위 클래스(아마도 조상을 아는)는 이 메소드를 사용할 수 있고, 다른 클래스는 사용할 수 없
음을 의미한다.
C++노트 : 자바의 protected 특성은 모든 하위 클래스 뿐만이 아니라 같은 패키지 안의 다른
클래스에서 사용할 수 있다. 이것은 C++의 protected 의 의미와 약간 다르다. 실제로 이런 차
이점은 거의 신경을 쓰지 않아도 무방하다.
———————————————————————————————————————————-
다음은 자바에서의 네 개의 접근 수식어의 가시도에 대한 요약이다.
1. 클래스에게만 보인다.(private)
2. 전부에 보인다.(public)
3. 패키지와 모든 하위 클래스에 보인다.(protected)
4. 패키지에 보인다.(디폴트로 아무런 수식어도 필요 없다.)
Object 클래스 안에 있는 equals 메소드는 하나의 객체가 다른 것과 같은가를 검사한다.
equals 메소드는 두 객체가 지정한 메모리의 영역이 같은가를 결정한다. 예를 들면
Class Employee
{ // . . .
public boolean equals (Object obj)
{ if (!(obj instanceof Employee))
return false;
Employee b = (Employee)obj;
Return name.equals(b.name)
&& salary == b.salary
&& hireDay.equals(b.hireDay);
}
}
Object 클래스 내의 다른 중요한 메소드는 그 객체의 값을 나타내는 문자열을 리턴하는
toStirng 메소드가 있다. 객체의 현재 상태에 대해 화면에 프린트로 보기 위해서 모든 클래
스에서 이 메소드를 겹쳐서(override) 사용가능 하다. 자바에서 “+” 연산자를 사용하면 컴
파일러는 자동적으로 toString 메소드를 실행하여 객체의 문자열을 보여준다.
예를 들면
Day d = new Day (1999,12,31);
String last = “The last day of the millennium is “+d;
// automatically invokes d.toString ()
팁: x.toString()이라고 쓰기 보다는 “ “ + x 라고 쓸 수 있다.
마지막으로 어떠한 형태의 클래스의 모든 값들은 Object 형의 변수들을 가질 수 있다. 특히,
string 값들은 객체이다.
Object obj = “Hello”; // OK
그러나 숫자들, 문자들, 불리언 값은 객체가 될 수 없다.
obj = 5; // ERROR
obj = false; // ERROR
더욱이 모든 배열 형태들은 Object 에서 파생된 클래스의 형태이다.
Employee[] staff = new Employee [10] ;
Object arr = staff; // OK
Arr = new int [10]; // OK