추상화

이용만·2023년 2월 28일
0

👉추상화 : 공통성과 본질을 모아 추출하는 것

추상화는 객체의 공통적인 속성과 기능을 추출하여 정의 한다.

상속과 헷갈릴 수 있는데 상속은 상위 클래스를 하위 클래스가 사용하는 것이라면
추상화는 기존 클래스들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것

자바에서는 추상 클래스인터페이스라는 문법 요소를 사용해서 추상화를 구현한다.

🔎abstract 제어자

'abstract'는 주로 클래스와 메서드를 형용하는 키워드로 사용되는데,
메서드 앞에 붙은 경우를 '추상 메서드(abstract method)',
클래스 앞에 붙은 경우를 '추상 클래스(abstract class)'라 각각 부른다.
어떤 클래스에 추상 메서드가 포함되어 있는 경우 해당 클래스는 자동으로 추상 클래스가 된다.

abstract class AbstractExample { // 추상 메서드가 최소 하나 이상 포함돼있는 추상 클래스
	abstract void start(); // 메서드 바디가 없는 추상메서드
}

추상 메서드는 메서드의 시그니처만 있고 바디가 없습니다.
추상 메서드'미완성 메서드' 고 미완성 메서드를 포함하는 클래스는 '미완성 클래스'를 의미한다.
추상클래스는 객체 생성이 불가하다.

🔎추상 클래스

🧠왜 추상클래스를 만드는 것인가?
1. ✅추상 클래스는 상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용하다.
ex) 메서드의 내용은 상속받는 클래스에 따라 종종 달라지기 때문에 상위 클래스에서는 선언부만 작성하고 실제 구체적인 내용은 상속을 받는 하위 클래스에서 구현하도록 비워둔다면 설계하는 상황이 변하더라도 보다 유연하게 대응할 수 있다.
-> 오버라이딩을 통해 추상 클래스로부터 상속 받은 추상 메서드의 내용을 구현하여 메서드를 완성시킨다.

public abstract class Animal {
    public String kind;
    public abstract void sound();
}
public class Cat extends Animal{
    public Cat(){
        this.kind = "포유류";
    }
    public void sound(){
        System.out.println("야옹");
    }
}
public class Dog extends Animal{
    public Dog(){
        this.kind = "포유류";
    }
    public void sound(){ // 메서드 오버라이딩 -> 구현부 완성
        System.out.println("멍멍");
    }
}
public class AnimalExam {
    public static void main(String[] args) {
        Animal dog = new Dog(); // 다형성..?
        dog.sound();
        Animal cat = new Cat();
        cat.sound();
    }
}

추상 클래스를 사용하면 위와 같이 상속을 받는 하위 클래스에서 오버라이딩을 통해
각각 상황에 맞는 메서드 구현이 가능하다

2.✅추상 클래스는 추상화를 구현하는데 핵심적인 역할을 수행한다.
위 코드 예시를 통해 동물이 가지는 공통적인 특성을 모아 먼저 추상 클래스로 선언해주고,
각각 상속된 하위 클래스에서 오버라이딩을 통해 클래스의 구체적인 내용을 결정해주었다.

🔎final

final 키워드는 필드, 지역 변수, 클래스 앞에 위치하고 위치에 따라 의미가 달라진다.

결국 공통적으로 변경이 불가능하고 확장할 수 없다는 점에서 유사하다.

public final class FinalExam { // 확장/상속 불가능한 클래스
    final int x = 1; // 변경되지 않는 상수

    final int getNum(){ // 오버라이딩 불가능한 메서드
        final int localVar = x; // 상수
        return x;
    }
}
profile
성장하는 개발자가 되고자 합니다.

0개의 댓글