2009학년도 1학기 상지대학교 컴퓨터정보공학부 고 광 만 Lecture 6: 확장 클래스 2009학년도 1학기 상지대학교 컴퓨터정보공학부 고 광 만
목 차 확장 클래스(Extended Class) 인터페이스(Interface) 클래스형 변환 클래스 설계
확장 클래스 [1/3] 확장 클래스의 개념 상속(Inheritance) superclass의 모든 속성이 subclass로 전달되는 기능 클래스의 재사용성을 증가 superclass (base class) 기존 클래스 추가정보 subclass (derived class) 확장 클래스
확장 클래스 [2/3] 확장 클래스 정의 형태 확장 클래스의 예 : class SubClassName extends SuperClassName { // 필드 선언 // 메소드 정의 } class SuperClass { int a; void methodA { // ... } class SubClass extends SuperClass { int b; void methodB { // ... }
확장 클래스 [3/3] 단일 상속(single inheritance) Object 클래스 오직 한 개의 슈퍼클래스만 사용 오직 한 개의 슈퍼클래스만 사용 다중 상속(multiple inheritance)을 허용하지 않음 Object 클래스 모든 클래스의 슈퍼클래스 객체에 적용할 수 있는 기본 메소드가 정의 슈퍼클래스를 명시하지 않으면 기본적으로 슈퍼클래스는 Object
확장 클래스의 필드 주의 다른 필드, 메소드 이름은 상속 동일한 이름한 필드, 메소드 이름은 숨겨짐(hiding) super --- 숨겨진 슈퍼클래스에 있는 필드를 참조할 때 사용. class SuperClass { int a = 1; int b = 1; } class SubClass extends SuperClass { int a = 2; int b = super.a; // . . . super.a super.b a b
확장 클래스의 생성자 [1/2] 형태와 의미는 클래스 생성자와 동일. 실행과정 슈퍼클래스를 초기화하기 위해 먼저 슈퍼클래스 생성자를 호출. super() 슈퍼클래스의 생성자를 명시적으로 호출 명시적으로 호출하지 않으면, 기본 생성자가 컴파일러에 의해 자동적으로 호출 실행과정 1) 슈퍼클래스의 생성자를 호출. 2) 필드를 초기화하는 부분이 실행. 3) 생성자의 몸체부분을 수행. 예제 6.2 테스트
확장 클래스의 생성자 [2/2] 확장 클래스의 생성자 사용 예 [예제 6.2 - SubConstructor.java] class SuperClass { SuperClass() { System.out.println("SuperClass Constructor ..."); } class SubClass extends SuperClass { SubClass() { System.out.println("SubClass Constructor ..."); public class SubConstructor { public static void main(String[] args) { SubClass obj = new SubClass(); System.out.println("in main ..."); 실행 결과 : SuperClass Constructor ... SubClass Constructor ... in main ...
메소드 재정의 [1/2] 메소드 재정의(method overriding) 메소드 재정의를 할 수 없는 경우 슈퍼클래스에 정의된 메소드의 의미를 서브클래스에서 변경 매개변수 개수와 형이 같음 --- 같은 메소드 서브 클래스의 메소드로 대체 메소드 중복(method overloading) 매개변수 개수와 형이 다름 --- 다른 메소드 메소드 재정의를 할 수 없는 경우 정적(static) 메소드 최종(final) 메소드 최종 클래스 내에 있는 모든 메소드는 묵시적으로 최종 메소드 예제 6.6 테스트
메소드 재정의 [2/2] 메소드 재정의 예 [예제 6.6 - Addendum.java] class SuperClass { void methodA() { System.out.println("do SuperClass Task."); } class SubClass extends SuperClass { super.methodA(); System.out.println("do SubClass Task."); public class Addendum { public static void main(String[] args) { SubClass obj = new SubClass(); obj.methodA(); 실행 결과 : do SuperClass Task. do SubClass Task.
추상 클래스(abstract class) [1/3] 추상 클래스 정의 추상 메소드(abstract method)를 갖고 있는 클래스 추상 메소드 : 실질적인 구현을 갖지 않고 메소드 선언만 있는 경우 선언 방법 abstract class AbstractClass { public abstract void methodA(); void methodB() { // ... }
추상 클래스(abstract class) [2/3] 구현되지 않고, 단지 외형만을 제공 추상 클래스는 객체를 가질 수 없음 다른 외부 클래스에서 메소드를 사용할 때 일관성 있게 다루기 위한 방법을 제공 다른 클래스에 의해 상속 후 사용 가능 서브클래스에서 모든 추상 메소드를 구현한 후에 객체 생성 가능 [예제 6.7] 테스트 추상 메소드를 서브클래스에서 구현할 때 접근 수정자는 항상 일치
추상 클래스(abstract class) [3/3] 추상 클래스 사용 예 [예제 6.7 - AbstractClassTest.java] abstract class AbstractClass { public abstract void methodA(); void methodB() { System.out.println("Implementation of methodB()"); } class ImpClass extends AbstractClass { public void methodA () { System.out.println("Implementation of methodA()"); public class AbstractClassTest { public static void main(String[] args) { ImpClass obj = new ImpClass(); obj.methodA(); obj.methodB(); 실행 결과 : Implementation of methodA() Implementation of methodB()
무명 클래스(Anonymous Class) [1/2] 중첩 클래스와 같이 클래스 내부에서 사용하고자하는 객체를 정의할 수 있는 방법을 제공하며 객체를 생성하고자 하는 코드 부분에서 직접 객체 생성루틴과 함께 클래스를 정의 클래스의 이름이 없다. 한번만 사용이 가능 [예제 6.8] 무명 클래스를 사용하여 필요한 클래스를 따로 정의하지 않고, methodA() 메소드의 매개변수로 직접 정의하고 객체를 생성하여 사용
무명 클래스(Anonymous Class) [2/2] 무명 클래스 사용 예 [예제 6.8 - AnonymousExample.java] class AnonymousClass { public void print() { System.out.println("This is AnonymTest Class."); } public class AnonymousExample { public static void methodA(AnonymousClass obj) { obj.print(); public static void main(String[] args) { methodA(new AnonymousClass() { // 무명 클래스 System.out.println("This is redefined by Anonymous Example."); }); 실행 결과 : This is redefined by Anonymous Example.
인터페이스란 정의 및 특징 사용자 접속을 기술하는 방법으로 메소드들을 선언하고 필요한 상수들을 정의한 프로그래밍 단위 상수와 구현되지 않은 메소드들만을 갖고 있는 순수한 설계의 표현 다중상속(multiple inheritance) 지원 단일 상속(single inheritance) - 클래스
public, static, final의 속성 인터페이스 선언 [1/4] 선언 형태 사용 예 [public] interface interfaceName [extends ListOfSuperInterfaces] // constant definitions // method declarations } 내부적으로 상수를 의미하는 public, static, final의 속성 interface BaseColors { int RED = 1; int GREEN = 2; int BLUE = 4; void setColor(int color); int getColor(); }
인터페이스 선언 [2/4] 인터페이스의 필드 내부적으로 상수를 의미하는 public, static, final의 속성 선언된 모든 필드는 반드시 초기화 interface BaseColors { int RED = 1; int GREEN = RED + 1; int BLUE = GREEN + 2; void setColor(int color); int getColor(); } C 언어의 #define문 사용과 유사
인터페이스 선언 [3/4] 인터페이스의 메소드 추상(abstract) 속성 내부적으로 추상 메소드가 됨 모든 메소드를 구현되지 않는 메소드, 추상 클래스 내부적으로 모두 public 메소드 static이 올 수 없음 생성자를 갖지 않음
인터페이스 선언 [4/4] 인터페이스 몸체에서 사용할 수 없는 선언 수정자 인터페이스 선언 private, protected, synchronized, volatile 인터페이스 선언 인터페이스를 구현하는 클래스가 존재 인터페이스는 객체를 가질 수 없음 7.3절에서 설명 class className implements InterfaceName { // . . . }
인터페이스 확장 [1/4] 확장 형태 확장 예 [public] interface interfaceName extends ListOfSuperInterfaces { // constant definitions // method declarations } interface RainbowColors extends BaseColors { int YELLOW = 3; int ORANGE = 5; int INDIGO = 6; int VIOLET = 7; void printColor(int color); }
인터페이스 확장 [2/4] 인터페이스의 다중 상속
인터페이스 확장 [3/4] 다중 상속 예 다중 상속시 동일한 이름의 상수를 상속 단순 명은 ambiguous하기 때문에 에러 RainbowColors.YELLOW, PrintColors.YELLOW interface ManyColors extends RainbowColors, PrintColors { int VERMILION = 3; int CHARTUSE = RED + 90; }
인터페이스 확장 [4/4] 메소드 상속 overloading, overriding 시그네춰가 같고 복귀형이 다르면 에러 메소드 상속 예 interface BaseColors { // ... void setColor(int color); int getColor(); } interface ActionColors extends BaseColors { void setColor(int color) ; // overriding void setColor(int red, int green, int blue) ; // overloading // Color getColor(); // 에러 }
인터페이스 구현 [1/7] 클래스를 통하여 구현된 후 객체를 가짐 구현 형태 class ClassName implements InterfaceName { // fields // methods }
인터페이스 구현 [2/7] 구현 예 class Color implements BaseColors { // fields 구현시 public 명시 interface BaseColors { int RED = 1; int GREEN = RED + 1; int BLUE = GREEN + 2; void setColor(int color); int getColor(); } class Color implements BaseColors { // fields public void setColor(int color) { // 몸체 완성 } public int getColor() {
인터페이스 구현 [3/7] 인터페이스에 있는 모든 메소드들을 구현하지 않으면 추상 클래스. 추상 클래스는 다시 상속하여 메소드 몸체를 완성한 후 객체 생성 abstract class SetColor implements BaseColors { // fields public void setColor(int color) { // … }
인터페이스 구현 [4/7] 클래스 확장과 동시에 인터페이스 구현 다이아몬드 상속 [예제 6.10] 테스트 다이아몬드 상속 [예제 6.10] 테스트 class ClassName extends SuperClass implements ListOfInterfaces { // fields // methods } interface W { } interface X extends W { } class Y implements W { } class Z extends Y implements X { }
인터페이스 구현 [5/7] 인터페이스 구현의 예 – 정의 및 구현 [예제 6.10 - ImplementingInterface.java] interface BaseColors { int RED = 1, GREEN = 2, BLUE = 4; void setColor(int color); int getColor(); } abstract class SetColor implements BaseColors { protected int color; public void setColor(int color) { this.color = color; System.out.println("in the setColor method ..."); class Color extends SetColor { public int getColor() { System.out.println("in the getColor method ..."); return color; [Next Page]
인터페이스 구현 [6/7] 인터페이스 구현의 예 – 사용 [예제 6.10 - ImplementingInterface.java](cont.) public class ImplementingInterface { public static void main(String[] args) { Color c = new Color(); int i; c.setColor(10); i = c.getColor(); System.out.println("in the main method ..."); } 실행 결과 : in the setColor method ... in the getColor method ... in the main method ...
인터페이스 구현 [7/7] 인터페이스 형의 매개 변수 선언 dummy()의 실 매개 변수 : InterfaceA 형을 구현한 클래스의 객체 void dummy( InterfaceA interfaceRef ) { Object obj = interfaceRef; // ... }
인터페이스 vs. 추상 클래스 인터페이스 추상 클래스 다중 상속을 지원 메소드 선언만 가능 - 메소드를 정의할 수 없음. 단일 상속 메소드의 부분적인 구현이 가능
클래스형 변환 [1/3] casting up : valid type conversion casting down : invalid type conversion 슈퍼클래스 cast 연산자 자동 변환 서브클래스
dummy( (Java)c ); // 예외발생 클래스형 변환 [2/3] void dummy(CLanguage obj) { // … } // ... Java j = new Java(); dummy(j); // OK void dummy(Java obj) { // … } // ... Clanguage c = new CLanguage(); dummy(c); // 에러 dummy( (Java)c ); // 예외발생
클래스형 변환 [3/3] Polymorphism 적용하는 객체에 따라 메소드의 의미가 달라지는 것 c의 형은 CLanguage이지만 Java 클래스의 객체를 가리킴 CLanguage c = new Java(); c.print();
클래스 설계 [1/2] 클래스를 정의할 때 상속성을 이용하여 계층적 구조를 갖도록 설계하는 일은 매우 중요 공통적으로 갖는 필드와 메소드들은 모두 슈퍼클래스에 선언 객체지향 방법론의 접근 순서 OOA OOD OOP
클래스 설계 [2/2] class AnsiC { int declarations; int operators; int statements; void functions() { // ... } class Java extends AnsiC { int classes; int exceptions; int threads; class Cplusplus Extends AnsiC { int operatorOverloadings; class Oopl extends AnsiC { int classes; int exceptions; } class Java extends Oopl { int threads; class Cplusplus extends Oopl { int operatorOverloadings;