[Java] 자바 #22, 추상클래스(Abstract), 오버라이딩(Overriding)

추상클래스

- 객체를 직접 생성할 수 있는 클래스를 실체클래스라고 한다면

- 클래스들의 공통적인 특성을 추출해서 선언한 클래스를 추상클래스라고 함

- 추상클래스가 부모, 실체클래스가 자식으로 상속관계를 통해 추상클래스의 모든 특성을 물려받는 형태로 쓰인다.


추상클래스의 용도

1. 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적

-> 혼자 개발할 때는 상관없지만 여러사람과 협업을 통해서 개발을 할때는 이러한 통일된 양식이 매우 중요하다. 통일된 양식이란 추상클래스, 인터페이스와 같은 구현부가 없는 추상화된 부분을 통일된 양식(명칭상의)으로 삼는다.


2. 실체 클래스를 작성할 때 시간을 절약

-> 공통적인 부분만 추상클래스에 작성하고, 차이점이 존재하는 부분은 실체클래스에 따로 작성하여 결과적으로는 다른 것만 작성하면 되기 때문에 효율적이다.(단, 양이 적은 경우는 비효율적이겠죠?)


추상클래스 선언!

public abstract class 클래스{

//필드

//메소드

//생성자

}

- > abstract 키워드를 접근지시자와 클래스키워드 사이에 붙여 표기한다.


추상메소드의 선언!

public abstract void method(){}

- > 접근지시자와 반환키워드 사이에 온다!



오버라이딩(메소드 재정의)

- 상속관계에 있는 클래스 A와 B(A부모, B자식)사이에서 부모클래스 A가 메서드 C를 가질때! 자식클래스 B는 자연스럽게 A클래스의 메서드 C를 상속받게 된다. 하지만 이는 자식클래스 B에서 원하는 기능이 아닐때! -> 오버라이딩을 통해서 자식클래스 B에서 한번더 메소드C를 정의하여 자식클래스 B만의 메서드 C를 가지는 것을 말한다. 

- 덮어쓰기라고 생각하면 편할것 같다.


예제)

class OverrideParent {

// 멤버들.

public void hello() {

System.out.println("안녕하세요.");

}

}


class OverrideChild extends OverrideParent {


public void hi() { //얘는 그냥 hi메소드

System.out.println("안녕하세요.");

}

@Override //상속된 부모의 메소드를 감추고 자신이 다시한번 정의하는 작업.

public void hello() {

System.out.println("hi~");

}


}


추상클래스, 오버라이딩 예제

- 동물이라는 클래스가 있다고 하자. 동물에는 개, 고양이, 호랑이가 있다. 모든 동물은 1개의 목숨을 갖고 울음소리라는 행동을 한다. 

- 이것을 코드로 표현해보자.


class abstract Animal{    //추상클래스

public int heart=1;


public abstract void sound();

}


class Dog extends Animal{

public void sound(){

System.out.println("멍멍!");

}

}


class Cat extends Animal{

public void sound(){

System.out.println("냐옹!");

}

}


class Tiger extends Animal{

public void sound(){

System.out.println("어흥!");

}

}


-> 목숨은 Animal 클래스에서 물려받은 그대로다~












댓글

Designed by JB FACTORY