OOP의 네가지 특징(추상화/캡슐화/상속/다형성)

노을·2022년 3월 7일
3

java

목록 보기
4/9
post-thumbnail

oop란?

  • 객체지향 프로그래밍
  • 기본의 만들었던 내용을 재사용할 수 있다는 장점이 있다.
  • 프로그램을 독립된 단위인 객체들의 모임으로 보고 각각 객체는 메시지를 주고 받고 데이터를 처리함.


oop의 네 가지 특징


추상화(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) - 객체 변경 용이

  • 어떤 변수, 메소드가 상황에 따라 다른 결과를 내는 것

    <다형성을 가능하게 하는 것들>

    • 오버라이딩(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

0개의 댓글