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

[Java] 상속 관련

by nahkim 2023. 5. 30.

상속


캐스팅(casting) : 타입 변환

  • 업캐스팅 (upcasting)
  • 다운캐스팅 (downcasting)

업캐스팅(upcasting) : 서브 클래스의 객체에 대한 레퍼런스를 슈퍼 클래스 타입으로 변환하는 것 업캐스팅은 슈퍼 클래스의 레퍼런스로 서브클래스의 객체를 가리키게 한다.

Person p;
Student s = new Student();
p = s;     // 업캐스팅 

업캐스팅한 레퍼런스로는 객체 내에 모든 멤버에 접근할 수 없고 슈퍼 클래스의 멤버만 접근할 수 있다.

 

다운캐스팅(downcasting) : 업캐스팅과 반대로 캐스팅하는 것

 

instanceof 연산자

업캐스팅을 한 경우, 레퍼런스가 가리키는 객체의 진짜 클래스 타입을 구분하기 어려움 → instanceof 연산자 사용

 

메소드 오버라이딩 (method overriding)

슈퍼 클래스와 서브 클래스의 메소드 사이에 발생하는 관계로서, 슈퍼 클래스에 선언된 메소드와 같은 이름, 같은 리턴 타입, 같은 매개 변수 리스트를 갖는 메소드를 서브 클레스에서 재작성하는 것

 

메소드 오버라이딩은 '슈퍼 클래스 메소드 무시하기 혹은 덮어쓰기' 로 표현할 수 있다. → 슈퍼클래스의 메소드를 무시하고 서브 클래스에서 오버라이딩된 메소드가 무조건 실행되도록 함 : 동적 바인딩

메소드 오버라이딩은 동적 바인딩을 유발시킴

 

오버라이딩의 목적, 다형성 실현


오버라이딩 : 슈퍼클래스에 선언된 메소드를 , 각 서브 클래스들이 자신만의 내용으로 새로 구현하는 기능

오버라이딩은 상속을 통해 '하나의 인터페이스(같은 이름)에 서로 다른 내용 구현'이라는 객체 지향의 다형성을 실현하는 도구

 

메소드 오버라이딩 제약 사항

  • 슈퍼 클래스의 메소드와 동일한 원형으로 작성해야함
  • 슈퍼 클래스 메소드의 접근 지정자보다 접근의 범위를 좁여 오버라이딩 할 수 없다.
  • static이나 private 또는 final로 선언된 메소드는 서브 클래스에서 오버라이딩할 수 없다.ex) 슈퍼 클래스에 protected로 선언된 메소드 → 서브 클래스에서 protected나 public으로만 오버라이딩 가능
  • 접근 지정자 : public > protected > 디폴트 > private ( 점점 범위가 좁아짐)
  •  

동적 바인딩 (dynamic binding)


실행할 메소드를 컴파일 시(compile time)에 결정하지 않고 **실행 시(run time)**에 결정하는 것

 

메소드가 오버라이딩 된 경우, 동적 바인딩에 의해 항상 서브 클래스에 오버라이딩한 메소드가 호출됨! 그렇다면 슈퍼 클래스의 메소드에 접근할 경우? → 서브 클래스에서 super 키워드 이용(정적 바인딩)

super.슈퍼클래스의멤버

super : 슈퍼 클래스에 대한 레퍼런스

 

오버로딩(overloading)과 오버라이딩(overriding)

자바에서 다형성을 이루는 방법

오버라이딩 : 슈퍼 클래스의 메소드를 이름, 매개변수 타입과 개수, 리턴 타입을 모두 동일하게 서브 클래스에 재작성 하는 것 → (상속 관게에서만 성립)

 

오버로딩 : 한 클래스나 상속 관계에 있는 클래스들 사이에 메소드의 이름은 같지만, 매개변수 타입이나 개수가 다르게 메소드를 작성하는 것 → (동일한 클래스 내 혹은 상속 관계 둘다 가능)

 

추상 메소드 (abstract method)


선언은 되어 있으나 코드가 구현되어 있지 않은, 즉 껍데기만 있는 메소드

작성 방법 : abstract 키워드 와 함께 원형만 선언하고 코드는 작성하지 않는다.

추상 클래스가 되는 경우 (일단 클래스는 abstract여야함)

  • 추상 메소드를 포함하는 클래스
  • 추상 메소드가 없지만 abstract로 선언한 클래스

 

특징


추상 클래스는 객체를 생성할 수 없다.

ex) Shape 가 추상클래스일 경우 main에

shape = new Sharpe(); // 오류

그러면 어떻게 사용?? → 변수로 선언

Shape shape; // 오류 아님

추상 클래스를 상속받는 서브 클래스는 추상 클래스가 됨

→ 서브 클래스에 abstract를 붙여야함

근데 상속 받는데 오버라이딩해서 추상메소드를 안쓴다면?

→ 서브 클래스에 abstract 붙이지 않음 (서브 클래스는 추상 클래스가 아니게 됨)

 

추상 클래스 : 추상 메소드를 통해 서브 클래스가 구현할 메소드를 명료하게 알려주는 인터페이스의 역할을 하고,

서브 클래스는 추상 메소드를 목적에 맞게 구현하는 다형성을 실현할 수 있다.

 

인터페이스 (interface)


서로 다른 하드웨어 장치들이 상호 데이터를 주고받을 수 있는 규격

 

자바의 인터페이스

interface 키워드 사용

 

인터페이스 구성 (멤버로 구성), 필드(멤버 변수)를 만들 수 없음

  • 상수와 추상 메소드
  • default 메소드
  • private 메소드
  • static 메소드

 

특징

  • 인터페이스는 객체를 생성할 수 없다. (new)
  • 인터페이스 타입의 레퍼런스 변수는 선언 가능하다.
  • (추상 클래스와 같은 말)
  • 인터페이스끼리 상속된다
  • 인터페이스를 상속받아 클래스를 작성하면 인터페이스의 모든 추상 메소드를 구현해야한다

인터페이스 구현

implements 키워드를 사용하여 인터페이스의 모든 추상 메소드를 구현한 클래스를 작성하는 것

(인터페이스 클래스에 있는 메소드에 대해 코드짜는 거라 생각하면 될듯)