프로그래밍/자바(java) 융합개발자 2차

[취성패] 자바 배우기 - 선수학습(추상 클래스)

aSpring 2020. 12. 13. 17:07
728x90
728x90

[추상 클래스 정의]

1. 추상 클래스 개요

- 객체를 생성할 수 없는 클래스

- 동일한 목적으로 접근 가능한 자식 클래스들을 정의하기 위해 사용

- 추상 클래스 자체는 내용을 갖지 않으며 상속을 위해 설계 -> 객체 생성을 직접 하지 않음

- 추상 클래스는 일반 메서드나 멤버 변수를 가질 수 있음

- class 앞에 "abstract" 키워드를 추가

- 문법

abstract class 클래스명 {

문장;

}

 

2. 추상 메서드

- 내용을 갖지 않으며 몸통 부분이 없는 메서드

- 메서드명 앞에 "abstract" 키워드를 추가함

- 추상 메서드를 가지는 클래스는 반드시 추상 클래스여야 함

   -> 추상 클래스가 아닌 클래스에서 추상 메서드를 정의할 경우 에러

- 추상 메서드는 실제 내용이 없으므로 호출이 불가능함

- 추상 메서드는 상속을 받는 자식 클래스에서 실제 내용을 구현함

- 추상 클래스의 상속을 받는 클래스에서는 추상 클래스의 메서드를 반드시 오버라이딩해아 함

- 추상 메서드 문법

abstract 반환데이터형 메서드명();

 

원래는 메서드명() {

  문장

}

 

ex)

abstract class AbstractMain {

  abstract void printTest();     -> printTest라는 메서드를 정의

}

 

class AbstractSub extends AbstractMain {  -> AbstractMain 클래스를 상속받아 AbstractSub 클래스 만듬

  abstract void printTest() {       -> 상속받은 곳에서 메서드를 반드시 구현해주어야 함

    System.out.println("Hello! Java");

}

public static void main(String args[]) {       -> 실행하기 위해서는 main 필요

  AbstractSub test = new AbstractSub();

  test.printTest();

}

 

 

[추상 클래스와 다형성]

1. 메서드 오버라이딩

- 부모 클래스에 정의된 메서드를 자식 클래스에서 동일한 이름의 메서드로 재정의하는 기법

- 자식 클래스의 객체를 생성 후 오버라이딩 된 메서드 호출 시 부모 클래스의 메서드는 무시되고 자식 클래스의 오버라이딩 된 메서드가 처리됨

- 오버라이딩 된 메서드의 접근 지정자는 부모 클래스의 메서드와 동일하거나 넓은 범위로 설정함

- 부모 클래스의 메서드와 오버라이딩 된 자식 클래스의 메서드는 선언부가 동일해야 함

- 메서드가 동일하기 위한 조건은 메서드명, 매개변수, 반환 데이터형, 접근 지정자를 같도록 함

 

ex)

- 부모 클래스

class Parent {

 public void printTest() {

  System.out.println("부모 클래스의 메서드");

 }

}

- 자식 클래스에서 메서드 오버라이딩

class Child extends Parent {

 public void printTest() {                    -> 자식 클래스에서 printTest 메서드를 오버라이딩 함

   system.out.println("자식 클래스의 메서드");

 }

}

- 자식 클래스 객체 생성 후 호출

class Exam {

  public static void main(String args[]) {

   Child test = new Child();

   test.printTest(); //"자식 클래스의 메서드"가 출력됨 -> 부모 클래스에도 있었던 메서드이지만

 }

}

 

2. 추상 클래스 활용

- 클래스 설계 시 상속관계를 활용하는 것이 체계적인 방법

- 비슷한 종류의 클래스를 정의할 경우(일관성 유지 가능)

  -> 공통적인 속성 및 메서드를 부모 클래스에서 정의하고 자식 클래스에서 상속받도록 함

- 비슷한 클래스들이 유사한 기능의 메서드를 정의할 경우

  -> 완전히 다른 이름보다 동일한 이름으로 선언하여 접근하도록 하는 것이 사용자에게 혼동을 줄일 수 있음

 

ex)

abstract class Car {   -> Car라는 추상 클래스

 abstract void moveCar();  -> moveCar라는 추상 메서드 정의

}

 

class Sedan extends Car {   -> Car라는 추상 클래스를 상속받은 Sedan 클래스

 void moveCar() {

  System.out.println("승용차 이동");    -> 상속받은 클래스에서 moveCar 메서드를 반드시 정의해 주어야 함

 }

}

 

class Truck extends Car {    -> Car라는 추상 클래스를 상속받은 Truck 클래스

  void moveCar() {

   System.out.println("트럭 이동");

 }

}

 

- 추상 클래스와 다형성

비슷한 종류의 클래스를 설계할 경우 공통적인 특성을 갖는 메서드(moveCar)를 부모 클래스에서 정의하고

자식 클래스에서 상속받아 오버라이딩하여 구현하는 것이 체계적인 기법임

 

[예제 학습] 추상 클래스 활용

class Shape {  -> Shape이라는 추상 클래스 만듬. 의미적으로 도형(사각형, 원, 삼각형 등)이라고 생각하기.

                   -> 공통점 : 꼭지점, 선분 등의 모양을 가짐 ..  -> 오각형 등 다른 도형을 만들어야 하는 상황

}

class Rect extends Shape { -> 상속1 : Shape를 상속받은 Rect 클래스

  Rect() {  -> 생성자

   System.out.println("사각형");

 }

}

class Oval extends Shape { -> 상속2 : Shape를 상속받은 Oval 클래스

 Oval() {  -> 생성자

  System.out.println("원");

 }

}

class Tri extends Shape { -> 상속3 : Shape를 상속받은 Tri 클래스

 Tri() {  -> 생성자

  System.out.println("삼각형");

 }

}

 

[추상 클래스 사용 예]

abstract class CarMain {

   abstract void moveCar();  -> 메서드

}

class CarSedan extends CarMain {

   public void moveCar() {

      System.out.println("승용차 이동");

   }

}

class CarTruck extends CarMain {

   public void moveCar() {

      System.out.println("트럭 이동");

   }

}

public class Exam14_1 {  -> 클래스 명칭과 동일하기 파일 명칭 작성

   public static void main(String[] args) {

      CarSedan car1 = new CarSdedan();

      car1.moveCar();         -> 승용차 이동

      CarTruck car2 = new CarTruck();

      car2.moveCar();          -> 트럭 이동

   }

}

728x90
728x90