Abstract Class with Java

민준·2023년 3월 6일
0
post-thumbnail

1. Abstract Class

추상 클래스 는 구현 코드 없이 메서드의 선언만 있습니다. 추상 메서드를 포함한 클래스도 추상 클래스라고 합니다.
abstract 예약어를 사용하고 인스턴스화(new) 할 수 없습니다.
<-> 'Concreate Class'

프레임워크를 사용할 때 이미 abstract로 선언되어 구현해야되는 것이 이미 내부적으로 틀이 짜여져 있는 경우가 있습니다.
상위 클래스에서는 구현하지 못하는 부분들을 하위 클래스에 위임합니다.
또는 상속만을 위한 클래스로 선언하기도 합니다.

상속받는 하위 클래스는 해당 메서스들에 대해 구현에 대한 책임이 있다고 표현하고
반면 상위 클래스 입장에서는 하위 클래스에 메서드를 위임시켰다고 표현합니다.

// 상위 클래스 'Computer'
// 'abstract' 메서드를 가지려면 클래스 자체도 'abstract' 가 되어야 합니다.
public abstract class Computer { 

	// 선언만 하고, 구현은 하지 않습니다. 이는 하위 클래스에서 구체적으로 구현하게 됩니다.
    // 중괄호가 있는 경우 구현부가 있는 것이고 이를 'Body'가 있다고 합니다.
	public abstract void display();
	public abstract void typing(); 
	
	public void turnOn() {
		System.out.println("전원을 켭니다.");
	}
	
	public void turnOff() {
		System.out.println("전원을 끕니다.");
	}
}

책임을 위임받은 하위 클래스 내부에 아무것도 구현되지 않으면 컴파일 되지 않습니다.
이때 선택지는 위임받은 메서드를 구현하거나 또는 'abstract'를 넣어 추상 클래스로 만들 수 있습니다.

// 하위 클래스 'DeskTop'
// 상위 클래스에서 선언한 메서드를 구현했습니다.
public class DeskTop extends Computer{

	@Override
	public void display() {
		System.out.println("DeskTop display()");
	}

	@Override
	public void typing() {
		System.out.println("DeskTop typing()");
	}
}

하위 클래스는 상위 클래스에서 위임한 '모든' 메서드를 구현하거나 'abstract' 해야 합니다.
여기에선 하나의 메서드만 구현했으므로 'abstract'를 선택했습니다.

// 하위 클래스 'NoteBook'
public abstract class NoteBook extends Computer {

	@Override
	public void display() {
		System.out.println("NoteBook display()");
	}
}

아래는 'Computer' 클래스를 상속받은 'NoteBook' 클래스를 다시 상속받아 위임 받은 메서드를 구현합니다.
위에서 'NoteBook' 클래스는 'display()' 메서드만 구현하고 추상 클래스로 돌렸으니
그 아래에 다시 상속받은 'MyNoteBook' 클래스는 'typing()' 메서드를 구현할 책임이 있습니다.

public class MyNoteBook extends NoteBook{

	@Override
	public void typing() {
		System.out.println("MyNoteBook typing()");
	}
}

[1] 추상 클래스는 인스턴스화 할 수 없습니다.

'display()' 메서드는 'Computer' 클래스 내에 구현되어 있지 않아 수행될 수 없기 때문에 객체를 생성할 수 없습니다.

[2] 업 캐스팅

변수의 자료형 클래스의 것들만 호출할 수 있습니다.
해당 객체의 타입은 상위 클래스인 'Computer'이지만 내부에 메서드가 선언만 되었고
하위 클래스 내에 메서드가 구현되어 마치 오버라이딩된 메서드를 호출하는 것과 같습니다.(오버라이딩 자체인가..?)

'c3'의 경우 'Computer'를 상속받은 'NoteBook'을 다시 상속받은 'MyNoteBook'를 객체로 생성했는데
'display()' 메서드를 호출했더니 'NoteBook'에서 구현한 내용이 출력됩니다.

public class ComputerTest {

	public static void main(String[] args) {

		// [1] Computer c1 = new Computer();
		// c1.display();
		
        // [2]
		Computer c2 = new DeskTop();
		Computer c3 = new MyNoteBook();
		NoteBook c4 = new MyNoteBook();
		
		c2.display();
		c3.display();
	}
}
profile
백엔드 포지션 공부 중입니다.

0개의 댓글