4. 모듈간 독립적 프로그래밍으로 인한 개발기간 단축
개발자와 디자이너의 규칙을 인터페이스로 정의
interface LoginProcess {
// 공통 기능으로 login() 메서드를 정의하여 파라미터와 리턴타입 지정
public abstract String login(String id, String pass);
}
디자이너의 경우
➡️로그인 처리 과정은 중요하지 않고 전달 데이터와 리턴 데이터만 중요함
➡️LoginProcess 인터페이스를 구현하는 클래스를 정의하여 login() 메서드 구현
class Designer implements LoginProcess {
@Override
public String login(String id, String pass) {
// 메서드에 전달되는 데이터가 정확한지만 확인하고
// 리턴값이 외부로 잘 전달되는지만 확인하면 된다!
System.out.println("디자이너가 전달받은 아이디 : " + id);
System.out.println("디자이너가 전달받은 패스워드 : " + pass);
return "성공";
}
}
class DesignerClient { // 디자이너
Designer designer = new Designer();
public void login() {
String id="admin";
String pass="1234";
// login() 메서드를 호출하여 파라미터로 아이디, 패스워드를 전달하고
// 로그인 결과로 리턴되는 값을 출력하여 확인 작업 수행
String result = designer.login(id, pass);
System.out.println("로그인 결과 : " + result);
if(result.equals("성공")) {
// 로그인 성공 페이지로 이동 처리 작업 수행
} else {
// 로그인 실패 페이지로 이동 처리 작업 수행
}
}
}
개발자의 경우
➡️전달받은 값은 중요하지 않고 전달받은 값을 사용하여 로그인 처리 작업 수행 로그인 처리 후 리턴되는 값이 정상적으로 전달되는지만 확인
➡️LoginProcess 인터페이스를 구현하는 Developer 클래스 정의
class Developer implements LoginProcess {
// 추상 메서드 구현 필수!
@Override
public String login(String id, String pass) {
// 디자이너로부터 전달받은 아이디와 패스워드를 사용하여
// 로그인 작업을 처리한 후 "성공" 또는 "실패" 문자열 리턴
System.out.println("개발자가 전달받은 아이디 : " + id);
System.out.println("개발자가 전달받은 패스워드 : " + pass);
System.out.println("아이디와 패스워드로 로그인 작업 처리 완료!");
return "성공";
}
}
class DeveloperClient {
Developer developer = new Developer();
public void login() {
String result = developer.login("admin", "1234");
System.out.println("로그인 결과 : " + result);
}
}
DeveloperClient developer = new DeveloperClient();
developer.login();
➡️디자이너가 전달하게 될 아이디와 패스워드를 임의로 설정하여 전달하고 개발자 코드를 통해 로그인 작업을 수행한 후 리턴되어지는 값이 정상적인지 확인
예제
모든 도형의 그리기 기능을 제공하는 Shape 인터페이스 정의
-> draw() 추상메서드 정의(리턴값 없음, 파라미터 없음) Shape 인터페이스를 구현하는 Circle, Rectangle 클래스 정의
=> 추상메서드 draw()를 오버라이딩하여 각자 도형 그리기 기능을 구현
ex) Circle - "원 그리기", Rectangle - "사각형 그리기" 출력
=> Circle : 멤버변수(반지름, radius, 실수형, 접근제한자 : private) Setter() 메서드, draw() 메서드("원그리기! 반지름 : 반지름 길이")
=> Rectangle : 멤버변수(가로, width, 실수형, 접근제한자 : private) 세로, height, 실수형, 접근제한자 : private)
Setter() 메서드, draw() 메서드 호출 시 "가로: 가로길이, 세로: 세로길이의 사각형 그리기!"
package interface_;
public class Test4 {
public static void main(String[] args) {
Photoshop p = new Photoshop();
p.draw(new Circle());
p.draw(new Rectangle());
}
}
// ------------------------------------------------------------
// 모든 도형의 그리기 기능을 제공하는 Shape 인터페이스 정의
// => draw() 추상메서드 정의(리턴값 없음, 파라미터 없음)
interface Shape {
public abstract void draw();
}
class Circle implements Shape {
private double radius = 3.0;
public void setRadius(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("원 그리기! - 반지름 : " + radius);
}
}
class Rectangle implements Shape {
private double width = 2.0;
private double height = 1.5;
public void setWidth(double width) {
this.width = width;
}
public void setHeight(double height) {
this.height = height;
}
@Override
public void draw() {
System.out.println("가로 : " + width + ", 세로 : " + height + " 의 사각형 그리기!");
}
}
// Photoshop 클래스 정의
// draw() 메서드 정의
// => Circle, Rectangle 인스턴스를 전달받아 해당 인스턴스의 draw() 호출
// 두 인스턴스의 공통 타입으로 Shape 인터페이스를 파라미터 타입으로 지정
class Photoshop {
// draw() 메서드 정의
// => Circle, Rectangle 인스턴스를 전달받아 해당 인스턴스의 draw() 호출
// 두 인스턴스의 공통 타입으로 Shape 인터페이스를 파라미터 타입으로 지정
public void draw(Shape s) { // Circle & Rectangle -> Shape 업캐스팅
// Shape 타입 변수의 draw() 메서드 호출 시 실제 인스턴스의 draw() 호출됨
s.draw();
}
}
'JAVA' 카테고리의 다른 글
[JAVA] toString() 메서드 (0) | 2023.10.11 |
---|---|
[JAVA] object 클래스 (0) | 2023.10.11 |
[JAVA] 인터페이스 ④ - 인터페이스의 필요성(2) (1) | 2023.10.10 |
[JAVA] 인터페이스 ③ - 인터페이스의 필요성 (1) | 2023.10.10 |
[JAVA] 인터페이스 ② 다이아몬드 상속에서의 문제점(이슈)와 예제 (0) | 2023.10.10 |