추상화(Abstraction) - 핵심적인 코드만 보여주기
interface DiscountPolicy{
//할인되는 가격 반환
public int discount(Member member, int price);
}
class RateDiscountPolicy implements DiscountPolicy{
//상품 가격의 10%를 할인하여 할인되는 가격을 반환
@Override
public int discount(Member member, int price){...}
}
위 코드는 RateDiscountPolicy
클래스가 DiscountPolicy
인터페이스를 상속 받는다.
DiscountPolicy discountPolicy = new RateDiscountPolicy();
discountPolicy.discount(member, 10000);
이때 실행되는 discount
메서드는 자식 클래스인 RateDiscountPolicy
의 메서드이다.
하지만 실행클래스에서는 RateDiscountPolicy
객체를 DiscountPolicy
타입으로 바꿔 사용하고 있기 때문에 RateDiscountPolicy
의 구현부를 알지 못한다. 따라서 구현객체에 의존하지 않고 추상객체인 인터페이스에 의존함으로써 구현 코드를 숨긴다.
캡슐화(encapsulation) - 데이터 보호
public class Person{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age= age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Person
이라는 클래스에 이름, 나이와 같은 속성을 묶어 캡슐화를 하였다.
이 클래스의 이름, 나이는 접근제한자가 private
이기 때문에 직접 바꿀 수 없으며 get
, set
함수로만 접근할 수 있다.
상속(inherutance) - 코드 재사용
class Animal {
private String name;
public void setName(String name) {
this.name = name;
}
public abstract void cry(){
System.out.println("ㅜㅜㅜ");
}
}
class Cat extends Animal {
public void cry() {
System.out.println("냐옹냐옹!");
}
}
Cat
클래스는 Animal
클래스를 상속받았다. 따라서 모든 코드를 물려 받아 중복코드를 줄이고 수정하고 싶은 cry
메서드만 재정의하였다.
다형성(polymorphism) - 객체 변경 용이
어떤 변수, 메소드가 상황에 따라 다른 결과를 내는 것
<다형성을 가능하게 하는 것들>
class Parent {
void display() {
System.out.println("부모 클래스의 display() 메소드입니다.");
}
}
class Child extends Parent {
void display() {
System.out.println("자식 클래스의 display() 메소드입니다.");
}
}
Parent pa = new Parent();
pa.display(); //부모 클래스의 display() 메소드입니다.
Child ch = new Child();
ch.display(); //자식 클래스의 display() 메소드입니다.
void display(int num1){System.out.println(num1)}
void display(int num1, int num2){System.out.println(num1+num2)}
void display(int num1, double num2){System.out.println(num1+num2)}
display(10); // display(int num1) 메소드 호출 -> 10
display(10, 20); // display(int num1, int num2) 메소드 호출 -> 200
display(10, 3.14); // display(int num1, double num2) 메소드 호출 -> 13.14