본문 바로가기
프로그래밍/Java

Java - 상속 (2)

by 왕거 2020. 7. 6.

15번째 강의도 상속에 대한 내용이었다.

 

상속을 위한 두 클래스의 관계

  • is - a 관계를 이룰 것
    • 하위 클래스는 상위 클래스의 모든 특성(변수 + 메소드)를 지님. 이에 더하여 자신만의 추가적인 특성을 더함
    • 문법적인 관계가 아닌 실제 또는 설계상의 관계를 뜻한다.
    • 의미 또는 기능상 전혀 연관이 없는 클래스간의 상속을 피할 것
    • 전자제품 <- 휴대전화 <- 스마트폰
    • 분식 <- 라면 <- 신라면

 

상위 클래스의 참조변수를 통해 하위 클래스의 인스턴스를 참조할 수 있다.

- 하위 클래스의 참조변수로 상위 클래스의 인스턴스를 참조하는 역은 성립하지 않음

  • 단 이렇게 사용하게 되면 하위 클래스에 추가된 특성은 해당 참조변수를 통해서는 사용할 수 없다.
  • 배열로 선언하는 경우에도 동일하게 적용 가능함
class Electronics {...}

class MobilePhone extends Electronics {...}

Electronics E1 = new MobilePhone(); // --> 아무런 문제 없음

Electronics[] E2 = new MobliePhone[5]; // --> 아무런 문제 없음

/*---------------------------------------------------------------*/

class electronics {
    String type;

    public electronics(String n) {
        this.type = n;
    }

    public void introduceType() {
        System.out.println(type);
    }
}

class mobliePhone extends electronics {
    String name;

    public mobliePhone(String t, String n) {
        super(t);
        this.name = n;
    }
    public void introduceName() {
        System.out.println(name);
    }
}
public static void main(String[] args) {
    electronics E1 = new mobliePhone("Phone", "Anycall");
    mobliePhone E2 = new mobliePhone("Phone", "Galaxy");

    E1.introduceName();	// 작동 안됨. 애초에 컴파일러에서 에러 출력
    E1.introduceType();	// 문제 없음

    E2.introduceName();	// 문제 없음
    E2.introduceType();	// 문제 없음
}

 

메소드 오버라이딩

  • 하위 클래스에서 상위 클래스의 메소드와 동일한 반환형과 이름, 매개변수 구성을 가진 메소드를 선언하면 이를 메소드 오버라이딩이라고 지칭
  • 상위 클래스의 참조변수를 통해서 하위 클래스의 인스턴스를 참조하여 메소드를 사용하더라도 하위 클래스에서 오버라이딩한 기능으로 메소드가 동작한다.
  • 오버라이딩 된 상위 클래스의 메소드를 사용하려면 super 키워드를 사용해야 함
  • 변수는 오버라이딩 되지 않는다.
    • 애초에 비슷한 목적으로 코딩을 하면 바람직하지 않음
    • 그냥 알고만 있자.
class electronics {
    String type;

    public electronics(String n) {
        this.type = n;
    }

    public void introduce() {
        System.out.println(type);
    }
}

class mobliePhone extends electronics {
    String name;

    public mobliePhone(String t, String n) {
        super(t);
        this.name = n;
    }
    public void introduce() {
        System.out.println(name);
    }
}
public static void main(String[] args) {
    electronics E1 = new mobliePhone("Phone", "Anycall");
    mobliePhone E2 = new mobliePhone("Phone", "Galaxy");

    E1.introduce();	// "Anycall" 출력됨
    E2.introduce();	// "Galaxy" 출력됨
}

/*--------------------------------------------------------*/

class mobliePhone extends electronics {
    ...
    public void introduce() {
    	super.introduce();
        System.out.println(name);
    }
}

public static void main(String[] args) {
    electronics E1 = new mobliePhone("Phone", "Anycall");
    mobliePhone E2 = new mobliePhone("Phone", "Galaxy");

    E1.introduce();	// "Phone" 출력 후 개행 "Anycall" 출력됨
    E2.introduce();	// "Phone" 출력 후 개행 "Galaxy" 출력됨
}

 

instanceof 연산자

  • __REF__ instanceof __CLASS_NAME__
    • __REF__가 __CLASS_NAME__의 인스턴스를 참조하면 True를 반환
    • __REF__가 __CLASS_NAME__을 상속하는 클래스의 인스턴스일 경우 True 반환
  • 인스턴스의 클래스 종류를 판별하는 조건으로 활용할 수 있다.

 

 

 

'프로그래밍 > Java' 카테고리의 다른 글

Java - 인터페이스  (0) 2020.07.08
Java - 상속 (3)  (0) 2020.07.08
Java - 상속 (1)  (0) 2020.07.05
Java - 콘솔 출력과 입력  (0) 2020.06.29
Java - 메소드 오버로딩과 String 클래스  (0) 2020.06.28