본문 바로가기
JAVA

[JAVA] - 추상화 / 캡슐화 / 상속 / 다형성

by nam_ji 2024. 1. 30.

추상화 / 캡슐화 / 상속 / 다형성

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) - 객체 변경 용이

  • 어떤 변수, 메소드가 상황에 따라 다른 결과를 내는 것입니다.
    • 다형성을 가능하게 하는 것들입니다.
      1. 오버라이딩 (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() 메소드입니다.
           
      2. 오버로딩 (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

'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