6주차 과제: 상속



목표

자바의 상속에 대해 학습하세요.

학습할 것 (필수)

  • 자바 상속의 특징
  • super 키워드
  • 메소드 오버라이딩
  • 다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
  • 추상 클래스
  • final 키워드
  • Object 클래스

자바 상속의 특징 

자바는 '상속(inheritance)' 이라는 것을 통해 다른 클래스에서 다른 클래스로 속성과 메서드를 가져올 수 있습니다. 
이는 코드의 재사용성을 높혀 주어 효율적인 코딩이 가능하게 합니다. 

상속하고자 하는 클래스의 이름을 키워드 'extends' 와 함께 사용하여 상속 해주며
상속은 동시에 하나의 클래스만 상속 가능합니다 ( 단일 상속 - single inheritance)

이 때 상속해준 클래스를 "부모 클래스" 또는 "슈퍼 클래스" 라고 하며 
상속받은 클래스를 "자식 클래스" 또는 "서브 클래스" 라고 합니다. 

상속 받은 클래스를 재 상속받음으로써 관계가 이어지며 이를 multi level inheritance 라고 합니다.

모든 클래스의 최상위 클래스는 Object 클래스로  모든클래스는 Object 의 서브 클래스 입니다.

super 키워드 

super키워드는 슈퍼 클래스 (부모)의 개체를 의미합니다.

이는 서브클래스 내에서 슈퍼 클래스 메서드를 호출하고 슈퍼 클래스 생성자에 액세스하는 데 사용됩니다.

super키워드는 일반적으로 서브클래스와 슈퍼클래스에서 같은 명칭의 변수를 사용할 때 이를 구분짓기 위해 사용합니다. 

이를 사용하지 않고 동일한 이름의 변수를 사용한다면 부모의 것은 가려지고 자식의 변수를 지칭하게 됩니다.

메소드 오버라이딩

부모 클래스에 이미 존재하는 메소드를 하위 클래스에서 재 선언하는 것을 메소드 재정의(오버라이딩) 이라고합니다. 
재정의 사용의 장점은 자식 클래스에 특정한 동작을 분류하는 기능이며 
자식 클래스는 필요에 따라 부모 클래스 메서드를 구현할 수 있습니다.

오버라이딩할 때 지켜야 할 규칙
    • Java에서 메소드는 동일한 클래스가 아닌 하위 클래스에만 작성할 수 있습니다.
    • 이름과, 매개변수, 변환타입이 같아야 합니다. 즉 선언부가 동일해야 합니다.
    • 생성자는 재정의 할 수 없습니다.
    • final과 static 으로 선언 된 메소드는 재정의 할 수 없습니다.
    • 다른 패키지의 자식 클래스는 public 또는 protected로 선언 된 비 최종 메서드 만 재정의 할 수 있습니다.

다이나믹 메소드 디스패치 (Dynamic Method Dispatch)

다이나믹 메서드 디스패치는 런타임에 재정의 된 메서드에 대한 호출이 해결되는 메커니즘입니다. 이건 자바가 런타임 다형성을 구현하는 방법으로 재정의 된 메서드가 참조에 의해 호출되면 자바는 참조하는 객체 유형에 따라 실행할 해당 메서드의 버전을 결정합니다. 
간단히 말해서, 정적 메서드 호출과는 달리 런타임에 컴파일을 함으로써 효율적인 컴파일이 가능합니다. 

추상클래

추상 클래스를 알아보기 전에 데이터의 추상화란 특정 세부 정보를 숨기고 사용자에게 필수 정보 만 표시하는 프로세스입니다.
추상화는 보통 추상클래스나 인터페이스를 통해 구현할 수 있습니다.

이를 구현하기 위한 키워드는 abstract로 클래스와 메소드에 사용되는 비 액세스 한정자입니다.

추상 클래스 : 객체를 만드는 데 사용할 수없는 제한된 클래스입니다. (액세스하려면 다른 클래스에서 상속되어야 합니다).

추상 메서드 : 추상 클래스에서만 사용할 수 있으며 본문이 없습니다. (본문은 하위 클래스에서 제공됩니다.) 

추상 클래스는 추상 및 일반 메서드를 모두 가질 수 있지만 추상클래스에서 선언된 추상메서드는 상속받은 클래스에서 사용하려면 오버라이딩 작업이 필수로 필요합니다.

final 키워드 

final은 엔티티가 재정의/수정 되지 않도록 정의하는 것으로 수정 클래스, 속성과 메소드에 사용되는 비 액세스입니다. 이는 단위나 파이(π) 값과 같은 상수를 정의할 때 유용하게 쓰입니다. 
변수를 선언과 동시에 반드시 초기화 할 필요는 없습니다. 
final 로 선언된 메서드는 서브클래스에서 오버라이딩 할 수 없습니다.
final 로 선언된 클래스의 경우 상속받을 수 없습니다. 

object 클래

java.lang 패키지에 있는 object 클래스는 모든 클래스의 부모 클래스로 최상위 클래스입니다. 
따라서 모든 클래스에서 object 클래스 내부의 메서드를 사용할 수 있으며 모든 형태는 object로 형변환이 가능합니다. 

object 클래스에 선언된 메서드는 대표적으로 아래 종류들이 있습니다. 


ㆍtoString () : toString ()은 Object의 String 표현을 제공하며 객체를 String으로 변환하는 데 사용됩니다. Object 참조를 인쇄하려고 할 때마다 내부적으로 toString () 메서드가 호출됩니다. 예를 들어

Student s = new Student ();

System.out.println (s);
System.out.println (s.toString());        // 둘은 동일하게 사용됩니다.

ㆍhashCode () : 모든 객체에 대해 JVM은 고유 번호 인 해시 코드를 생성합니다. 고유 한 개체에 대해 고유 한 정수를 반환합니다. 이 메서드에 대한 일반적인 오해는 hashCode () 메서드가 올바르지 않은 개체의 주소를 반환한다는 것입니다. 알고리즘을 사용하여 객체의 내부 주소를 정수로 변환합니다. 해시 코드 () 메소드는 기본 자바에서 객체의 주소를 찾을 불가능하기 때문에, 그래서 객체의 주소를 찾기 위해 C / C ++와 같은 네이티브 언어를 사용합니다.

ㆍequals (Object obj) : 주어진 객체를 "this"객체 (메서드가 호출 된 객체 )와 비교합니다. 객체가 같은지 비교하는 일반적인 방법을 제공합니다. 

ㆍgetClass () : "this"객체의 클래스 객체를 반환하며 객체의 실제 런타임 클래스를 가져 오는 데 사용됩니다. 이 클래스의 메타 데이터를 가져 오는 데 사용할 수도 있습니다. 반환 된 Class 객체는 표현 된 클래스의 정적 동기화 메서드에 의해 잠긴 객체입니다. 최종이므로 재정의하지 않습니다.

ㆍfinalize () 메서드 :이 메서드는 객체가 가비지 수집되기 직전에 호출됩니다. 가비지 수집기 가 개체에 대한 참조가 더 이상 없다고 판단 할 때 개체 의 가비지 수집기 에 의해 호출됩니다. 

ㆍclone () :이 객체와 똑같은 새 객체를 반환합니다. 

 

 

댓글

이 블로그의 인기 게시물

git-receive-pack not permitted on 깃 허브 로그인 관련 문제