Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.2.1 |  CUBRID 8.3.0 |  CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 |  CUBRID 8.4.3 |  CUBRID 9.0.0 | 

수퍼클래스 충돌

수퍼클래스 추가

ALTER CLASS 구문에서 INHERIT 절은 선택 사항이지만 클래스의 변경에 의해 충돌이 발생할 경우에는 반드시 사용해야 하는 문장이다. INHERIT 절 다음에 하나 이상의 해결방법을 명시할 수 있다.

superclass_name에는 충돌이 발생했을 때 새로 상속받을 속성이나 메서드를 가지는 수퍼클래스의 이름을 명시하고, attr_mthd_name에는 상속받을 속성이나 메서드의 이름을 명시한다. 상속받을 속성이나 메서드의 이름을 변경할 필요가 있는 경우에는 AS 절을 이용하여 별칭을 지정할 수 있다.

다음 예는 demodbevent 클래스와 stadium 클래스를 상속받아서 soccer_stadium 클래스를 만든다. event 클래스와 stadium 클래스는 모두 name, code 속성을 가지고 있기 때문에 INHERIT을 사용하여 상속받을 속성을 지정해야 한다.

CREATE CLASS soccer_stadium UNDER event, stadium
INHERIT name OF stadium, code OF stadium;

두 수퍼클래스 event, stadiumname이라는 속성을 가지고 있고, soccer_stadium 클래스가 두 속성을 모두 상속받으려면, stadiumname은 그대로 상속 받고 event 클래스의 nameINHERITalias 절을 사용하여 이름을 변경하여 상속받을 수 있다.

아래 예는 stadium 클래스의 name은 그대로 name으로 상속받고, event 클래스의 namepurpose라는 별명으로 상속받는다.

ALTER CLASS soccer_stadium
INHERIT name OF event AS purpose;

수퍼클래스 삭제

INHERIT을 사용하여 명시적으로 속성이나 메서드를 상속한 수퍼클래스를 삭제하면 서브클래스에서 다시 이름 충돌이 발생할 수 있다. 이 경우에는 삭제할 때 명시적으로 상속받을 속성이나 메서드를 지정해야 한다.

다음 예는 demodbgame, participant, stadium 클래스를 상속받아서 seoul_1988_soccer 클래스를 만들고, 그 중 participant 클래스를 수퍼클래스에서 제거한다. participant 클래스에서 nation_codehost_year를 명시적으로 상속받았기 때문에, 수퍼클래스에서 제거하기 전에 nation_codehost_year의 이름 충돌을 해결해야 한다. 하지만, host_yeargame 클래스에만 존재하므로 명시적으로 지정할 필요는 없다.

CREATE CLASS seoul_1988_soccer UNDER game, participant, stadium
INHERIT nation_code OF participant, host_year OF participant;
ALTER CLASS seoul_1988_soccer
DROP SUPERCLASS participant
INHERIT nation_code OF stadium;

호환되는 도메인

두 개 이상의 수퍼클래스 사이에서 속성의 충돌이 발생할 때, 모든 속성이 호환되는 도메인을 가지는 경우에만 충돌을 해결하는 구문이 불가능하다.

예들 들어, 정수 타입의 phone이라는 속성을 가지는 수퍼클래스를 상속받은 클래스에는 문자열 타입의 phone 속성을 가지는 또 다른 수퍼클래스를 추가할 수 없다. 두 수퍼클래스의 phone 속성의 타입이 모두 문자열이거나 정수라면 INHERIT 구문을 이용하여 충돌을 해결하면서 수퍼클래스를 추가할 수 있다.

이름은 같지만 도메인이 다른 속성을 상속할 때 도메인 호환성이 점검된다. 이 경우, 클래스 상속 계층 구조의 하위 클래스를 도메인으로 갖는 속성이 자동으로 상속된다. 상속받을 속성들의 도메인이 호환 가능할 때, 상속 관계가 만들어지는 클래스에서 충돌이 해결되어야 한다.