OOP 란?
객체지향 프로그래밍을 말한다.
기본존에 만들었던 내용을 재사용할 수 있다는 장점이 있다.
프로그램을 독립된 단위인 객체들의 모임으로 보고
각각 객체는 메시지를 주고 받고 데이터를 처리한다.
OOP의 네가지 특징
추상화 - 핵심 코드 확인
불필요한 부분을 숨김
인터페이스와 구현을 분리
구현객체에 의존하지 않고 추상객체인
인터페이스에 의존함으로써 구현 코드를 숨깁니다.
interface DiscountPolicy{
//할인되는 가격 반환
public int discount(Member member, int price);
}
class RateDiscountPolicy implements DiscountPolicy{
//상품 가격의 10%를 할인하여 할인되는 가격을 반환
@Override
public int discount(Member member, int price){...}
}
캡슐화 - 데이터 보호
데이터 캡슐화 : 필드와 메서드를 하나로 묶음
은닉화 : 객체의 세부 내용이 외부에 드러나지 않아
외부에서 데이터를 직접 접근하는 것을 방지함
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;
}
}
모든 변수가 private 이기 때문에 직접 변경할 수 없이 get, set 함수로만 접근이 가능합니다.
상속 - 코드 재사용
자식클래스가 부모클래스의 특징과 기능을 물려받음
클래스를 상속 받아 수정하여 사용하기 때문에 중복 코드를 줄임
부모클래스의 수정으로 모든 자식클래스들도 수정됨
클래스에 메서드 추가가 어려운 경우에 사용
내가 아닌 남이 만든 클래스를 가져오는 경우 (수정 불가)
클래스가 다양한 곳에서 상속 받아 쓰이는 경우 ( 메서드를 추가하면 다른 곳에서 불필요한 기능 포함될 수 있다.)
class Animal {
private String name;
public void setName(String name) {
this.name = name;
}
public abstract void cry();
public void printName() {
System.out.println(name);
}
}
class Cat extends Animal {
@Override
public void cry() {
setName("나비");
System.out.println("냐옹냐옹!");
}
public static void main(String[] args) {
Cat cat = new Cat();
cat.cry();
cat.printName(); // 추상 클래스에서 name을 보호하기 위해 추가한 메소드
}
}
Animal 클래스를 상속받았다.
따라서 모든 코드를 물려받아 중복코드를 줄이고 수정하고 싶은 cry 메서드만 재정의가 가능하다.
다형성 - 객체 변경 용이
어떤 변수, 메서드가 상황에 따라 다른 결과를 낸다.
다형성 예시
오버라이딩(Overriding) : 부모클래스 메서드를 자식클래스에서 재정의 한다.
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() 메소드입니다.
오버라이딩(Overloading) : 한 클래스에서 메서드 이름은 같지만 파라미터 개수 OR 자료형을 다르게 동작하는 것
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
728x90