결합도 : 서로 다른 모듈 간에상호의존하는 정도/연관된 관계 변형을 줄 때 주변에 손상을 미치는 정도(분리했을 때 리스크가 큰 것을 결합도가 높다고 함) ex) 결합도가 높은 것(신체) VS 결합도가 낮은 것(로봇)
응집도 : 결합도에 대응 / 응집도는 한 모듈 내부의 처리요소들이 서로 관련되어 있는 정도
응고결저 : 응집도는 높고 결합도는 낮은 것이 좋음
Written by zer0box
Vingsu<<interface>>
jdk 1.8미만에서는 default 매서드가 지원되지 않기 때문에 추상클래스를 사용하는 것이 적합
package kr.co.web.model;
public interface Vingsu {
public default void iceFlake() {
System.out.println("갈아둔 얼음을 넣는다");
}
public default void milk() {
System.out.println("멸균우유를 넣는다");
}
public default void redBean() {
System.out.println("팥을 넣는다");
}
public default void jelly() {
System.out.println("젤리를 넣는다");
}
public void etc();
}
RedBeanVingsu
package kr.co.web.model;
public class RedBeanVingsu implements Vingsu {
@Override
public void etc() {
System.out.println("추가 첨가 없음");
}
}
ChocoVingsu
package kr.co.web.model;
public class ChocoVingsu implements Vingsu {
@Override
public void etc() {
System.out.println("초코시럽을 넣는다");
}
}
CookieVingsu
package kr.co.web.model;
public class CookieVingsu implements Vingsu {
@Override
public void etc() {
System.out.println("쿠키를 넣는다");
}
}
FruitVingsu
package kr.co.web.model;
public class FruitVingsu implements Vingsu {
@Override
public void etc() {
System.out.println("과일을 넣는다");
}
}
VingsuMachine
인터페이스를 구현받은 클래스는 인터페이스 데이터타입의 변수에 들어갈 수 있다(다형성)
객체화 할 때 변수에 담에서 넣어줄 수도 있지만 매개변수 위치에 바로 넣어줄 수 있음(그릇없이)
package kr.co.web.model;
public class VingsuMachine {
String name;
public VingsuMachine(String name) {
this.name = name;
}
//매개변수 자리에서 바로 객체화 해버림
//Vingsu 타입에 ChocoVingsu, CookieVingsu, RedBeanVingsu, FruitVingsu가 들어갈 수 있다
public String makeVingsu(Vingsu vingsu) {
vingsu.iceFlake();
vingsu.milk();
vingsu.redBean();
vingsu.jelly();
vingsu.etc();
return name + "가 완성되었습니다.";
}
}
부모를 상속받는 객체들을 담을변수를 여러개 만들지 않아도 됨(부모클래스or인터페이스를 객체화하여 사용)
부모객체 형태로 매개변수를 받아 들어오는 변수의 폭을 넓힐 수 있음(부모객체로 자식객체를 다 받을 수 있음)
다형성은 상속관계 뿐 아니라 구현 관계에서도 동작
Car(부모)
package kr.co.web.model;
public class Car {
public String run() {
return " 자동차를 운전합니다.";
}
}
Benz(자식)
package kr.co.web.model;
public class Benz extends Car {
@Override
public String run() {
return this.getClass().getSimpleName() + super.run();
}
}
BMW(자식)
package kr.co.web.model;
public class BMW extends Car {
@Override
public String run() {
return this.getClass().getSimpleName() + super.run();
}
}
Audi(자식)
package kr.co.web.model;
public class Audi extends Car {
@Override
public String run() {
return this.getClass().getSimpleName() + super.run();
}
}
Ferrari(자식)
package kr.co.web.model;
public class Ferrari extends Car {
@Override
public String run() {
return this.getClass().getSimpleName() + super.run();
}
}
Racer(Car를 매개변수로 받음)
Car를 상속받는 객체면 다 들어올 수 있음
사용할 차량을 추가하고 싶다면 Car를 상속받는 객체만 추가하면 됨
package kr.co.web.model;
public class Racer {
//레이서 클래스에 드라이브 메서드를 선언하여 매개변수로 Car타입의 변수를 받도록 했습니다.
//매개변수로 올 수 있는 Car타입의 변수는 Car타입을 상속받는 자식객체인 benz,bmw,audi,ferrari입니다.
public String drive(Car car) {
return car.run();
}
//Car 클래스를 이용하여 규격화하지 않고 각각의 차량 클래스를 구현할 경우
//차량이 추가될 때 마다 메서드를 추가해 오버로딩해주어야 해서 번거로움이 있기 때문에
//대형 프로젝트를 진행할 경우에는 하나의 타입으로 자식 객체들을 불러올 수 있기 때문에 다형성을 이용하는 것이 유용합니다.
}