차근차근 개발자 되기

Java

13일차: Java 추상클래스/인터페이스/레퍼런스형변환 - 2021.07.01

wellow 2021. 7. 1. 23:56

목차

1.     추상 클래스

2.     인터페이스

3.     자료형 변환: 레퍼런스 형변환

 

1. 추상 클래스(Abstract Class)                             

 

1) 추상 클래스의 정의와 특징                            ★AbstractTest01 참고

추상 클래스: 실체 클래스들의 공통되는 필드와 메소드를 정의한 클래스

- 추상 클래스는 *실체 클래스의 부모 클래스 역할 (자체적으로 객체 생성X)

- 추상 클래스를 구성하는 요소는 추상 메소드와 일반 메소드, 멤버변수가 있다.

- 실체 클래스의 공통된 필드와 메소드의 이름을 통일할 목적으로 사용된다.

- 추상 클래스는 객체 생성을 통해 불러올 수 없기 때문에, 일반 클래스인 자식 구현 클래스로 객체를 생성해서 접근한다.

 

    abstract class AbsClass{

       int a=10;                              // 멤버변수

       abstract void Method01();        // 추상메소드  - 괄호 안에 내용이 없고 중괄호도 없음

       void Method02(){                   // 일반메소드

       }

     }

*실체 클래스: 객체를 만들어 사용할 수 있는 클래스

 

2) 추상 클래스의 상속                                     ★AbstractTest03 참고

- 추상 클래스를 상속받을 때는 extends를 이용해서 상속을 받는다.

- 추상 클래스도 일반 클래스와 마찬가지로 단일 상속만 가능하다. (클래스의 다중상속을 허용하지 않는다.)

- 추상 클래스를 상속받은 일반 클래스는 추상 클래스 안에 들어있는 추상 메소드를 반드시 메소드 오버라이딩해야 한다.

- 추상 클래스를 상속받게 되면 추상 클래스 안에 들어있는 추상 메소드를 반드시 메소드 오버라이딩 해야 한다. (일반 클래스를 상속받을 때는 메소드 오버라이딩이 선택 사항)

- 추상 클래스A, 추상 클래스B, 일반 클래스 C가 있고 B A, C B를 상속받는 경우(C → B → A), B C 둘 중 하나에서 메소드 오버라이딩이 이루어져야 한다. (2단계 상속 다중 상속)

→ ★ AbstractTestB 참고

 

이클립스에서 메소드 오버라이딩을 하는 방법

 

방법 1) 상속을 받는 클래스의 좌측에 뜨는 오류 표시(x)를 더블 클릭 → ‘Add unimplemented methods’ 선택

 

 

방법 2) 오른쪽 마우스 → ‘Source’ → ‘Override/Implement Methods’ 선택

 

 

3) 메소드의 다형성                    → ★AbstractTest02 참고

- 하나의 메소드가 다양한 방법으로 동작하는 것을 의미한다.

- 클래스 간에 통일성을 부여한다.

 

2. 인터페이스(Interface)                            

 

1) 인터페이스의 구성                            → ★InterfaceTest01 참고

인터페이스는 상수추상 메소드로 구성되어 있다.

(cf.추상클래스: 멤버변수, 일반 메소드, 추상 메소드 )

   public interface Inter01 {

      int a = 10;                       // 상수 (public static final 생략 가능)

      void check();                    // 추상 메소드 (public abstract 생략 가능)

   }

 

2) 인터페이스 상속                               → ★InterfaceTest01, 02 / AbstractTest04, 06, 07 참고

- 인터페이스를 상속받을 때는 implements로 상속을 받는다.

- 인터페이스를 상속받은 일반클래스는 인터페이스 안에 들어있는 추상 메소드를 반드시 Method Overriding 해야 한다.

   interface A {

      public abstract void check();

   }

   class S  implements  A {

          public void check() {       // public을 생략할 수 없다.

        }

   }

- 인터페이스는 다중상속을 허용한다.

   interface A {}

   interface B {}

   class S implements A, B {}                   // B, A가 되도 된다.(순서 상관 X)

 

- 추상 클래스와 인터페이스를 모두 상속을 받는 경우에는 추상 클래스를 먼저 상속받고, ②인터페이스는 그 다음으로 상속받아야 한다. (상속받는 순서가 바뀌면 안 됨) – 일반 클래스도 마찬가지. → ★AbstractTest04 참고

   interface A {}

   abstract class B {}

   class S extends B implements A {}

 

- 인터페이스 간의 상속: implements가 아닌 ‘extends’로 상속받는다.

interface A {}

interface B {}

interface C extends A, B {}

class S implements C {}

 

3. 자료형 변환: 레퍼런스 형변환               

 

레퍼런스 형변환: 두 개의 클래스 사이에 상속관계가 있어야함

 

1) 업캐스팅(자동 형변환)                       → ★RefTest01 참고

- 서브클래스에서 슈퍼클래스로 형변환 하는 것

- 참조 가능한 영역이 축소가 된다.

- 컴파일러에 의해서 암시적 형변환(자동 형변환)된다.

 

Parent p1 = (Parent) new Child();              // 업캐스팅, 우측의 ‘Parent’는 생략 가능

p.parentPrn();                                      // O

p.childPrn();                                         // X  (참조 가능한 영역의 축소)

 

2) 다운캐스팅(강제 형변환)                    → ★RefTest02 / RefTest03 참고

- 슈퍼클래스에서 서브클래스로 형변환 하는 것

- 참조 가능한 영역이 확대가 된다.

- 컴파일러에 의해서 암시적 형변환(자동 형변환)이 되지 않기 때문에 자료형을 생략할 수 없다.(강제 형변환)

 

Child c = (Child) new Parent();  // 오류 발생

 

Child c;

Parent p = new Child();         // 업캐스팅

c = (Child) p;                  // 다운 캐스팅(명시적 형변환)