추상화

  • 객체의 공통적인 속성과 기능을 추출하여 정의 하는 것
  • 상속 계층도의 상층부에 위치할 수록 추상화의 정도가 높고 공통적인 속성과 기능들이 정의됨. 그 아래로 내려갈수록 구체화 된다.

메서드 앞에 붙은 경우 '추상 메서드(abstarct method)'
클래스 앞에 붙은 경우 '추상 클래스(abstact class)'

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

abstact 핵심 개념은 '미완성'
추상 메서드는 메서드의 시그니처만 있고 바디가 없는 메서드를 의미하여, abstract 키워드를 메서드 이름 앞에 붙여주어 해당 메서드가 추상 메서드임을 표시한다.


AbstractExample abstractExample = new AbstractExample(); // 에러발생. 
  • 추상 클래스는 메서드 바디가 완성이 되기 전까지 객체 생성이 불가하다.

객체 생성이 불가한 미완성 클래스를 만드는 이유

  1. 상속 관계에 있어 새로운 클래스를 작성하는데 유용하다.
    -> 상위 클래스에서 선언부만을 작성하고, 실제 구체적인 내용은 상속을 받는 하위 클래스에서 구현하도록 비워둔다면 설계하는 상황이 변해도 유연하게 대응 가능.
abstract class Animal {
	public String kind;          
	public abstract void sound();
}

class Dog extends Animal { // Animal 클래스로부터 상속
	public Dog() {
		this.kind = "포유류";
	}

	public void sound() { // 메서드 오버라이딩 -> 구현부 완성
		System.out.println("왈왈");
	}
}

class Cat extends Animal { // Animal 클래스로부터 상속
	public Cat() {
		this.kind = "포유류";     // 동물이 가지는 공통적인 특성을 모아 먼저 추상 클래스로 선언해주고
	}                           // 이를 기반으로 각각의 상속된 하위 클래스에서 오버라이딩을 통해 클래스의
                               // 구체적인 내용을 결정 해주었다.
	public void sound() { // 메서드 오버라이딩 -> 구현부 완성
		System.out.println("니야옹");
	}
}

class DogExample {       
    public static void main(String[] args) throws Exception {
       Animal dog = new Dog();
       dog.sound();

       Cat cat = new Cat();
       cat.sound();
    }
 }
 
 
 출력값 
 
 왈왈
 니야옹
  1. Animal 클래스 안에 abstract 키워드를 사용한 sound(); 메서드가 추상 메서드로 선언되었고, 이를 포함하는 Animal 클래스 역시 abstract 키워드를 사용하여 추상 클래스로 만들어줌.

  2. 이후 추상 클래스 Animal을 상속 받은 Dog 클래스와 Cat 클래스 안에 추상 메서드 sound()를 각각 오버라이딩 하여 각 객체에 맞는 구현부를 완성

  3. 마지막으로 완성된 클래스를 기반으로 dog 인스턴스와 cat 인스턴스를 생성하여 sound() 메서드를 호출했다.


추상화는 펜과 종이를 들고 입으로 중얼 거리면서 공부해봤다.
코드도 손 글씨로 써내려가니 집중력이 한층 올라가고 흐름도 잘타는 것 같아. 근데 얼마 지나고 보면 다시 새로워..

전부 추상적으로 기억하는거 같아

profile
한걸음 나아가는 개발자

0개의 댓글

Powered by GraphCDN, the GraphQL CDN