Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

히바리 쿄야 와 함께 하는 Developer Cafe

[4일차] DO IT 자바프로그래밍/ P232 ~ 312 / 08 상속, 추상클래스 본문

Java

[4일차] DO IT 자바프로그래밍/ P232 ~ 312 / 08 상속, 추상클래스

TWICE&GFRIEND 2020. 12. 22. 17:38

상속 (inheritance) : extends -> 연장, 확대하다,  class B extends A  -->  B 클래스가 A 상속 받는다

 

Class (자식) 클래스명 extends (부모) 클래스명

 

1. 상속 방법 : class 클래스(자식) extends 클래스(부모)

2. 자식 클래스는 부모 클래스로부터 메소드와 필드를 물려받아 사용한다. 부모 클래스는 자식 클래스에서

   정의한 메소드나 필드를 사용하지 못한다.(자식 = 자신 + 부모 / 부모 = 자신)

3. 자식 클래스는 여러 부모 클래스로부터 상속받지 못한다. 즉, 단일상속만 가능하다.

4. 부모 클래스는 여러 자식 클래스에게 상속이 가능하다.

5. 자식 클래스가 더 다양한 기능이 가능하므로 자식 클래스로 인스턴스를 생성하는 것이 효율적이다.

 

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클래스를 각각 정의하고 각 클래스 별로 필드(전역변수)와 메소드를 정의하였다.

그리고 B는 A에게 C는 B에게 상속을 받는다.(A→B→C)

각 메소드에서 부모 클래스의 필드를 자식 클래스가 사용하여 데이터를 출력한다. 

main 메소드에서는 각 클래스 별로 인스턴스를 생성하고 자식 클래스 인스턴스에서

부모 클래스의 메소드를 호출하는 내용이다. 결과적으론 모두 가능하다.

세부 내용은 소스 코드의 주석 처리된 부분을 참고하면 된다.

 

abstract class Animal {
    public String sName; //일반 멤버 변수
    ….
    public void move() { …} // 일반 메소드 
    abstract void howl(); //추상 메소드
    …
}

 

추상 클래스(abstract class)란 하나 이상의 추상 메소드(abstract method)를 포함하는 클래스이다. 추상 메소드는 선언만 있고 본체는 없는 함수이며 선언부에 ‘abstract’ 라는 키워드를 붙인다. 추상 메소드가 포함되었다면 클래스도 추상 클래스이므로 클래스명 앞에도 ‘abstract’키워드를 붙여야 한다.

 

 

 

추상 클래스는 추상 메서드를 포함하고 객체화 할 수 없다는 점만 제외하고 일반 클래스와 다르지 않으며 생성자, 멤버변수와 일반 메서드도 가질 수 있다. 추상 클래스 자체로는 클래스로의 역할을 하지 못하며 객체를 생성할 수 없지만 새로운 클래스를 작성하는데 있어서 부모 클래스로서 중요한 역할을 갖는다. 위의 예에서 Animal 클래스는 직접 객체를 생성하지 못하고 이를 상속받는 자식 클래스에서는 추상 메소드의 구체적인 본체를 가질 수 있다.

 

 

추상 메소드의 접근 지정자로 private는 사용할 수 없는데 이는 자식 클래스에서 받아서 구현되어야 하므로 당연하다. 다른 접근 지정자(public, protected)는 사용할 수 있고 생략되면 default (즉, 같은 패키지 안에서만 접근 가능)인 것은 일반 클래스와 동일하다.




Comments