JAVA

Java 상속, 오버라이딩, 업캐스팅, 다운캐스팅, Object클래스

서묘_ 2021. 12. 2. 20:20

상속

기존 클래스의 멤버들을 다른 클래스에서 물려받아 속성이나 기능을 확장시켜 사용하는것.

 

여기서 기존 클래스를 Super, 조상, 상위, 부모 클래스 등으로 칭하며

물려받는 클래스를 Sub, 자손, 하위, 자식 클래스라고 칭한다.

 

Super클래스는 넓은 의미, Sub클래스는 세분화된 의미를 갖게된다.

주로 Super클래스에는 공통적인 요소를 모아두고

Sub 클래스에서 이를 상속 받아 각각 필요한 특성과 메서드를 구현한다.

 

class Book{

    String title;

    String author;

}

class BookStore{

    String title;

    String author;

    int price;

}

Book클래스와 BookStore는 공통적으로 title, author 변수를 가지고잇다.

중복되는 코드는 좋지 않은 코드이고 이런 경우 상속을 사용하기도 한다.

 

class BookStore extends Book{

    int price;

}

상속 받았다는 의미로 Sub클래스명 옆에 extends Super클래스명 을 붙여준다.

Book클래스를 상속 받으면 굳이 쓰지 않더라도 title, author 멤버를 가지게 된다.

 

 

주의점

1. 생성자는 물려받지 않는다. 변수와 메서드만 물려받는다.

2. Sub클래스의 멤버는 Super클래스의 멤버 개수와 같거나 더 많다.

    Sub class 멤버

    Super class에서 물려받은 멤버들(생성자 제외) + Sub class 멤버들

3. 단일 상속만 가능하다.

    extends 뒤에는 Super클래스 단 하나만 사용할 수 있다.

    여러 클래스에서 한 클래스를 Super클래스로 사용할수는 있다.

4. Super클래스에서 private으로 선언된 변수나 메서드는 Sub클래스에서 사용할 수 없다.

    protected로 선언된 멤버는 사용 가능하다.

5. Super클래스의 내용을 변경하면 Sub클래스에도 반영된다.

6. Sub클래스가 생성될 때 Super클래스가 먼저 생성된다.

   Sub클래스의 생성자에는 무조건 Super클래스의 생성자가 호출되어야 한다.

   생성자를 작성하지 않은 경우, 컴파일러는 Super클래스의 기본 생성자를 호출하기위한 Super()코드를 넣어준다.

   Super() : 상위 클래스의 기본 생성자,

   만약 상위 클래스의 기본생성자가 없다면 하위 클래스의 생성자에는 상위 클래스의 생성자를 명시해야만 한다.

 

 

상위 클래스로의 묵시적 형 변환(업캐스팅)

상위 클래스형으로 변수를 선언하고 하위 클래스 인스턴스를 생성할 수 있다.

Book bo = new BookStore();

단, bo변수는 타입이 Book이므로 BookStore에만 있는 price변수에는 접근할 수 없다.

 

다운캐스팅 - instanceof

다시 원래 자료형인 하위 클래스로 형 변환 하려면 명시적으로 다운캐스팅을 해야한다.

이 때 원래 인스턴트의 타입을 체크하는 예약어가 instanceof이다.

if ( Book instanceof BookStore ){

    BookStore bs = (BookStore)bo;

}

체크하고 가능하다면 변환해주고 아니라면 변환되지 않는다. 

instanceof 를 사용하지 않고 그냥 명시만 해서 변환하는 경우 오류가 날 수 있다.

 

 

메서드 오버라이딩(overriding)

상위 클래스의 메서드 중 하위 클래스에서 기능이 맞지 않거나 추가가 필요한 경우 재정의하는것.

 

Overriding(오버라이딩) : 상속으로 물려받은 메서드의 바디만 새로 작성(change)
Overloading(오버로딩) : 이름은 같지만 매개변수를 다르게 새로운 메서드를 선언(new)

 

class Parent{
public void method(){}
 }
class Child extends Parent{
public void method(){ System.out.println("오버라이딩") }//오버라이딩
public void method(int i){}//오버로딩
public void method2(){}//새로 선언
public void method2(int i){}//오버로딩
public void method(){}//error 중복
 }

 

 

가상 메서드

프로그램에서 변수는 그 타입을 따라간다.

가상 메서드의 경우는 타입과 상관없이 실제 생성된 인스턴스 메서드가 호출되는 원리.

Parent pa = new Child();

pa.method();

pa의 타입은 Parent 지만 실제 생성된 인스턴스인 Child클래스의 메서드가 호출된다.

-> public void method(){ System.out.println("오버라이딩") } 이 호출되는것.

 

 

다형성

은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나이다.

하나의 코드가 여러가지 자료형으로 구현되어 실행되는 것으로

객체지향 프로그래밍의 유연성, 재활용성, 유지보수성에 기본이 되는 특징이다.

 

Super타입의 참조변수로 Sub객체를 다룰 수 있는데 메서드는 오버라이딩 된 메서드가 호출된다.

하나의 Super클래스를 둔 여러개의 Sub클래스가 있다면 Super타입의 참조변수로 여러가지 메서드를 사용 할 수 있는것.

 

 

 

 

java.lang.Object

모든 클래스의 root Super클래스

Super클래스가 명시되지 않은 클래스라면 모두 extends Object가 있다고 보면된다.

 

class A > class B extends A > class  C extends B

C는 A를 상속받은 B를 상속받고 있으므로 A와도 상속 관계가 된다.

 

모든 클래스는 Object클래스를 상속 받고 있다.

 

Object클래스는 11개의 메서드를 가지고있다.

-> 모든 클래스가 11개의 메서드를 상속 받아 가지고있다.

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html

 

Object (Java SE 11 & JDK 11 )

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. A subclass overrides the finalize method to dispose of system resources or to perform other cleanup. The general contract of fi

docs.oracle.com

 

 

 

 

* toString() : 현재 클래스가 가지고 잇는 값들을 하나의 문자열로 만들 수 있도록 오버라이딩 할 수 있다.

 

* Object 타입의 변수를 선언하면 어떤 타입이든 모두 저장할 수 있다. (업캐스팅,묵시적 형변환)