DevCastleOne

자바 상속이란?

2020. 12. 25. 17:00

오늘의 목표

1. 자바 상속의 특징

2. super 키워드

3. 메소드 오버라이딩

4. 다이나믹 메소드 디스패치

5. 추상 클래스

6. final 키워드

7. Object 클래스


 

 

1. 자바 상속의 특징

 

※상속이란?

현실에서 쓰는 단어와 비슷한 의미를 가지게 된다.

재산을 물려받는것처럼 클래스간의 상태를 물려받을수 있다. 

그때 사용하는 키워드가 extends 이다.

상속을 해주는 클래스는 부모 클래스 , 상속을 받는 클래스를 자손 클래스라고 부른다.

참고로 일반 class는 대부분 부모 클래스가 될수 있지만 extends를 사용할때는 is-a 관계가 아니면 사용해선 안된다.

 

상속을 사용하게 되면 자손 클래스는 몇가지 특징을 가지게 된다.

1. 부모의 생성자와 초기화 블럭은 상속되지 않는다. 멤버들만 상속된다.

2. 자손 클래스의 멤버 개수는 부모 클래스보다 많거나 같다.

3. 자손 클래스는 다중 상속이 아닌 단일 상속만 가능하다.

 

아래와 같이 상속을 사용할수 있다.

public class Animal {

    String name;
    int weight;

}


public class Monkey extends Animal{
    public Monkey(String name,int weight){
        this.name = name;
        this.weight = weight;
    }

    public void print(){
        System.out.println("이름은 : " + name + ", 무게는 : " + weight);
    }

    public static void main(String[] args) {
        Monkey monkey = new Monkey("원숭이",20);
        monkey.print();
    }
}

========================결과========================	
이름은 : 원숭이, 무게는 : 20

 

2. super 키워드

 

※super

자손 클래스에서 부모 클래스의 상속받은 멤버를 참조하는데 사용하기 위한 키워드이다.

자신의 클래스에서 멤버변수와 전달받은 매개변수와 이름이 같을때 this 키워드를 사용 하듯이

부모의 멤버와 중복될때 사용하는것이 좋다.

모든 인스턴스 메소드에는 자신이 속한 인스턴스 주소가 지역 변수로 저장되는데 이것이 this와 super라고 한다.

static 메서드는 인스턴스와 상관이 없기 때문에 this , super를 사용할수 없다.

 

public class Animal {

    String name = "이름";
    int weight = 0;

}

public class Monkey extends Animal{

    String name;
    int weight;

    public Monkey(String name,int weight){
        this.name = name;
        this.weight = weight;
    }

    public void print(){
        System.out.println("부모의 이름은 : " + super.name + ", 부모의 무게는 : " + super.weight);
        System.out.println("이름은 : " + name + ", 무게는 : " + weight);
    }

    public static void main(String[] args) {
        Monkey monkey = new Monkey("원숭이",20);
        monkey.print();
    }
}

======================결과======================
부모의 이름은 : 이름, 부모의 무게는 : 0
이름은 : 원숭이, 무게는 : 20

※super()

this() 처럼 super() 또한 생성자 이다.

그러나 this()는 자신(같은 클래스)의 다른 생성자를 호출하는 반면에 super()는 부모의 생성자를 호출한다.

자손 클래스를 사용하기 위해서는 먼저 부모의 클래스가 초기화 되어야 한다.

기본적으로 자손의 클래스의 생성자에서 별다른 코드를 적지 않아도 부모 클래스가 초기화 되는데

그 이유는 컴파일러가 자동적으로 super() 메소드를 생성해준다.

단, 생성자의 제일 첫줄에 적용되어야 한다. 부모 생성자를 생성하기전에 자식의 생성자에서 어떠한 작업도 할수없기 때문이다.

 

public class Animal {

    String name;
    int weight;
    String country;

    public Animal(){
        this.name = "이름";
        this.weight = 0;
        System.out.println("Animal 기본 생성자 호출");
    }

    public Animal(String country){
        this.name = "이름";
        this.weight = 0;
        this.country = country;
        System.out.println("Animal 매개변수1 생성자 호출");
    }

}

public class Monkey extends Animal{

    String name;
    int weight;

    public Monkey(String name,int weight){
        this.name = name;
        this.weight = weight;
    }

    public Monkey(String name,int weight,String country){
        super(country);
        this.name = name;
        this.weight = weight;
    }

    public void print(){
        System.out.println("부모의 이름은 : " + super.name + ", 부모의 무게는 : " + super.weight + ", 부모의 나라는 : " + super.country);
        System.out.println("이름은 : " + name + ", 무게는 : " + weight);
    }

    public static void main(String[] args) {
        Monkey monkey = new Monkey("원숭이",20);
        monkey.print();
        System.out.println("=========================================");
        Monkey monkey1 = new Monkey("원숭이",20,"한국");
        monkey1.print();
    }
}
==========================결과==========================
Animal 기본 생성자 호출
부모의 이름은 : 이름, 부모의 무게는 : 0, 부모의 나라는 : null
이름은 : 원숭이, 무게는 : 20
=========================================
Animal 매개변수1 생성자 호출
부모의 이름은 : 이름, 부모의 무게는 : 0, 부모의 나라는 : 한국
이름은 : 원숭이, 무게는 : 20

 

 

3. 메소드 오버라이딩

오버라이딩이랑 부모 클래스로 상속받은 메소드의 내용( {} 블록안의 내용 )을 변경하는것을 말한다.

부모에서는 틀만 잡고 자식에서 내용을 구체화하기 위해 오버라이딩을 한다.

 

오버라이딩 하는 메소드에는 몇가지 조건이 있다.

1. 이름이 같아야 한다 , 매개변수가 같아야 한다. ( Method Signature 가 같아야 함 )

3. 반환 타입이 같아야 한다.

4. 접근 제어자는 조상 클래스의 메소드 보다 좁은 범위로 변경 할수없다.

 

4. 다이나믹 메소드 디스패치

castleone.tistory.com/9

 

5. 추상 클래스

미완성된 클래스란 의미를 가지고 있고 미완성이란것은 미완성 메서드를 가지고 있다는 것이다.

추상 클래스 자체로서는 클래스의 의미를 다 할수없지만 상속받는 클래스들(자손 클래스)의 틀을 잡아주는 역할을 한다.

클래스 앞에 abstract 키워드를 붙이면 추상 클래스가 된다.

 

추상 메소드 특징

1. 일반 클래스와 다르지 않으며 abstract 메소드를 가질수 있다.

2. abtract 메소드란 선언부만 구현되어있고 구현부는 작성되지 않은것이다.

 

<추상 클래스>
abstract class Sample{ 

}

<추상 메소드>
abstract class Sample{ 
	abstract void sampleMethod();
}

 

6. final 키워드

 

변경될수 없는 상태를 만들때 사용한다.

final 키워드가 어디에 붙는지에 따라 역할이 조금씩 달라지긴 한다.

 

클래스 : 변경될수 없는 클래스 ( 상속 불가능 클래스 )

메소드 : 변경될수 없는 메소드 ( 오버라이딩 불가능 메소드 )

멤버변수 :  값을 변경할수 없는 상수가 된다.

 

public final class Test{ //부모가 될수 없음
    
    final int a = 10; //값을 변경할수 없는 멤버변수 ( 상수 )
    
    final void print(){ // 오버라이딩 할수없는 메서드
        System.out.println("test");
    }    
    
}

 

7. Object 클래스

 

모든 클래스의 최상위 클래스이다.

모든 클래스는 명시적으로 extends Object로 적어주지 않아도 Object를 상속받게 된다.

그렇기 때문에 Object 클래스의 메소드를 오버라이딩 할수있다.

equals() , toString() 등의 메소드를 사용할수있다.

 

 

'JAVA' 카테고리의 다른 글

[JAVA] 자바 패키지란?  (0) 2020.12.30
자바 Dispatch란? ( static , dynamic , double Dispatch )  (0) 2020.12.25
[JAVA] 클래스란?  (0) 2020.12.16
Java13 switch 연산자  (0) 2020.11.28
JAVA] 자바 데이터 타입, 변수 그리고 배열  (0) 2020.11.21

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band