하나의 객체가 여러 형태를 가질 수 있다는 객체 지향 특징 중 하나.
📌즉 역할과 구현을 구분함.📌
✔️역할 = 인터페이스
✔️구현 = 인터페이스를 구현한 클래스, 구현 객체
<People.java>
package polymorphismEx;
// 역할 -> 인터페이스
public interface People {
void talk();
}
<Man.java>
package polymorphismEx;
// 구현 -> 인터페이스를 구현한 클래스
public class Man implements People {
@Override
public void talk() {
System.out.println("Man.talk()");
}
}
<Woman.java>
package polymorphismEx;
// 구현 -> 인터페이스를 구현한 클래스
public class Woman implements People {
@Override
public void talk() {
System.out.println("Woman.talk()");
}
}
<Main.java>
package polymorphismEx;
public class Main {
public static void main(String[] args) {
People people = new Woman();
// People people = new Man();
people.talk();
}
}
<출력>
객체 지향 개발 5대 원리
🔻다형성에서 OCP, DIP 위배하는 경우가 발생할 수 있음.
- OCP 위반의 경우 : Main.java의 main함수 안에서 구현 객체인 Woman(), Man() 클래스를 변경하기 위해 코드를 변경해야 함.
- DIP 위반의 경우 : 또한 구현 클래스를 직접 선택( = 의존 )하고 있음.
- 해당 사항들은 스프링 컨테이너( DI, IoC 컨테이너 )와 DI를 통해 문제점 해결 가능
객체를 직접 생성하는 것이 아닌 외부에서 생성한 후 주입 시켜주는 방식
<Paper.java>
public class Paper {
private Pen pen;
public Paper() {
pen = new Pen();
}
public void draw() {
pen.draw();
}
}
<Pen.java>
public class Pen {
private String redPen = "redpen is drawing";
public void draw() {
System.out.println(redPen);
}
}
<dependencyExMain.java>
public class dependencyExMain {
public static void main(String[] args) {
Paper paper = new Paper();
paper.draw();
}
}
<코드 설명>
-> 의존성으로 인해 Unit Test 및 Code 변경이 어려워짐.
의존관계 주입 방법은
이렇게 네 가지 정도가 있다.
이 중, 생성자 주입과 수정자 주입이 일반적으로 쓰임.
생성자를 통해 의존 관계를 주입 받는 방법
<Paper.java>
package dependencyEx;
public class Paper {
private final Pen pen;
public Paper(Pen pen) {
this.pen = pen;
}
public void draw() {
pen.draw();
}
}
setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법