Burninghering's Blog
article thumbnail

추상 클래스(abstract class) 구현하기

 

추상의 반대말은 구체적(Concrete)

추상 클래스란?

  • 구현 코드 없이 메서드의 선언만 있는 추상 메서드(abstract method)를 포함한 클래스
  • 메서드 선언(declaration) : 반환타입, 메서드 이름, 매개변수로 구성
  • 메서드 정의(definition) : 메서드 구현(implementation)과 동일한 의미이며 구현부(body) 를 가짐 ({ })
예) int add(int x, int y); // 선언 (세미콜론이 있기 때문에 구현부가 없는 것임)
	//구현 메소드가 없으므로 하는 일이 없으니 추상 메서드가 되는 것
    //추상 클래스는 이러한 추상 메서드를 포함한 클래스를 말함
    
   int add(int x, int y){ } // 구현부가 있음, 추상 메서드 아님
  • abstract 예약어를 사용
  • 추상 클래스는 new 할 수 없음 ( 인스턴스화 할 수 없음 )

 

추상 클래스 구현하기

  • 메서드에 구현 코드가 없으면 abstract 로 선언
  • abstract로 선언된 메서드를 가진 클래스는 abstract로 선언
  • 모든 메서드가 구현 된 클래스라도 abstract로 선언되면 추상 클래스로 인스턴스화 할 수 없음
  • 추상 클래스의 추상 메서드는 하위 클래스가 상속 하여 구현
  • 추상 클래스 내의 추상 메서드 : 하위 클래스가 구현해야 하는 메서드
  • 추상 클래스 내의 구현 된 메서드 : 하위 클래스가 공통으로 사용하는 메서드 ( 필요에 따라 하위 클래스에서 재정의 함 )
  • 예제 구현하기

클래스 다이어그램

이탤릭체로 된 것이 추상, 정자로 된 것이 구현된 메소드

추상 메서드를 포함한 클래스는 인스턴스화 할 수 없다!

(Computer의 구현되지도 않은 display()를 쓰려고 할 수도 있으니까)

안된다 이놈아 

 

 

에러 발생 -> 구현부를 넣던지/abstract를 넣어라
클래스에서도 에러 발생

둘 다 abstract를 넣어주었다.

 

Computer.java

package ch09;

public abstract class Computer {
	public abstract void display(); //이 클래스에서 구현하지 못할 메서드는 추상 메서드로 놓고, 하위 클래스에 책임을 위임 
	public abstract void typing(); //나는 구현하지 않을 것이니 상속받을 너희가 구현해라!
	
	void turnOn() {
		System.out.println("전원을 켭니다."); //하위 클래스들이 공통으로 쓸 메소드는 구현해놓음
	}
	void turnOff() {
		System.out.println("전원을 끕니다.");
	}
}

 

Computer를 상속받게 되면, 두개의 추상 메소드를 포함하게 된다. 그렇다면,

1. Desktop 또한 abstract 클래스가 되기

2. 상위 클래스에서 구현하지 않은 추상 메서드를 Desktop에서 구현하기

결정해!

 

 

Desktop.java

package ch09;

public class Desktop extends Computer { // Computer를 상속받게 되면, 두개의 추상 메소드를 포함하게 됨

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

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

	@Override
	void turnOff() {
		System.out.println("Desktop turnoff");
	}
}

 

NoteBook.java

package ch09;

public abstract class NoteBook extends Computer { //추상 메서드 하나만 구현했으니 얘도 추상 클래스가 됐어

	@Override
	public void display() { //추상 메서드 하나만 구현할거야.. 
		System.out.println("NoteBook display");
	}
}

 

MyNoteBook.java

package ch09;

public class MyNoteBook extends NoteBook { //아까 구현하지 않은 메서드를 구현하라고 몹시 화낸다

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

 

ComputerTest.java

package ch09;

public class ComputerTest {

	public static void main(String[] args) {
		Computer desktop = new Desktop(); //상위 클래스 타입으로 선언(상속과 똑같으며 업캐스팅)
		//상위 클래스로 타입을 정했으니, 하위 클래스 Desktop에 새로 구현된 클래스는 쓸 수 없다.
		
//		Computer computer=new Computer(); //안돼!
		
		desktop.display();
	}
}

 

결론

추상 클래스는 "상속"을 하기 위해 만든 클래스이다.

추상 클래스 안에 구현하는 메소드는 일부는 구현할 수도, 구현 안할수도, 전부 구현 안할 수도 있다.

상위 클래스에서, 하위클래스가 쓸 공통 메서드는 구현하고,

너네 자식 클래스들이 알아서 해! 할 메서드는 추상메서드로 비워둔다.

 

하지만 하위클래스가 상위클래스가 구현하지 않은 메서드들을 다 구현했음에도 불구하고

추상클래스로 두는 경우는

상속만을 위한 클래스로 쓰기 위해서다. (Desktop 클래스를 abstract 할 수 있다. 하지만 new 하지는 못한다)

 

참고하기

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.