본문 바로가기
Computer Science/JAVA

[JAVA] 추상화란?

by 그적 2020. 10. 23.

추상화란?

: 소프트웨어에서 구체적이고 개별적인 것이 아니라 "개념"이나 "표준"과 같은 추상화된 코드를 작성하여 재사용성을 높이는 것

 

- 상속 : 공통부분을 뽑아서 슈퍼 클래스로 만드는 것이 상속

- 인터페이스 : 상속에서 한걸음 더 나아가 개념(기능)만을 추출

 

예를 들어, 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

댓글