[JAVA] 추상 클래스 및 메서드

:-)·2022년 4월 16일
0

☕ JAVA

목록 보기
6/15
post-thumbnail

추상화란?

  • 사전적 의미는 실체 간에 공통되는 특성을 추출한 것을 말한다.
  • JAVA에서의 추상화는 클래스들의 중요하고 공통된 성질들을 추출하여
    부모 클래스를 선정하는 개념이다.

JAVA에서의 추상화 기법

  • 특정 클래스를 상속받은 경우,
    부모의 특정 메서드들을 무조건 재정의하도록 강제하는 기법이다.
  • 특정 메서드를 재정의하도록 강제함으로써, 자식 클래스들을 작성하기 위한
    가이드의 역할을 할 수 있다.
  • 즉, 추상화 기법은 java 클래스를 작성하기 위한 설계도를 소스코드 형태로
    제시하는 역할을 한다.

추상화의 장점

  • 상속을 통해 간결한 코드
  • 생산성과 가독성 증가
  • 에러 감소
  • 유지 보수시 시간 단축
  • 코드의 재사용성 증가



📝 추상 클래스 (abstract class)

  • 클래스를 설계도에 비유한다면, 추상 클래스는 미완성 설계도에 비유할 수 있다.
  • 추상 클래스는 객체를 생성할 수 없고, 반드시 상속을 통해서만 사용될 수 있다.
  • 추상 메서드를 하나 이상 포함하고 있는 클래스는 반드시 '추상 클래스'로
    정의되어야 한다.
  • 추상 클래스는 다른 자식 클래스를 위한 '가이드라인'의 역할을 한다.

추상 클래스 선언

  • 추상 클래스 'abstract'키워드를 사용하여 정의할 수 있다.
  • 추상 클래스는 생성자, 멤버변수, 일반 메서드등을 포함할 수 있다.
    • 즉 공통 기능과 가이드라인을 모두 정의하여 다른 클래스에게 상속된다.
public abstract class Hello{
	// 멤버변수
    // 생성자
    // 일반 메서드
    // 추상 메서드
    ...
}

추상 클래스의 상속

  • 일반 클래스의 상속과 동일하게 'extends' 키워드를 사용한다.



📝 추상 메서드 (abstract method)

  • 추상 클래스에서만 선언할 수 있다.
  • 메서드의 선언부만 있고 구현부가 없는 '미완성 메서드'이다.
  • 추상 메서드는 자식 클래스가 구현해야 하는 메서드의 가이드라인만
    제시하기 위한 목적으로 사용된다.

추상 메서드 선언

  • 'abstract' 키워드를 사용하여 메서드를 정의한다.
  • 선언만 가능하고, 구현부를 위한 블록이 존재하지 않는다.
    • 중괄호{} 대신 문장의 끝을 알리는 세미콜론 ( ; ) 을 적어준다.
  • 추상 클래스를 상속받으면 자식은 부모의 모든 추상 메서드를 재정의 해야한다.
public abstract void sayHello();



✍ 코드 예시

// 육군 / 해군 / 공군 의 공통 기능을 명시하기 위한 부모 클래스

public abstract class Unit {
	private String name;

	public Unit(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	// 자식들이 재정의할 메서드를 추상으로 명시
	public abstract void attack();
	
	public abstract void move();
	
}
// 자식 클래스 

// 육군
public class Army extends Unit {
	
	public Army(String name) {
		super(name);
	}
	
    // 추상 메서드의 재정의를 요구한다.
	@Override
	public void attack() {
		System.out.println(this.getName() + ">> 육상공격");
	}

	@Override
	public void move() {
		System.out.println(this.getName() + ">> 육상이동");
	}

}

// 해군
public class Navy extends Unit {

	public Navy(String name) {
		super(name);
	}

	@Override
	public void attack() {
		System.out.println(this.getName() + ">> 해안공격");
	}

	@Override
	public void move() {
		System.out.println(this.getName() + ">> 해안이동");
	}
	
}

// 공군
public class AirForce extends Unit {

	public AirForce(String name) {
		super(name);
	}

	@Override
	public void attack() {
		System.out.println(this.getName() + ">> 공중공격");
	}

	@Override
	public void move() {
		System.out.println(this.getName() + ">> 공중이동");
	}

}
// Main 클래스

public class Main {

	public static void main(String[] args) {
		Unit[] u = new Unit[3];
		
		u[0] = new Army("육군");
		u[1] = new Navy("해군");
		u[2] = new AirForce("공군");
		
		for (int i = 0; i < u.length; i++) {
			u[i].attack();
			u[i].move();
			System.out.println("------------------------------------------");
		}
		
	}

}

👉 실행 결과

육군>> 육상공격
육군>> 육상이동
------------------------------------------
해군>> 해안공격
해군>> 해안이동
------------------------------------------
공군>> 공중공격
공군>> 공중이동
------------------------------------------

0개의 댓글