42_JAVA Study 04 - 상속

20571 단어 Java상속Java

상속(Inheritance)

일반적인 상속의 개념처럼 부모 → 자식 에게 받는 것이 아닌 자식 → 부모를 선택해 상속 받는다.

상속받은 클래스 = 자식 클래스, 하위 클래스, 서브 클래스 라고 부른다
상속해 준 클래스 = 부모 클래스, 상위 클래스, 슈퍼 클래스

상속의 대상

자식 클래스가 상속을 받게 되면 부모 클래스의 필드와 메소드를 받는다.
단, private를 갖는 필드나 메소드는 상속이 불가하고, 패키지가 다른 경우 default인 경우에도 상속이 불가

상속의 방법(선언)

상속받을 자식 클래스 뒤에 extends 키워드를 사용하고 부모 클래스를 적으면 된다

class /*자식 클래스*/ extends /*부모 클래스*/{
    ..
}

자바에서는 자식 클래스가 여러 부모로부터 다중 상속을 받는 것은 불가능하다.
1 개의 부모 클래스로부터 단일 상속만 허용된다. 하지만 여러 개의 자식 클래스에게 상속이 가능

상속의 사용 (예제)

  • 예제1
class A {
	String aField = "클래스 A 필드";
	public void aMethod() {
		System.out.println(aField);
	// System.out.println("A : "+ bField); 
        // 컴파일 에러(자식 필드 사용 불가)
	}
}
    
class B extends A {
	String bField = "클래스 B 필드";
	public void bMethod() {
		System.out.println(aField); // 부모 클래스 필드 사용
		System.out.println(bField); // 본인 클래스 필드 사용
	// System.out.println("B : "+cField); 
    // 컴파일 에러(자식 필드 사용 불가)
	}
}
class C extends B {
	String cField = "클래스 C 필드";
	public void cMethod() {
		System.out.println(aField); // 조부모 클래스 필드 사용
		System.out.println(bField); // 부모 클래스 필드 사용
		System.out.println(cField); // 본인 클래스 필드 사용
	}
}
public class SuperSubEx01 {
	public static void main(String[] args) {
		System.out.println("----------A----------");
		A a = new A();
		a.aMethod(); // 본인 메소드 사용
		// a.bMethod(); // A(부모) 객체로 B(자식) 메소드 접근 불가
		System.out.println("----------A----------");
		System.out.println("----------B----------");
		B b = new B();
		b.aMethod(); // 부모 메소드 사용
		b.bMethod(); // 본인 메소드 사용
		// b.cMethod(); // B(부모) 객체로 C(자식) 메소드 접근 불가
		System.out.println("----------B----------");
		System.out.println("----------C----------");
		C c = new C();
		c.aMethod(); // 조부모 메소드 사용
		c.bMethod(); // 부모 메소드 사용
		c.cMethod(); // 본인 메소드 사용
		System.out.println("----------C----------");
	}
}

A, B, C를 각각 정의하고 A(조부모)→B(부모)→C(자식) 순으로 상속을 받는다.
각 메소드에서 부모 클래스의 필드를 자식 클래스가 사용하여 데이터를 출력한다

main에서 각 클래스 별로 인스턴스를 생성하고 자식 클래스에서 부모 클래스의 메소드를 호출한다

  • 예제2
import java.util.Scanner;
class SuperClass {
    int a, b; // 필드
    public void setA(int a) {
    	this.a = a; // 필드 a값 설정
    }
    public void setB(int b) {
    	this.b = b; // 필드 b값 설정
    }
    public void sum() {
    	System.out.println("덧셈 : " + (a + b));
    }
    public void substract() {
    	System.out.println("뺄셈 : " + (a - b));
    }
}
    
class SubClass extends SuperClass {
	public void mul() {
    	System.out.println("곱셈 : " + a * b);
	}
	public void div() {
		System.out.println("나눗셈 : " + a / b);
	}
}
    
public class SuperSubEx02 {
	public static void main(String[] args) {
		System.out.println("2개의 정수 입력");
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		SubClass sub = new SubClass();
		sub.setA(a); // 매개값 전달
		sub.setB(b); // 매개값 전달
		sub.sum();
		sub.substract();
		sub.mul();
		sub.div();
  	}
}

자식 클래스에서 부모 클래스의 기능을 물려받고 필요한 기능을 추가한 예제.
자식 클래스가 부모 클래스보다 더 다양한 기능을 수행할 수 있다.

main에서 서브 클래스로 인스턴스를 생성

💡 요약
  1. class /*자식 클래스*/ extends /*부모 클래스*/{ .. }
  2. 자식은 부모로부터 메소드와 필드를 물려받는다.
    2-1. 부모는 자식에서 정의한 메소드나 필드를 사용하지 못한다 (자식 = 자신 + 부모 / 부모 = 자신)
  3. 자식은 하나의 부모에게만 상속 받을 수 있다. 단일 상속만 가능하다.
  4. 부모는 여러 자식에게 상속이 가능하다
  5. 자식 클래스가 더 다양한 기능이 가능하기 때문에 자식 클래스로 인스턴스를 생성하는 것이 효율적

super와 super()

  • protected protectedpubicdefault접근 제한의 중간에 해당한다. 같은 패키지에서는 default와 같이 접근 제한은 없지만 다른 패키지에서는 자식 클래스만 접근을 허용한다

좋은 웹페이지 즐겨찾기