추상화 / 캡슐화 / 상속 / 다형성
OOP (Object-Oriented-Programming)란
- 객체지향 프로그래밍
- 기본의 만들었던 내용을 재사용할 수 있다는 장점이 있습니다.
- 프로그램을 독립된 단위인 객체들의 모임으로 보고 각각 객체는 메시지를 주고 받고 데이터를 처리합니다.
OOP 4가지 특징
1. 추상화 (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의 구현부를 알지 못합니다. 따라서 구현객체에 의존하지 않고 추상객체인 인터페이스에 의존함으로써 구현 코드를 숨깁니다.
-
2. 갭슐화 (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 함수로만 접근할 수 있습니다.
-
3. 상속 (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 메소드만 재정의 하였습니다.
4. 다형성 (Polymorphism) - 객체 변경 용이
- 어떤 변수, 메소드가 상황에 따라 다른 결과를 내는 것입니다.
- 다형성을 가능하게 하는 것들입니다.
- 오버라이딩 (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) - 한 클래스에서 메소드 이름은 같지만 파라미터 개수나 자료형을 다르게 하여 서로 다르게 동작하는 것입니다.
-
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
-
- 오버라이딩 (overriding) - 부모클래스 메소드를 자식클래스에서 재정의하는 것입니다.
- 다형성을 가능하게 하는 것들입니다.
'JAVA' 카테고리의 다른 글
[JAVA] - 메서드란 (method) (0) | 2024.01.31 |
---|---|
[JAVA] - 필드란 (Field) (0) | 2024.01.31 |
[JAVA] - super와 super() (0) | 2024.01.29 |
[JAVA] - this와 this() (0) | 2024.01.27 |
[JAVA] - 생성자 (0) | 2024.01.27 |