TIL(20240508) JAVA : 추상클래스
TIL(20240508) JAVA : 추상클래스
✨내가 생각해봐야 할 것들
1) 자바에서 왜 추상클래스가 있는가?
- 예를들어.. 내가 키보드를 설계한다고 가정했을 때, 키보드는 여러회사에서 제품을 만들어낸다.. 그런데 모든 회사들이
같은 재료를 사용하지 않으며 추가 기능을 넣고 싶은 회사들도 있을 것이다.. 그렇다면 나는 여러회사의 키보드를 한 번에 정의할 수 있는가? No.no…
(추상클래스에서 하는 일:)공통된 요소들만 추상화를 시켜놓고 (자식클래스들이 하는 일:)각기 다른 회사들이 구체적으로 추가하고 싶은거나 공통된 부분만 만들어 낸다면 정의하는데 효율적이라고 생각한다.
<그렇다면 인터페이스도 상속 가능한데, 추상클래스랑은 뭐가 다른거야?!>
- 추상클래스는 코드의 가독성을 높이며 상속, 확장하여 사용하기 위한 것! (추상클래스는 다중상속이 아니되옵니다~)
2) 추상클래스는 어떤 경우에 사용하는가?
- 일반 클래스와 달리 규격을 정해 놓고 공통적인 변수와 메소드를 상속받은 클래스들이 구현하여
코드의 가독성을 높이고 정해진 필드와 메소드를 가지고 구현하므로써 설계가 효율적이며 시간절약 되며
코드 수정 시, 타격이 적어 유지보수성을 높일 수 있다.
- 즉!!!! 추상클래스는 규격에 맞는 틀을 짜놓고 코드의 재사용성과 유지보수 측면에서 효과적으로 설계할 수 있도록 한다! 👍
💡 추상클래스
- 스스로는 인스턴스를 만들 수 없음
- 자식 클래스로 파생되기 위한 클래스
- 관련된 여러 클래스들의 공통분모를 정의하기 위한 클래스
📌 abstract
클래스
- 스스로 인스턴스 생성 불가 - 자식클래스가 인스턴스를 생성하여 구현함(족보같은 느낌)
- 부모클래스로서는 일반클래스와 같음, 다형성 구현가능
📌 abstract
메서드
- 추상클래스에서만 사용가능
- 부모클래스에서
abstract
메서드를 선언만 하고 자식클래스에서 반드시 구현해야한다. **구현하지 않을 시 컴파일 에러 - 접근제어자는 의미가 없음
- 클래스 메서드(변수명 앞에 static붙어있는)는 추상 메서드로 작성할 수 없음
- 인스턴스를 생성해서 쓰는 것이 아니므로 맞지 않음
💬 이해하기 위해서 만들어본 예제1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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("동물이 잠을 잡니다.");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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(); // 동물이 잠을 잡니다. - 공통적인 부분
}
}
This post is licensed under CC BY 4.0 by the author.