학습 목표
- 추상화의 핵심 개념과 목적을 이해하고 설명할 수 있다.
추상화는 공통의 속성이나 기능을 묶어 이름을 붙이는 것으로 객체 지향적 관점에서 클래스를 정의하는것을 추상화라고 할 수 있다.
불필요한 부분을 생략하고 객체의 속성 중 가장 중요한 것에만 중점을 두어 개략화 하는것, 즉 모델화 하는것으로 데이터의 공통된 성질을 추출하여 슈퍼 클래스를 선정하는 개념이다.
추상화를 사용하면 코드의 재사용성, 가독성을 높이고, 생산성의 증가, 에러 감소, 유지 보수에 있어 많은 시간을 줄일수있다.
- abstract 제어자가 내포하고 있는 의미를 이해하고, 어떻게 사용되는 지 설명할 수 있다.
사전적 의미는 추상적인 이라는 뜻을 가지고 있는 미완성이라 정리할 수 있다.
abstract는 주로 클래스와 메서드를 형용하는 키워드로 사용되는데, 메서드 앞에 붙이는 경우를 '추상메서드(abstract method)' 클래스 앞에 붙은 경우를 추상 클래스(abstract class)라 부른다.
- 추상 클래스의 핵심 개념과 기본 문법을 이해할 수 있다.
메서드 시그니처만 존재하고 바디가 선언되어있지 않은 추상 메서드를 포함하는 '미완성 설계도'이고 바디가 완성되기 전까지 객체 생성이불가능하다.
객체도 생성하지 못하는 미완성 클래스를 만드는 이유
1. 상속관계에 있어 새로운 클래스를 작성하는데 매우 유용하다.
2.메서드의 내용이 상속을 받는 클래스에 따라 종종 달라지기 때문에 상위 클래스에서는 선언부만을 작성하고, 실제 구체적인 내용은 상속을 받는 하위 클래스에서 구현하도록 비워두면 설계하는 상황이 변하더라도 유연하게 대응할 수 있다.
추상클래스를 사용하면 상속을 받는 하위 클래스에서 오버라이딩을 통해 각각 상황에 맞는 메서드 구현이 가능하다는 장점이 있고, 추상화를 구현하는데 핵심적인 역할을 수행한다
추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는것.
만약 여러사람이 함께 개발하는 경우, 공통된 속성과 기능임에도 불구하고 각각 다른 변수와 메서드로 정의되는 경우 발생할 수 있는 오류를 미연에 방지할 수 있다.
상속계층도의 상층부에 위치할 수록 추상화의 정도가 높고 그 아래로 갈수록 구체화 된다.즉 상층부에 가까울수록 더 공통적인 속성과 기능들이 정의되어있다.
- final 키워드를 이해하고 설명할 수 있다.
더이상 변경이 불가하거나 확장되지 않는 성질
- 자바 추상화에서 핵심적인 역할을 수행하는 인터페이스의 핵심 내용과 그 활용을 이해할 수 있다.
영어에서 인터페이스는 “-간/사이"를 뜻하는 inter와 “얼굴/면"을 의미하는 face의 결합으로 구성된 단어로, 두 개의 다른 대상 사이를 연결한다는 의미를 가지고 있습니다.비슷한 맥락에서, 컴퓨터 프로그래밍에서 사용하는 인터페이스도 “서로 다른 두 시스템, 장치, 소프트웨어 따위를 서로 이어주는 부분 또는 그런 접속 장치"라 정의할 수 있습니다.
일상적으로 우리가 사용하는 인터페이스의 대표적인 예로 GUI가 있습니다.
GUI는 Graphic User Interface의 약자로 컴퓨터를 사용할 때 입출력 등을 좀 더 효율적이고 쉽게 조작할 수 있도록 아이콘 등으로 시각화한 사용자 인터페이스입니다.
기본적으로 인터페이스도 추상 클래스처럼 자바에서 추상화를 구현하는데 활용된다는 점에서 동일하지만, 추상클래스에 비해 더 높은 추상성을 가진다는 점에서 큰 차이가 있다.
추상 클래스를 설계가 모두 끝나지 않은 "미완성 설계도"에 비유할 수 있다면, 인터페이스는 그보다 더 높은 추상성을 가지는 가장 기초적인 "밑그림"에 빗대어 표현할 수 있다.
추상클래스는 메서드 바디가 없는 추상 메서드를 하나 이상 포함한다는 점 외에는 기본적으로 일반 클래스와 동일하다고 볼수있다
반면 인터페이스는 기본적으로 추상 메서드와 상수만을 멤버로 가질 수 있다는 점에서 추상 클래스에 비해 추상화 정도가 더 높다고 할 수있다.
참고로 새로운 메서드 추가의 어려움 등 기존 인터페이스가 가지는 한계를 보완하기 위해 자바8이후에 default/static메서드ㅡ를 인터페이스 포함시킬 수 있도록 업데이트 되었지만, 이 부분은 인터페이스의 핵심 역할을 고려했을때 부수적인 부분에 해당하기 때문에 여기서는 인터페이스는 기본적으로 "추상 메서드의 집합"으로 이뤄져있다
인터페이스의 기본구조
인터페이스를 작성하는 것은 기본적으로 클래스를 작성하는것과 유사하지만, class키워드 대신 interface키워드를 사용한다는 점에서 차이가 있다.
일반 클래스와 다르게 내부의 모든 필드가 public static final로 정의되고, 앞서 간단하게 언급한 static과 default 메서드 이외의 모든 메서드가 public abstract로 정의된다는 차이가 존재하다.
다만 모든 인터페이스의 필드와 메서드에는 위의 요소가 내포되기때문에 명시하지 않아도 생략이 가능하다.
public interface InterfaceEx {
public static final int rock = 1; // 인터페이스 인스턴스 변수 정의
final int scissors = 2; // public static 생략
static int paper = 3; // public & final 생략
public abstract String getPlayingNum();
void call() //public abstract 생략
}
인터페이스는 인터페이스 키워드를 사용하여 만들어지고 구현부가 완성되지 않은 추상 메서드와 상수만으로 구성되어있다.
인터페이스 안에서 상수를 정의하는 경우에는 반드시 public static final로, 메서드를 정의하는 경우에는 public abstract로 정의되어야하지만 위처럼 일부분 또는 전부 생략이 가능하다.
인터페이스의 구현
추상클래스와 마찬가지로 인터페이스도 그 자체로 인스턴스를 생성할 수 없고, 메서드 바디를 정의하는 클래스를 따로 작성해야한다.
이 과정은 앞서배운 extends키워드를 사용하는 클래스의 상속과 기본적으로 동일하지만 "구현하다"라는의미를 가진 implements키워드를 사용한다는 점에서 차이가 있다라고 할수있다.
class 클래스명 implements 인터페이스명 {
... // 인터페이스에 정의된 모든 추상메서드 구현
}
특정인터페이스를 구현한 클래스는 해당 인터페이스에 정의된 모든 추상메서드를 구현해야한다.
즉 어떤 클래스가 특정 인터페이스를 구현한다는 것은 그 클래스에게 인터페이스의 추상 메서드를 반드시 구현하도록 강제하는것을 의미한다.
다른말로 어떤 클래스가 어떤인터페이스를 구현한다는것은 그 인터페이스가 가진 모든 추상 메서드들을 해당 클래스 내에서 오버라이딩하여 바디를 완성한다는 의미를 가진다.
'TIL' 카테고리의 다른 글
[Java]자바 가상 머신(Java Virtual Machine) (0) | 2022.09.16 |
---|---|
스레드(Thread) (1) | 2022.09.16 |
[Java]스트림(Stream) (0) | 2022.09.15 |
[Java]람다식(Lambda Expression) (0) | 2022.09.15 |
[Java]애너테이션(Annotation) (0) | 2022.09.15 |