본문 바로가기

Java

12-1장 추상 클래스

1. 추상 클래스의 정의 

 

 - 추상 메서드(abstract method)

  - 메서드의 본체가 완성되지 않은 미완성 메서드 

  - 중괄호 자체가 없음

  - 중괄호가 없기 때문에 끝을 알리는 세미콜론(;)으로 끝나야 함

 

abstract 리턴 타입 메서드명(입력매개변수);

abstract void abc();

 - 추상 클래스 (abstract class)

  - 추상 메서드를 1개 이상 포함하고 있는 클래스는 반드시 추상 클래스로 정의돼야 함

  - 추상 클래스는 메서드의 기능이 정의돼 있지 않은 미안성메서드가 1개 이상 있다는 의미

 

abstract class 클래스명 {
}

abstract class A {
	abstarct void abc();
    void bcd(){
    	//...
    }
}

  

2. 추상 클래스의 특징 

 

 - 추상 클래스는 내부의 미완성 메서드 때문에 객체를 직접 생성할 수 없음

 - 힙 메모리에 생성되는 객체는 내부 요소가 미완성된 상태로 들어 갈 수 없음

 -  A a = new A()와 같이 생성자의 호출 자체를 할 수 없음

 

 - 일반 클래스 = 붕어빵 기계

 - 객체 = 붕어빵

 - 추상 클래스 = 붕어빵 기계 부품

 - 붕어빵 기계 부품으로 붕어빵을 찍을 수는 없지만, 붕어빵 기계는 붕어빵 기계 부품으로 만들 수 있으며, 최종적으로 만들어진 붕어빵 기계로 붕어빵을 찍을 수 있음

 

 - 추상클래스는 직접 객체를 생성할 수 없지만 이 추상클래스를 상속한 자식 클래스를 생성하면 그 자식 클래스로 객체 생성가능

- 생성된 객체 내부에는 부모 클래스의 추상메서드가 구현돼 있음

 

-추상 클래스를 상속하는 자식 클래스는 부모에게 상속받은 미완성 메서드(추상 메서드)를 반드시 완성(오버라이딩)해야 함

 

- 오버라이딩 : 부모에게 상속받은 메서드를 자식 클래스에서 재정의 하는 것

- 구현(implement) : 부모에게 물려받은 미완성 메서드를 자식 클래스에서 완성하는 것

 

3. 추상 클래스 타입의 객체 생성 방법

 

 - 추상 클래스의 객체를 생성하는 방법은 자식 클래스의 생성 여부에 따라 2가지로 나뉨

 

1) 추상 클래스를 일반 클래스로 상속해 객체 생성

 

  - 자식 클래스 B가 일반 클래스로 정의되기 위해서는 반드시 상속 받은 추상 메서드 abc()를 구현해야 함

  - 클래스 B는 일반 클래스이므로 객체를 생성할 수 있고, 이렇게 생성한 객체는 다형적 표현으로 부모 추상 클래스 타입으로 선언 가능

  - 직접 자식 클래스를 생성하므로 일단 한 번 정의한 이후에는 자식 클래스 생성자의 호출만으로도 객체를 몇개든 생성 가능

  - 객체를 여러 개 만들어야 하는 상황에서 적절

 

package Abstractclass;

abstract class A {
	abstract void abc();
}

class B extends A{
	void abc() {
		System.out.println("방법 1. 자식 클래스 생성 및 추상 메서드 구현");
	}
}

public class Abstractclass1 {
	public static void main(String[] args) {
		//객체 생성
		A b1 = new B();
		A b2 = new B();
		
		//메서드 호출
		b1.abc();
		b2.abc();
	}
}

 

 2) 익명 이너 클래스 활용

 

 - 컴파일러가 내부적으로 추상 클래스를 상속해 메서드 오버라이딩을 수행한 클래스를 생성하고, 

  그 클래스로 객체를 생성하는 방법

 

 - 익명 이너 클래스 

클래스명 참조 변수명 = new 생성자() {
	//추상 클래스에 포함된 추상 메서드 오버라이딩
};

 - A()는 클래스 A의 생성자를 호출하는 것이 아니라 

  컴파일러가 클래스 A를 상속받아 abc() 메서드를 오버라이딩한 익명 클래스의 생성자를 호출한다는 것을 의미

 - 클래스명을 알 수 없기 떄문에 객체를 정의할 때 마다 익명 이너 클래스를 정의해야함

 - 한 번만 만들어 사용할 객체일 때 적절

 

package Abstractclass;

abstract class A {
	abstract void abc();
}

public class Abstractclass2 {
	public static void main(String[] args) {
		
		//객체 생성
		A a1 = new A() {
			void abc() {
				System.out.println("방법 2. 익명 이너 클래스 방법으로 객체생성");
			}
		};
		
		A a2 = new A() {
			void abc() {
				System.out.println("방법 2. 익명 이너 클래스 방법으로 객체생성");
			}
		};
		
		//메서드 호출
		a1.abc();
		a2.abc();
	}
}

'Java' 카테고리의 다른 글

13 -1 장 이너 클래스  (0) 2023.06.04
12 - 2장 인터페이스  (0) 2023.06.04
11-2장 abstract 제어자  (0) 2023.06.02
11-1장 final 제어자  (0) 2023.06.02
6-1 장 클래스와 객체의 개념  (2) 2023.04.24