본문 바로가기
Java & Kotlin/Java

16. 상속 (extends, 오버라이드)

by heekng 2021. 1. 19.
반응형
 

상속이란? 클래스간의 관계 중 겹치는 필드, 메소드를 가지고 있는 클래스가 존재할 때, 해당 필드와 메소드만 가지고 있는 클래스를 생성해서 코드 작성의 효율을 높이기 위한 방법입니다.

상속은 부모클래스와 자식클래스로 이루어져 있습니다.

자바에서의 상속은 부모가 주체가 아닌 자식이 주체이며 부모는 자식이 구성하는 일부분 또는 전체를 가지고 있습니다.

하나의 자식클래스에는 하나의 부모클래스만 존재합니다. 하지만 하나의 부모클래스에는 여러개의 자식클래스를 가질 수 있습니다.


1. 클래스 상속 방법

1

2

3

4

5

public class Parents{ //부모클래스 Parents

// 자식클래스에서 공통으로 가지고 있을 필드

String name;

int age;

}

부모클래스 Parents는 필드로 name과 age를 가지고 있습니다.

1

2

3

4

5

public class Child_1 extends Parents{ //Parents클래스를 상속받는 자식클래스

void aaa() {

System.out.println("자식1 클래스의 aaa 메소드");

}

}

부모클래스를 상속받는 자식클래스는 public class [클래스명] extends [부모클래스명] 으로 작성합니다.

Parents 클래스를 상속받는 Child_1클래스는 aaa메소드를 가지고 있습니다.

1

2

3

4

5

public class Child_2 extends Parents { //Parents클래스를 상속받는 자식클래스

void bbb() {

System.out.println("자식2 클래스의 bbb 메소드");

}

}

Child_2 클래스 또한 자식클래스이며 bbb메소드를 가지고 있습니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class ExtendsMain {

public static void main(String[] args) {

Parents parents = new Parents(); //부모

parents.age = 13;

parents.name = "홍길동";

 

Child_1 child_1 = new Child_1(); //자식1

child_1.age = 15; //상속받은 부모클래스의 필드

child_1.name = "임꺽정"; //상속받은 부모클래스의 필드

child_1.aaa(); //자식1 클래스의 메소드

 

Child_2 child_2 = new Child_2(); //자식2

child_2.age = 20; //상속받은 부모클래스의 필드

child_2.name = "뭐하지"; //상속받은 부모클래스의 필드

child_2.bbb(); //자식2 클래스의 메소드

}

}

main에서 작성한 필드와 메소드를 사용할 때를 확인하면

부모클래스인 Parents클래스의 객체는 Parents클래스의 필드인 age와 name만을 사용할 수 있고

Parents클래스를 상속받은 자식클래스 Child_1클래스는 부모의 필드인 age와 name을 사용하면서 Child_1클래스의 메소드인 aaa()도 사용 가능합니다.

같은 형태로 Child_2클래스의 객체도 부모의 필드와 Child_2클래스의 메소드를 사용할 수 있습니다.

정리하면, 상속관계에서 부모클래스의 필드와 메소드, 생성자는 자식클래스에서 사용할 수 있습니다.


2. 오버라이드(재정의)

클래스 상속의 이유에는 생성자, 메소드, 필드를 상속받는 것 뿐만이 아니라 상속받은 메소드를 재정의할 수 있습니다.

메소드 재정의 즉, 오버라이드는 다음과 같이 사용할 수 있습니다.

1

2

3

4

5

6

7

8

9

public class Parents{ //부모클래스 Parents

// 자식클래스에서 공통으로 가지고 있을 필드

String name;

int age;

 

public void parentsMethod() {

System.out.println("부모클래스의 메소드");

}

}

부모클래스에 parentsMethod메소드를 생성합니다.

1

2

3

public class Child_1 extends Parents{ //Parents클래스를 상속받는 자식클래스

 

}

자식클래스 Child_1는 Parents클래스를 상속받습니다.

1

2

3

4

5

6

7

public class ExtendsMain {

public static void main(String[] args) {

Child_1 child_1 = new Child_1(); //자식

 

child_1.parentsMethod(); //상속받은 부모클래스의 메소드

}

}

main속에서 자식클래스 child_1 객체생성한 후 상속받은 메소드를 실행하면

위와 같이 부모클래스 그대로의 메소드가 실행됩니다.

이때 자식클래스에서 부모클래스의 메소드를 오버라이딩하고 자식클래스 객체에서 메소드를 불러오면

1

2

3

4

5

6

public class Child_1 extends Parents{ //Parents클래스를 상속받는 자식클래스

@Override

public void parentsMethod() {

System.out.println("자식클래스의 오버라이딩한 메소드");

}

}

위와 같이 오버라이딩한 메소드가 출력됩니다.

오버라이드 규칙은 부모의 메소드와 자식 메소드가 동일한 리턴타입, 메소드 이름, 매개변수를 가지며, 접근제어자를 부모클래스의 메소드보다 좁은 범위로 변경할 수 없고, 예외는 조상 클래스의 메서드보다 많이 선언할 수 없습니다.

인스턴스 메소드를 static메서드로 또는 그 반대로 변경할 수 없습니다.

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

20.11.09 - 배열 예제  (0) 2021.01.19
20.11.04 - 반복문 예제  (0) 2021.01.19
20.11.03 - 연산자 예제  (0) 2021.01.19
15. 싱글톤 (Singleton)  (0) 2021.01.19
14. 접근제한자(public, protected, private, default), getter, setter  (0) 2021.01.19
13. final  (0) 2021.01.19