Vehicle 인터페이스를 사용하여 연료 탱크 용량과 현재 남은 연료량을 조회하는 메서드를 제공하는 경우를 설명함.https://docs.oracle.com/javase/tutorial/java/concepts/interface.html
area() 메서드를 제공하는 방식을 설명함.public interface Vehicle {
double getFuelTankCapacityInGallons(); // 연료 탱크의 용량을 반환
double getGallonsOfGasoline(); // 현재 남아있는 연료량을 반환
}
// 구현 클래스 예시
public class Car implements Vehicle {
private double fuelTankCapacity;
private double gallonsOfGasoline;
public Car(double fuelTankCapacity) {
this.fuelTankCapacity = fuelTankCapacity;
this.gallonsOfGasoline = 0;
}
@Override
public double getFuelTankCapacityInGallons() {
return fuelTankCapacity;
}
@Override
public double getGallonsOfGasoline() {
return gallonsOfGasoline;
}
public void refuel(double gallons) {
this.gallonsOfGasoline += gallons;
if (this.gallonsOfGasoline > fuelTankCapacity) {
this.gallonsOfGasoline = fuelTankCapacity; // 최대 용량을 넘지 않도록 함
}
}
}
Vehicle 인터페이스는 연료와 관련된 기능을 정의하고, 이를 구현하는 클래스들은 인터페이스에 정의된 메서드들을 구현하여 필요한 기능을 제공public interface Shape {
double area(); // 도형의 면적을 계산하는 메서드
}
public class Square implements Shape {
private double side;
public Square(double side) {
this.side = side;
}
@Override
public double area() {
return side * side; // 정사각형의 면적 계산
}
}
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height; // 직사각형의 면적 계산
}
}
객체지향 프로그래밍에서 다형성(polymorphism)의 중요성
Shape 인터페이스와 이를 구현하는 Square와 Rectangle 클래스는 다형성을 통해 같은 인터페이스를 공유하면서도 각기 다른 방식으로 면적을 계산
이는 코드의 재사용성을 높이고, 새로운 도형을 쉽게 추가할 수 있게 함
절차적 코드와 객체지향 코드의 차이점에 대해 설명
기존 코드를 변경하지 않고 새로운 객체 타입을 추가하는 것이 쉬운 점을 강조. 반대로 기존 객체에 새로운 동작을 추가하는 것은 어려움.
절차적 코드에서는 새로운 데이터 구조를 추가하는 것이 어렵고, 객체 지향 코드에서는 새로운 함수를 추가하는 것이 어려움.
// 절차적 코드
public class ProceduralExample {
public static double calculateRectangleArea(double width, double height) {
return width * height;
}
}
// 객체 지향 코드
public interface Shape {
double area(); // 도형의 면적을 계산하는 메서드
}
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height; // 직사각형의 면적 계산
}
}
절차적 코드는 데이터와 기능이 분리되어 있어 새로운 구조를 추가하기 어렵지만, 객체지향 코드는 데이터와 기능이 함께 캡슐화되어 있어 새로운 타입의 객체를 쉽게 추가할 수 있음.
이 차이는 코드의 유지보수성과 확장성에 큰 영향
디미터 법칙
객체가 자신이 조작하는 객체의 속사정을 알아서는 안 된다
예시 코드로 ctxt, Options, ScratchDir을 통해 객체 간의 상호작용을 보여줌.
getOptions(), getScratchDir() 메서드를 통해 객체 내의 내부 구조를 노출하지 않고, 상호작용할 수 있도록 설계됨.