인터페이스 - 작업의 분업을 위한 도구
아래와 같이 기존의 MVC 아키텍처로 구성한 프로그램은
종속관계가 있기때문에 분업하여 개발을 진행하기가 어려움이 있다.
Model, ViewOut이 만들어지고, Controller 개발이 가능해짐.
그래서, Controller 개발자는 Model, ViewOut이 만들어질 때까지 놀아야됨 ㅎㅎ..
그래서 "인터페이스"를 정의해서 분업화를 가능한 환경을 만든다.
인터페이스 란?
인터페이스는 자바에서 클래스들이 구현해야하는 동작을 지정하는 용도로 사용되는 추상 자료형이다.
class 대신 interface라는 키워드를 이용하여 선언할 수 있으며 메소드 시그니처와 상수선언만을 포함할 수 있다.
클래스에서 인터페이스를 구현하기 위해서는 implements 키워드를 사용하여 구현하며, 하나의 클래스는 여러개의 인터페이스를 상속(Implement)받아 구현할 수 있다.
아래는 인터페이스의 예시 코드이다.
public interface Piece {
Piece move(final Position position, final Map<Position, Piece> pieces);
List<Position> movablePositions(final Map<Position, Piece> pieces);
}
위와 같이 인터페이스에는 종속관계를 가지는 클래스에 대한 메소드 & 필드변수를 선언해둔다.
인터페이스는 "명세"의 역할이기에 인터페이스를 설계해두고, 독립적으로 개발을 진행한다.
# 인터페이스 사용방법에 대한 예를 들면,
컨트롤러 클래스와 모델 클래스가 있다고 가정하자.
컨트롤러는 모델에 종속되어 작동되어지기에, 모델에 대한 인터페이스인 Model Interface를 생성한다.
그리고, 모델 인터페이스에 모델에 사용되어질 메소드, 필드변수들을 선언해둔다.
이제, 컨트롤러, 모델 개발자를 분업해서
컨트롤러 개발자 개발시작,
모델 개발자 개발시작을 하게되고,
컨트롤러 개발자는 Model 인터페이스를 Implement 받아 성공적으로 컴파일을 진행한다.
(컨트롤러의 독립적인 개발이 가능해진다!)
컨트롤러, 모델 개발자 개발이 완료되면,
컨트롤러에서는 모델 클래스에 대한 객체를 생성 후 가져와서 JAVA 프로그램 구현을 완료한다.
# 인터페이스를 사용함으로써 얻는 이점
1. 여러명이서 작업을 할때 미리 인터페이스를 작성함으로써 개발에 필요한 메소드를 정의할 수 있다.
2. 상속을 통한 이점을 누릴 수 있다.
3. 개방폐쇄(Open Close)법칙인 확장에는 열려있고 변경에는 닫혀있는 클래스간 결합도(코드 종속성)를 낮춘 유연한 방식의 프로그래밍이 가능해진다. - 분업 개발이 가능해진다.
사례학습을 통한 인터페이스의 이해
# Controller와 VIewOut은 Model과 종속관계를 지니고 있기에, 인터페이스로 종속관계를 바꾼다.
(분업 개발을 하기 위함이다.)
# Controller는 ViewOut과 종속관계를 지니고 있기에, 인터페이스로 종속관계를 바꾼다.
마치며,
# 인터페이스 정리
인터페이스는 분업 개발을 위한 도구로써,
개발 프로젝트에 대한 "명세"의 역할을 담당한다.
그래서, 개발 프로젝트의 분업화를 시작하기 전에 "인터페이스"를 구성해두고
각자 개발을 독립적으로 진행할 수 있게 된다.
# 인터페이스 구성하는 법 - 답이 없고, 필요에 따라 구성
이때 인터페이스는 MVC 아키텍처에서 설계한 바를 토대로
Model이나 ViewOut 등에 존재하는 메소드, 필드 변수들을 인터페이스에 선언한다.
그렇기에, 인터페이스 구성에는 답이 없으며, 필요에 따라 인터페이스들을 구성해서
분업화된 개발을 진행하면 된다 ㅎㅎ
상속 - 코드의 재활용을 위한 도구
상속은 더 공부해보고 추가로 정리해서 수정 포스팅을 올리도록하겠다.
지금은, 다른 공부할 사항이 있어서 상속에 대해선 나중에 공부하는 거임 ㅎㅎ..
# 상속받아서 클래스 사용하는 방법 - 사례 학습
아래와 같은 명령을 사용해, 상속받고 있는 클래스에서
상속 클래스(부모 클래스)의 생성 메소드에 필요한 인자값을 주고 객체?를 구현한다.
(super() 명령으로 자식클래스의 객체가 생성되는지를 잘 모르겠음. - 질문)
A : 부모 클래스에 대한 객체를 생성되는 것이 아닌, 부모 클래스의 코드를 Clone하여 상속받는 클래스에 옮겨온다고 생각.
그렇기에, 상속받은 클래스에 대한 객체를 생성하면, 부모 클래스에 대한 객체를 별도로 생성되는게 아니라,
상속받은 클래스에 부모 클래스의 코드가 합쳐졌다고 생각하면 된다.
그래서, 상속받은 클래스를 객체로 생성하고, 부모 클래스의 메소드, 필드변수들을 사용할 수 있는 것임.
super({상속받은 자식 클래스의 생성메소드의 인자});
# 상속의 원리
자식 클래스는 부모 클래스에 있는 모든 사항을 상속받기에, 자식클래스에서 부모클래스의 모든사항들을 사용할 수 있다.
(부모 클래스에 있는 사항들을 재사용해서 자유롭게 사용할 수 있다. - 객체지향의 묘미라고 함 ㅎㅎ)
## PersonFrom 클래스의 same메소드 - 자식 클래스
public boolean same(PersonFrom other) {
return sameName(other) && city.equals(other.city());
}
## Person 클래스의 sameName 메소드 - 부모 클래스
public boolean sameName(Person other) {
return name.equals(other.name());
}
## 자식 클래스 객체를 생성하면, 타입을 부모클래스라고 지정해도, 자식 클래스 주소안에
부모 클래스 객체를 가지고 있다.
Person q = new PersonFrom("소리", "서울");
위와 같이 Person (부모 클래스) 으로 타입을 지정하고,
PersonFrom (자식클래스)를 선언한다.
이때, q라는 변수는 Person의 객체를 가지면서, PersonFrom의 객체를 가지고 있다.
그렇기에, q라는 변수로 Person의 메소드를 사용할 수 있으면서 PersonFrom의 메소드를 사용할 수 있다.
JPanel의 상속원리 - 사례학습
자식 클래스인 MyPaenl은 JPanel (부모 클래스)를 상속받아서 사용한다면,
JPanel이 상속하고 있는 모든 클래스의 메소드, 필드 변수를 가져다 사용할 수 있다.
상속의 확장 - 데이터베이스
Java 로컬환경에서 데이터베이스를 구현하기 위해
아래와 같이 아키텍처를 구성할 수 있다.
BankAccount는 Record를 상속받고 있고,
Record는 Database를 상속받고 있다.
따라서, BankAccount는 Record의 객체를 지니고 있다.
(위와 같은 상속을 하고 있기에, 다음과 같은 명령을 실행할 수 있다.)
Database db = new Database(4);
IntegerKey k = new IntegerKey(55);
BankAccount b = new BankAccount(10000, k);
/*
b는 BankAccount 클래스 타입임.
하지만 DataBase의 insert() 메소드의 인자는 Record임.
그래도, BankAccount가 자식클래스로써 Record를 상속받고 있기에, b는 Record 객체로써 변환이 가능하다.
*/
boolean success = db.insert(b);
# 부모 클래스 타입의 변수에서 자식 클래스 타입으로 변환 시 주의할 점 - 타입 캐스팅 Testing
자식 클래스 타입으로 바꿀 수 있는지 테스트하는 과정이 필요하다.
상속의 컴파일의 한계
# 자동으로 타입캐스팅이 되는 거에 대해서 개발자가 수동으로 예외처리를 해줘야된다.
(컴파일은 여기까지 커버못해주니, 개발자가 알아서 체크해줘라. 라고 자바 API가 말함.)
# 상속의 컴파일은 다음과 같은 에러에 대한 예외처리를 해주지 않는다.
그래서, 개발자가 직접 이에 대한 예외처리를 해줘야되는 책임이 있다.
상속의 컴파일의 한계 추가예제
타입 캐스팅에 대한 예외처리를 해줘야한다.
상속받은 클래스에 대해서 객체로 사용하고자 할 때?,
타입에 대한 체크를 진행한 후 메소드를 호출해야 된다.
(이 부분에 대해선, 질문이나, 더 공부해보고 자세하게 정리하겠다.)
'CS 대학강의' 카테고리의 다른 글
[CS 1-2 | 대학생을 위한 실용금융] 투자의 정리 8주차 (0) | 2022.11.02 |
---|---|
[CS 1-2 | 시스템 프로그래밍 기초] 포인터 심화 12주차 (1) | 2022.11.01 |
[CS 1-2 | 오픈소스 SW 기초] 가상화 & 리눅스 컨테이너 with Docker 6주차 (0) | 2022.10.20 |
[CS 1-2 | 프로그램 설계 방법론] Java로 병원 입원 관리 서비스 제작 (0) | 2022.10.20 |
[CS 1-2 | 프로그램 설계 방법론] Java로 스도쿠 프로그램 제작 (0) | 2022.10.18 |