좌충우돌 개발공부

TIL(20240508) JAVA : 추상클래스


✨내가 생각해봐야 할 것들

1) 자바에서 왜 추상클래스가 있는가?

- 예를들어.. 내가 키보드를 설계한다고 가정했을 때, 키보드는 여러회사에서 제품을 만들어낸다.. 그런데 모든 회사들이

같은 재료를 사용하지 않으며 추가 기능을 넣고 싶은 회사들도 있을 것이다.. 그렇다면 나는 여러회사의 키보드를 한 번에 정의할 수 있는가? No.no…

(추상클래스에서 하는 일:)공통된 요소들만 추상화를 시켜놓고 (자식클래스들이 하는 일:)각기 다른 회사들이 구체적으로 추가하고 싶은거나 공통된 부분만 만들어 낸다면 정의하는데 효율적이라고 생각한다.

<그렇다면 인터페이스도 상속 가능한데, 추상클래스랑은 뭐가 다른거야?!>

- 추상클래스는 코드의 가독성을 높이며 상속, 확장하여 사용하기 위한 것! (추상클래스는 다중상속이 아니되옵니다~)

2) 추상클래스는 어떤 경우에 사용하는가?

- 일반 클래스와 달리 규격을 정해 놓고 공통적인 변수와 메소드를 상속받은 클래스들이 구현하여

코드의 가독성을 높이고 정해진 필드와 메소드를 가지고 구현하므로써 설계가 효율적이며 시간절약 되며

코드 수정 시, 타격이 적어 유지보수성을 높일 수 있다.

- 즉!!!! 추상클래스는 규격에 맞는 틀을 짜놓고 코드의 재사용성과 유지보수 측면에서 효과적으로 설계할 수 있도록 한다! 👍


💡 추상클래스

  • 스스로는 인스턴스를 만들 수 없음
  • 자식 클래스로 파생되기 위한 클래스
  • 관련된 여러 클래스들의 공통분모를 정의하기 위한 클래스

📌 abstract클래스

  • 스스로 인스턴스 생성 불가 - 자식클래스가 인스턴스를 생성하여 구현함(족보같은 느낌)
  • 부모클래스로서는 일반클래스와 같음, 다형성 구현가능

📌 abstract메서드

  • 추상클래스에서만 사용가능
  • 부모클래스에서 abstract메서드를 선언만 하고 자식클래스에서 반드시 구현해야한다. **구현하지 않을 시 컴파일 에러
  • 접근제어자는 의미가 없음
  • 클래스 메서드(변수명 앞에 static붙어있는)는 추상 메서드로 작성할 수 없음
  • 인스턴스를 생성해서 쓰는 것이 아니므로 맞지 않음

💬 이해하기 위해서 만들어본 예제1

package ch08.ex04;

// 추상 클래스: Animal 
abstract class Animal { // 부모클래스

    protected final String name;

    public Animal (String name) {
        this.name = name;
    }

    // 추상 메서드: 하위 클래스에서 구현해야 함
    abstract void makeSound();

    // 일반 메서드: 모든 동물에 대해 공통적으로 사용 가능
    public void sleep() {
        System.out.println("동물이 잠을 잡니다.");
    }
}
package ch08.ex04;

// 구상 클래스: Dog
class Dog extends Animal { // 자식 클래스 dog

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

    @Override
    // 추상 메서드 구현해야함!!!
    public void makeSound() {
        System.out.println("멍멍! 나는 %s 입니다.".formatted(name));
    }
}
package ch08.ex04;

// 구상 클래스: Cat
class Cat extends Animal { // 자식 클래스 cat

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

    @Override
    // 추상 메서드 구현해야함!!!
    public void makeSound() {
        System.out.println("야옹! 나는 %s 입니다.".formatted(name));
    }
}

package ch08.ex04;

// 메인 클래스
public class Main {
    public static void main(String[] args) {
        // 추상 클래스는 직접 인스턴스화할 수 없지만, 구상 클래스의 객체를 생성할 수 있습니다.
        Dog myDog = new Dog("클레어"); 
        Cat myCat = new Cat("토니");

        myDog.makeSound(); // 멍멍! 나는 클레어 입니다.
        myCat.makeSound(); // 야옹! 나는 토니 입니다.

        myDog.sleep(); // 동물이 잠을 잡니다. - 공통적인 부분
        myCat.sleep(); // 동물이 잠을 잡니다. - 공통적인 부분
    }
}