💻 추상화의 필요성
추상화 - 중요한 특징을 찾아낸 후 간단하게 표현하는 것.(천재학습 백과)
프로그래밍에서 추상화란 무엇일까?
구체적인 것은 감추고 사용자에게 전반적인 그림만 알려주는 것이다.
예를 들어 사용자는 자바의 API중 하나인 System.out.println(); 매서드의 내부 구조를 알지 못하지만
출력을 위해 그저 호출하여 사용이 가능하다.
핸드폰 사용을 예시로 들자면 전원버튼을 누르면 켜지고, 볼륨 버튼을 누르면 소리가 조절된다.
카메라 앱을 켜면 사진을 찍을수 있으며 손가락 두개로 확대시킬수 있다.
이런 기능들은 각 핸드폰 마다 내부 구조가 조금씩 다를수가 있다.
하지만 사용자는 그러한 것들을 고려치 않고 단순히 버튼만을 사용하여 핸드폰을 쉽게 활용이 가능하다.
이처럼 추상화는 사용자가 복잡한 로직과 내부 설계 구조를 알지 못하더라도
쉽게 사용이 가능하게 도와준다.
💻 인터페이스
추상화를 위한 자료형이다.
다른 클래스를 작성하는데 필요한 틀을 제공한다.
인터페이스는 상수와 매소드로 구현된다.
이때 매소드들은 내부가 구현되면 안된다.
public interface exam{
public booleadn setData(Object obj);
}
이렇듯 클래스 위치에 interface를 매소드들은 구현은 시키지 않고 선언만 해준다.
c로치면 헤더파일과 비슷한거 같다.
📄 사용
인터페이스를 사용하기 위해서는 클래스와 비슷하게 상속 비스무리한걸 해줘야한다.
이를 implements(구현)이라 하며
public class examImpl implements exam{
@Override
public boolean setData(Object obj){
return false;
}
}
위와 같이 구현하며 내부 매소드를 반드시 오버라이드 해줘야한다.
상속이 아니므로 여러 여러개를 implements 가능하다.
객체 생성시
exam ex = new exam(); 이 아닌
exam ex = new examImpl(); 로 해야한다.
내부 매소드는 모드 examImpl에 구현해놨기에 이 처럼 생성해준다.
또는
examImpl ex2 = new examImple(); 도 가능하다.
static과 final의 사용이 불가하다.
💻 abstract 클래스
인터페이스와 비슷한 놈이다.
인터페이스에서는 매소드를 구현하면 안됬지만
abstract에서는 일부는 구현하고 일부는 추상적으로 남겨둬도 된다.
public abstract class Animal{
public void eat(){
System.out.println("냠냠");
}
public abstract void bark();
}
이처럼 일부는 구현하고 일부는 안하는 방식이 가능하며
사용시에는 extends를 통해 클래스를 상속받은후 내부 매소드를 오버라이딩 하면된다.
static과 final의 사용이 가능하며
abstract로 선언된 매소드가 0개 이상 존재하면 된다.
abstract 매소드가 1개이상 존재한다면 해당 클래스는 반드시 abstract 형으로 선언되어야한다.
차이점
인터페이스와 추상 클래스는 모두 추상화를 지원하지만, 사용 목적과 기능에서 차이가 있다.
1. **목적 및 사용:**
- **인터페이스:** 서로 다른 클래스들이 특정 행동을 공유하도록 강제하기 위해 사용된다.
인터페이스는 행동(메서드)만 정의하며, 구현은 하지 않는다.
- **추상 클래스:** 기본적인 기능과 행동을 공유하면서 일부 구현을 강제하기 위해 사용된다.
추상 클래스는 일부 구현된 메서드와 추상 메서드를 모두 포함할 수 있다.
2. **다중 상속:**
- **인터페이스:** 자바는 클래스의 다중 상속을 지원하지 않지만,
인터페이스는 다중 구현이 가능하다. 즉, 한 클래스가 여러 인터페이스를 구현할 수 있다.
- **추상 클래스:** 자바에서 클래스는 오직 하나의 추상 클래스를 상속받을 수 있다.
3. **구성 요소:**
- **인터페이스: 상수와 추상 메서드만 포함한다.
자바 8부터는 디폴트 메서드와 static 메서드도 포함할 수 있다.
- **추상 클래스:** 인스턴스 변수, 생성자, 완전한 메서드, 추상 메서드 모두 포함할 수 있다.
4. **속도:**
- **인터페이스:** 메서드 호출 시 인터페이스는 상대적으로 느리다. 인터페이스 메서드는 런타임 시에 탐색된다.
- **추상 클래스:** 추상 클래스의 메서드 호출은 상대적으로 빠르다. 컴파일 타임에 연결된다.
챗 GPT 펌