[JAVA] 상속이란?

📢 상속

상속이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는것입니다.

상속을 사용하면 기존에 정의되어 있는 클래스의 모든 필드 메소드를 물려받을수 있습니다.

기존의 정의된 클래스를 부모클래스라 하고 상속을 통해 작성되는 클래스는 자식클래스라 합니다.

class 자식클래스이름 extends 부모클래스이름{...}
* 상속은 위와 같은 문법으로 진행됩니다.

상속을 사용하는 이유

  1. 기존에 작성된 클래스를 재활용 할 수 있습니다.
  2. 자식 클래스 설계시 부모클래스의 중복된 멤버 변수가 있을경우 작성하지 않아도 됩니다.
  3. 클래스 간의 계층적 관계를 구성합니다.
class Car {
    public int speed = 10;
    public String color ="red";
}

class SuperCar extends Car{
    void print(){
        System.out.println("차량의 속도 : "+speed);
        System.out.println("차량의 색 : " +color);
    }
}

위의 코드를 보면 SuperCar는 변수를 할당받지 않았지만 부모클래스의 변수를 사용할수 있습니다.

📢 Super

super 키워드

  • super 키워드는 부모의 클래스로부터 상속받은 필드나 메소드를 자식에서 참조할때 사용되는 변수입니다.

    	* 비슷한 예로 클래스의 this 키워드를 생각하면 좋습니다!!

super() 메소드

  • super() 메서드는 부모 클래스의 생성자를 호출할때 사용됩니다.

  • 보통 컴파일러가 자동으로 끼워 넣어줍니다.

  • 부모 클래스에 기본 생성자가 없을때 super()를 쓰게 되면 오류가 발생합니다.

📢 Method overriding

상속은 부모의 메서드를 가져다 쓸때 이를 재정의 할수있는데 이를 오버라이딩 이라고 합니다.

class Car {
    int speed = 10;
    String color ="red";

    void print(){
        System.out.println("차량의 속도 : "+speed);
        System.out.println("차량의 색 : " +color);
    }
}

class SuperCar extends Car{
    String sound = "부릉";

    @Override --> //이놈은 친절히 오버라이드에요~~ 라고알려주는 놈이다.
    void print() {
        System.out.println("차량소리 : "+sound);
    }
}

위처럼 오버라이딩은 위와 같이 부모의 함수를 재정의하는 기능입니다.
그렇기 때문에 함수이름, 반환값, 매개변수가 모두 동일해야 합니다.

🧨 그럼 이름은같은데 매개변수나가 다를경우는 어떻게 될까요?

class Car {
    int speed = 10;
    String color ="red";

    void print(){
        System.out.println("차량의 속도 : "+speed);
        System.out.println("차량의 색 : " +color);
    }
}

class SuperCar extends Car{

    //@Override
    void print(String sound) {
        System.out.println("차량소리 : "+sound);
    }
}

위와 같이 함수이름은 같고 매개변수가 다를경우에는 오버로딩 이됩니다.

📢 다이내믹 메서드 디스패치

다이내믹 메서드 디스패치를 알기 위해선 먼저 디스패치를 알아야합니다.

Dispatch

프로그램이 어떤 메소드를 호출할 것인가를 결정하여 그것을 실행하는 과정을 말합니다.

디스패치의 종류는 2가지가 있습니다.

1. Static Dispatch

  • 컴파일 시점에서 컴파일러가 어떤 메소드를 실행해야하는지 알고있는 경우
class Car {
    int speed = 10;
    String color ="red";

    void print(){
        System.out.println("차량의 속도 : "+speed);
        System.out.println("차량의 색 : " +color);
    }

    public static void main(String[] args) {
        SuperCar superCar = new SuperCar();
        superCar.print();
    }
}

class SuperCar extends Car{
    String sound = "부릉";

    void print() {
        System.out.println("차량소리 : "+sound);
    }
}

위의 코드 처럼 SuperCar.print()를 했을경우 SuperCar 클래스의 오버라이딩 된 함수가 불릴 것을 알고있습니다. 이처럼 저희가 알고있는사실을 컴파일러도 알고있는 경우를 정적 메소드 디스패치라고 합니다.

2. Dynamic Dispatch

  • Static Dispatch 와는 반대로 컴파일러가 어떤 메서드를 호출하는지 모르는 경우

  • 이경우에는 호출할 메서드를 런타임 시점에서 결정한다.

3. Double Dispatch 이부분은 아직잘 모르겠다.

📢 추상 클래스

추상 클래스란 하나 이상의 추상 메소드를 가진 클래스를 뜻합니다.

추상클래스에는 abstract가 꼭 들어가야하고 자식 클래스에게 추상 메소드의 정의를 강제 합니다.

추상 클래스는 추상 메소드가 있다는것 말고는 일반적인 클래스와 크게 다를것이 없습니다.

추상 메소드

추상 메소드란 반드시 오버라이딩 해야만 사용할수 있습니다.

문법 abstrcat 반환타입 메소드이름();

위와 같이 선언부만 있고 구현부가 없어서 오버라이딩 해야한다는 것입니다.

📢 final 키워드

  • final 키워드는 변수 , 메서드 , 클래스에 사용될 수 있습니다.

  • final 키워드를 붙인다는것은 붙여진 무언가를 제한한다는 의미를 가집니다.

  • class에 final이 붙으면 변경이 불가능한 클래스가 됩니다.

  • 메소드에 final이 붙으면 오버라이딩을 통해 재정의를 할수없게 됩니다.

  • 변수에 붙으면 값을 변경할 수 없는 상수가 됩니다.

final String hello = "Hello world";

hello = "hoChul"--> 에러
------------------------------------------------
final class Car{ // 변경불가능한 클래스
	final int speed = 100; // 값 변경 불가능

	final void getSpeed(){
    	return speed; // 오버라이딩 불가능
    }
}

SuperCar extends Car{... <-- 오류
}
  • 위의 코드와 같이 final 키워드가 붙은 값들은 초기화 후 변경할수 없습니다.

📢 Object

  • java의 최상위 클래스 입니다.

  • 생성한 모든 클래스는 object 기본 메서드가 포함됩니다.

  • Object 클래스는 필드를 가지지 않으며 11개의 메소드로만 구성되어있습니다.

object 메서드 종류

🎈출처: http://www.tcpschool.com/java/java_api_object

좋은 웹페이지 즐겨찾기