| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 자바
- 설정파일분리
- Sts
- 프레임워크
- iterm2
- Spring
- git커스텀
- 깃
- 아이텀2
- springframework
- servlet
- 깃커스텀
- 스프링
- URLmapping
- Java
- github
- macoracle
- xml
- IoCContainer
- Interface
- di
- 깃허브
- annotation
- oracle
- 객체지향
- GIT
- viewResolver
- 스프링프레임워크
- 인터페이스
- 객체지향프로그래밍
- Today
- Total
공부만이 살길
자바 객체지향 프로그래밍 - 인터페이스 (Interface) 쉽게 이해하기 (1) 본문
자바 프로그래밍에서의 인터페이스를 활용한 개발이란,
프로그램의 클래스의 수정이 있을 때, 실행하는 프로그램의 코드 수정 없이
간편하게 외부 설정파일만을 수정하여 유지보수를 용이하게 만드는 것을 말한다.
여기 예제를 보면서 확인해보자.

위 Program 클래스는 A라는 인스턴스를 생성하여, a 내부의 print() 메소드를 호출해 실행하고 있다.

A 라는 Class는 B라는 객체를 활용해서 print() 를 정의하고 있다.
A 생성자 안에서 B라는 인스턴스를 정의 하고 있다.

B 에서는 total() 메소드를 통해 30이라는 값을 return 하고 있다.
위 3개의 java 프로그램은 Program을 실행하여 결과적으로 30을 출력하는 프로그램이지만,
그 안을 들여다보면 A와 B는 서로간의 사이에서 아주 강한 결합력을 가지고 있다.
프로그램의 유지보수를 위해서는, 이러한 결합력을 낮추어 만약 클래스나 코드를 변경할 일이 있을 때,
필요한 코드 이외의 다른 부분에 대한 수정을 최대한 줄여야한다.
그럴 때 필요한게 바로 인터페이스 이다.
그렇다면, 예제 코드를 인터페이스를 활용한 코드로 하나씩 변경해보자.

먼저 위 코드에서의 문제는 무엇일까? 바로 B 와의 결합도가 높다는 것이다.
이는 B가 C로 변경되었을 때나, 아직 B의 메소드들이 완전히 구현되지 않을 경우,
에러를 발생시켜 코드의 유지보수를 어렵게 만든다.
가장 먼저 A와 B의 결합도를 지워보도록 하자.

이로써 가장 결합도가 높았던 B를 분리했다. 그렇다면 B가 담당했던 total 기능을 인터페이스가 가지고 가야한다.
참고로 인터페이스를 생성할 때에는, 인터페이스 자체가 어떠한 기능을 동작하는 것이 아니기 때문에
생성자를 통해서 생성하는 것이 아니라 setter를 통해 프로그램과 연결하여 사용한다.

자 이렇게, private X x; 로 하나의 객체를 생성하고
Generate setter를 통해 X를 셋팅하는 setter까지 생성하였다.
그럼 이제 X 인터페이스를 생성해야한다.

위와 같이 Create interface 'X' 를 클릭하여 바로 생성한다.

이렇게 생성이 되었다.
인터페이스는 아까 이야기했던대로, 자체로서의 기능 역할을 담당하지 않기 때문에 생성자를 통해 생성하지 않는다고 얘기했었다.
그 말은 즉슨 인터페이스 내부의 코드 역시 작성시에는 반환 타입과 메소드 명만 기재할 뿐,
메소드의 보호모드 ( public, private 등 ), 함수의 구현블록, 속성의 정의 등은 적지 않는다.
우리는 B Class에 있던 total 기능을 인터페이스를 통해 연결시킬것 이므로,

이렇게 정의 한다.
이제 돌아가보면 아까 발생했던 빨간 에러가 사라진 것을 알 수 있다.

이제 Class A의 코드를 보면 B 와의 결합도는 완벽하게 사라졌다.
이번에 해야할 것은, 바로 B의 코드를 수정하는 것이다.

현재 Interface X와 Class B는 아무런 관계가 없다.
Class B가 Interface X가 명시하는 total 메소드를 구현하였다는 것을 명시적으로 적어주어야한다.
그 기능은 implements가 한다.

위 처럼 public Class B 옆에 implements X를 기재함으로서, Class B는 Interface X가 명시하는 메소드를
실제로 구현하고 동작하는 내용을 담고있다고 표현하는 것이라고 볼 수 있다.
자 이제, 준비가 되었으니 Program.java를 실행해보자.

엥? 뜬금없이 NullPointerException이 나왔다.
A.java 의 14 Line이다.

이유는 무엇일까.
현재 Program.java 에서는 a.print()를 호출하고 있다.

그런데, 아래 A.java의 코드를 다시 한 번 꼼꼼히 보자.

a.print()는 x.total()을 실행한다.
그러나 아까 이야기했듯, 인터페이스는 자체가 기능을 담당하지 않는다.
현재 Class A에서 X는 그저 인터페이스 변수일 뿐, 어떠한 참조도 하지 않고 있다.
결국 Program을 실행했을 때, x.total()은 아무곳도 가리키고 있지 않다는 의미이다.
이런 경우에는 Program에서 B 생성자를 생성하고, interface X가 참조하는 값을, B로 셋팅해야한다.

그리고 실행해보면, 정상적으로 작동하는 것을 알 수 있다.

이를 통해, Class A와 B간의 결합도를 낮추고, 인터페이스를 통한 코드 분리를 알아보았다.
다음 포스팅에서는, 이러한 코드 구조의 문제와 해결 방법에 대해 작성할 예정이다.
스터디 자료 : [뉴렉처 자바 객체지향 강의 29강 ~ 32강]
'Java' 카테고리의 다른 글
| 자바 객체지향 프로그래밍 - 인터페이스 (Interface) 쉽게 이해하기 (2) (0) | 2024.01.25 |
|---|