ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 🎮 [JAVA 자바] #10 | 업캐스팅, 다운캐스팅, 추상메소드, 추상클래스, 인터페이스
    CS/Java 2022. 4. 19. 08:09

     


    🎮 업캐스팅과 다운캐스팅

    <용어보다는 왜 필요한지, 어떨 때 사용하는지가 포인트, 객체지향에 적용도 포인트>

     

     - 업캐스팅(upcasting) 

    서브 클래스 객체에 대한 레퍼런스를 슈퍼 클래스로 타입 변환.

    서브클래스의 객체는 슈퍼클래스의 객체로 취급 가능. 슈퍼클래스의 멤버를 모두 가지고 있음

    슈퍼 클래스 멤버만 접근 가능해진다. (원래 클래스만 가지고 있던 멤버 접근 불가능)

    class Person {...}
    class Student extends Person {...}
    
    Person p = new Student(); // 업캐스팅, 자동타입변환

     

     - 다운캐스팅(downcasting) 

    슈퍼 클래스 객체를 서브 클래스 타입으로 되돌림 변환. 다시 기존의 클래스 멤버 접근 가능

    강제 형변환 필요 (타입 변환 표시 필요)

    Student s = (Student)p; // 다운캐스팅, (Student)의 타입 변환 표시 필요

     

     - 업캐스팅을 하는 이유 

    1) 정보의 효율성 및 매개변수의 다형성 제공

    또 다른 클래스 추가하더라도 슈퍼클래스의 함수 그대로 사용 가능

     

    2) 여러 종류의 객체를 배열로 다루기. 응집성 향상

     

     - instanceof 연산자 

    업캐스팅 이후에는 레퍼런스가 가리키는 객체의 타입을 알기 힘듦. 객체의 타입을 알려준다.

    보통 if랑 같이 사용. 객체의 타입에 따라 다른 수행문 적용 가능.

    객체에 대한 레퍼런스만 허용하므로 int는 불가능. String은 가능. 

    주의 : 서브 클래스는 서브클래스의 타입도 true, 슈퍼클래스의 타입도 true로 나온다.

    if (p instanceof Student) { // 'p가 Student의 객체라면'
        ...
    }

    🎮 추상 메소드와 추상 클래스

     - 추상 메소드 

    선언만 있고 구현이 없는 메소드, abstract로 선언

    추상 메소드 작성 -> 서브 클래스에서 오버라이딩하도록 명시

    public abstract String getName();
    public abstract void setName(String s);

     

     - 추상 클래스 

    종류 1) 추상 메소드를 가진 클래스  -> 클래스 앞에 반드시 abstract라고 선언해주어야 함.

    종류 2) 추상 메소드가 하나도 없이 abstract로 선언된 클래스

    // 1) 추상 메소드 포함 추상 클래스 예시
    abstract class Shape { // 추상 클래스 선언
        public void paint() { draw() };
        public abstract void draw();
    }
    
    // 2) 추상 메소드 없는 추상 클래스 예시
    abstract class MyComponent {
        String name;
        public void load(String name) {
            this.name = name;
        }
    }

     

     - 추상메소드와 추상클래스 

    추상클래스의 직접 인스턴스 생성불가(상속하여 사용할 것에 대한 가이드라인)

    추상메소드의 오버라이딩 할 것을 강제하는 가이드라인 (안하면 에러발생)

     

     - 추상클래스의 상속 

    경우 1) 추상 클래스 구현 상속 : 서브 클래스에 슈퍼 클래스의 추상 메소드 구현 (오버라이딩). 서브클래스는 추상 클래스 아님

    경우 2) 추상 클래스 단순 상속 : 추상 클래스를 상속받아, 미구현된 추상 메소드 존재. 서브 클래스도 abstract로 선언

     

     - 추상클래스의 용도 

    1) 슈퍼클래스에서는 더 추상적인 개념 정의

        - 일반 클래스와 유사하게 인스턴스 멤버를 가질 수 있는 클래스

        - 필수메소드이지만 서브클래스에 따라 다르게 구현되어 사용되는 메소드는 추상메소드로 선언

        - 인스턴스 생성 불가

    2) 각 서브 클래스에서 구체적 행위 구현

        - 서브 클래스마다 목적에 맞게 추상 메소드 다르게 구현

    3) 추상클래스를 상속받아서 미리 정의된 공통 기능은 재활용하고, 실체클래스에서 필요한 기능들만 클래스별로 확장시켜 생산성 극대화


    🎮 인터페이스

     - 인터페이스의 목적 

    인터페이스는 제공할 기능 명세

        - 인터페이스는 추상 메소드의 집합을 통해 구현 강제성을 가지게 하여 표준적인 기능을 수행하도록 보장하는 설계에 활용

    인터페이스는 설계와 구현을 분리해줌

        - 클래스들이 기능을 서로 다르게 구현할 수 있도록 하는 클래스의 규격

        - 클래스간 결합도를 낮춤 (재사용성과 생산성 향상)

        - 생산성 높임

     

     - 자바의 인터페이스(interface) 

    추상메소드만 가지고 있는 타입 : 모든 메소드는 public이고 abstract임 (전혀 구현 X)

    상수를 가질 수 있는 타입 : 모든 상수는 public static final

    위의 접근지정자, 키워드 생략해도 자동으로 추가됨

     

     - 인터페이스 상속 

    인터페이스가 다른 인터페이스 상속 

    extends 키워드 사용, 다중 인터페이스 상속 (원래 자바의 그냥 상속은 다중 상속 불가능)

    interface Zoomable { ... }
    interface Usable extends Zoomable { ... } // extends 키워드 사용
    interface Movable extends Zoomable, Portable { ... } // extends 키워드 사용 + 다중 상속

     

     - 인터페이스와 추상 클래스 차이 

    추상 클래스는 일부 메소드는 구현, 인터페이스는 전혀 구현 X

    추상 클래스는 단일 상속만 지원, 인터페이스는 다중 상속 가능

    클래스는 인터페이스를 상속받을 수 없고, 인터페이스 상속은 인터페이스만 가능 (클래스는 인터페이스를 구현)

      추상 클래스 인터페이스
    메소드 구현 일부만 구현 전혀 구현 안함
    상속 단일 상속 다중 상속 가능

     

     - 자바 인터페이스 레퍼런스 변수 

    인터페이스의 객체 생성 불가

    인퍼페이스 타입의 레퍼런스 변수 선언 가능

    new PhoneInterface(); // 오류!! 인터페이스 객체 생성 불가
    PhoneInterface galaxy; // galaxy는 인터페이스에 대한 레퍼런스 변수

     

     - default 메소드 (JDK 1.8 이후 추가) 

    인터페이스에 코드를 작성한 메소드

    인터페이스를 구현하는 클래스에 자동 상속

    public만 허용 (생략 가능)

     

     - 인터페이스 구현 동시에 클래스 상속받는 예제