추상화란?
: 소프트웨어에서 구체적이고 개별적인 것이 아니라 "개념"이나 "표준"과 같은 추상화된 코드를 작성하여 재사용성을 높이는 것
- 상속 : 공통부분을 뽑아서 슈퍼 클래스로 만드는 것이 상속
- 인터페이스 : 상속에서 한걸음 더 나아가 개념(기능)만을 추출
예를 들어, Item, User, Order 가 존재하고, 각 객체 클래스의 코드 재사용을 위한 공통 부분(readAll, printAll, matches 등)을 뽑아서 만든 것이 Manager 클래스이다. 상속은 다중 상속이 불가하므로 Manager 클래스의 객체 요소들을 만들어 Item, User, Order 클래스들을 관리하는데, 각 클래스 간의 이용을 쉽게 이용하기 위해 Manageable 인터페이스를 사용하여 "기능"들만 추출한다. Manageable 인터페이스는 추상화된 요소의 개념을 만든 것이므로, Factory라는 클래스를 통해 새로운 객체를 생성할 수 있다.
인터페이스와 DIP(Dependency Inversion Principle) 원칙
- DIP 원칙은 상위 수준 모듈(슈퍼 클래스, 인터페이스)은 하위 수준 모듈(구체 클래스)에서 함수 호출 등과 같이 하위 모듈에 의존하지 말아야 한다.
- 인터페이스 같은 추상화된 수준에 의존해야 한다. -> 위의 예시처럼 Manager가 Managable, Factory에 의존한다.
- 추상화된 수준은 구체적인 구현이 이뤄진 클래스의 세부적인 사항에 의존하지 말아야 한다.
- DIP원칙이 지켜진 메소드를 "훅 메소드"라고도 한다.
인터페이스의 구현 클래스 작성하는 방법
1) 별도 클래스
: 각각의 클래스가 생성된다.
class A{ ... }
class B{ ... }
2) 중첩 클래스
: A 클래스 안에 B 클래스가 존재한다.
class A{
class B{ ... }
}
- 클래스 안에 클래스가 존재하여, 프로젝트 전체로 봤을 땐 클래스 하나가 생성되는 것과 동일하다.
- 바깥(outer) 클래스의 private까지 접근 가능하다.
- 클래스 안에서 사용하는 독립적인 자료구조를 가진다.
- 내부 클래스 안에 정의된 메소드를 사용할 수 있다.
(사용) 클래스에서 필요한 자료구조를 가질 때 사용한다.
3) 로컬 클래스
: 함수 안에서 선언되기 때문에 바깥에서는 보이지 않는다.
class A{
void f(){
class B{ ... }
}
}
- 함수 안에서만 사용되는 클래스이기 때문에 함수 내에서만 보인다.
- 바깥 클래스 필드와 메소드의 지역 변수만 사용 가능하다.
(사용) 함수 안에서 객체를 여러 번 생성하거나 변수 선언 등의 이름이 필요할 때 사용한다.
4) 무명 클래스
: 클래스 생성 없이, 메소드만 생성된다.
class Department extends Manager{
...
void run(){
readAll("student.txt", new Factory(){
void create(){
return new Student();
}
});
}
}
- 무명 클래스는 수식으로 바라볼 수도 있다.
- 클래스에 이름을 붙일 필요가 없고, 해당 메소드에서만 사용되기 때문에 메소드 내에서 선언된다.
- 인터페이스를 통해 new를 한 뒤, 메소드의 구현부에 넣어주어야 한다.
(사용) 클래스의 이름 없이, 메소드 전달만이 목적일 때 사용한다.
** 람다식
위의 무명 클래스에서의 방식을 아래와 같이 변환시킬 수 있다.
class Department extends Manager implements Factory{
...
void run(){
readAll("student.txt", ()->{return new Student});
}
}
원래의 함수 본체를 불러오려면, Factory 타입의 create 메서드를 불러와야 한다. 하지만 create 함수는 return new Student(); 의 코드밖에 가지고 있지 않아서 함수의 코드만 전달하여 사용하도록 할 수 있다. 주로 인터페이스의 메서드가 한 개만 존재할 때 사용한다.
람다로 작성 가능! => "함수 인터페이스"
: 인터페이스가 함수 한 개 만을 가질 때, 함수 인터페이스라고 부른다. 람다로 해당 인터페이스 객체 생성을 대체할 수 있으며, 조건을 만족할 때 인터페이스에 annotation으로 표시한다. (ex. @FunctionallInterface)
'Computer Science > JAVA' 카테고리의 다른 글
[JAVA] 컬렉션이란? (0) | 2020.11.03 |
---|---|
[JAVA] 제너릭이란? (0) | 2020.11.03 |
[JAVA] 인터페이스란? (+서점 구현하기) (0) | 2020.10.06 |
[JAVA] 상속이란? (+ 서점 구현하기) (0) | 2020.10.06 |
[JAVA] 변수와 메서드 (0) | 2020.09.11 |
댓글