이제 자바에 가장 큰 특징인 객체지향에 대해 정리해보자.
객체 지향은 4개의 특징을 가지고 있다.
- 추상화
- 캡슐화
- 상속
- 다형성
객체 지향 프로그래밍은 여러 개의 독립된 단위로 본다. 즉 "객체"들의 모임으로 파악한다.
또한 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들어주어서 대규모 소프트웨어 개발에 사용된다.
즉 레고 블럭 조립하듯이 가능하다!!!
다형성(Polymorphism)
하나의 객체가 하나의 클래스에 고정된 것이 아니라, 여러 가지 타입의 객체로 취급될 수 있다는 개념.
즉 하나의 인터페이스 또는 부모 클래스를 가지고 있는 자식이 그 인터페이스나 부모의 클래스로 취급될 수 있음.
즉 자동차라는 인터페이스를 하나 만들어놓고 그 밑에 K3, 아반떼, 테슬라라는 클래스를 만들었다.
이들은 전부 자동차라는 인터페이스의 타입으로 취급될 수 있다.
스프링의 핵심인 IoC(제어의 역전), DI(의존관계 주입)도 결국 다형성을 활용한다.
OCP(Open-Closed Principle)의 원칙
좋은 객체 지향 설계 원칙 중 하나로 OCP 원칙이 존재한다.
1. 새로운 추가 기능이나 변경이 생겼을 때 기존 코드는 확장할 수 있어야 한다.
2. 기존의 코드는 수정되지 않아야 한다.
즉 확장에는 열려있고 변경에는 닫혀있어야 한다는 소리인데... 즉 기존의 코드 수정 없이 새로운 기능을 추가할 수 있다는 의미다.
간단하게 자동차 인터페이스를 통해 OCP 원칙을 지키며 설계를 진행해보자.
public interface Car {
void startEngine();
void offEngine();
void pressAccelerator();
}
자동차 인터페이스로 3개의 메서드를 구현하도록 만들어놨다.
public class K3 implements Car{
@Override
public void startEngine() {
System.out.println("K3 엔진 켬");
}
@Override
public void offEngine() {
System.out.println("K3 엔진 끔");
}
@Override
public void pressAccelerator() {
System.out.println("K3 악셀 밟음");
}
}
public class Model3 implements Car{
@Override
public void startEngine() {
System.out.println("Model3 엔진 켬");
}
@Override
public void offEngine() {
System.out.println("Model3 엔진 끔");
}
@Override
public void pressAccelerator() {
System.out.println("Model3 악셀 밟음");
}
}
Car 인터페이스를 구현한 Model3, K3라는 자동차 클래스를 생성했다. 인터페이스를 구현했기에 모든 메서드를 오버라이딩을 해줬다.
public class Driver {
private Car car;
public void setCar(Car car){
System.out.println("자동차를 설정합니다 : " + car);
this.car = car;
}
public void Drive(){
System.out.println("자동차를 운전합니다.");
car.startEngine();
car.pressAccelerator();
car.offEngine();
}
}
자동차를 설정하고 변경이 가능하게 Driver라는 클래스를 하나 만들어두었다.
멤버 변수로 Car를 설정해서 자동차 객체를 갈아끼울 수 있도록 설계를 진행했다.
public class Main {
public static void main(String[] args) {
Driver driver = new Driver();
K3 k3 = new K3();
driver.setCar(k3);
driver.Drive();
Model3 model3 = new Model3();
driver.setCar(model3);
driver.Drive();
}
}
메인에서 Driver 객체를 생성하고 각각 K3와 Model3를 만들어서 Driver 안에 설정하고 메서드를 실행시키게 만들었다.
여기서 어디가 OCP 원칙을 지켰을까?
만약에 새로운 차량을 추가한다고 가정해보자. Car 인터페이스를 구현한 새로운 클래스가 만들어지고
main에서만 새로 생성해서 Driver 클래스에 설정해주면 된다.
즉 Driver는 변경이 되지 않는다.
main()과 일부를 제외한 프로그램의 핵심 부분은 전혀 수정하지 않아도 된다는 특징이 있다.
여기서 집고 넘어가야 하는 부분이 "코드 수정은 닫혀 있다"라는 의미이다.
새로운 차량을 추가하면 기능이 추가되기 때문에 코드 수정은 불가피하다. 어딘가는 당연히 수정돼야 하는 게 맞다.
'JAVA 강의(인프런)' 카테고리의 다른 글
UTF-8을 전 세계에서 사용하게 된 이유 (1) | 2024.10.13 |
---|---|
abstract(추상) & interface(인터페이스) (1) | 2023.12.06 |
다형성 (2) (0) | 2023.12.06 |
다형성(1) (2) | 2023.12.03 |