[JAVA] 객체지향 프로그래밍 OOP

자바의 객체지향 프로그래밍(OOP)을 이야기 할 때,
3대 개념이라고 해서 Encapsulation, Inheritance, Polymorphism 을 이야기 하기도 하고,
여기에 Abstraction를 추가해서 APIE라고 하기도 한다.
java oop concepts을 구글링하면 여러분류를 알아볼 수 있으며, 대체적으로 아래의 속성들을 이야기한다.

  • 추상성 (Abstraction)
  • 다형성 (Polymorphism)
  • 상속성 (Inheritance)
  • 은닉성 (Encapsulation)
  • 클래스 (Class)
  • 객체 (Object)
  • 메서드 (Method)

검색결과에서 모듈성1도 보이는데, 이는 OOP이전에 대표적인 프로그래밍 패러다임인 C의 절차식 프로그래밍(Procedural programming)2에서도 공통적으로 볼 수 있는 특징이기에 따로 정리는 안하겠다.
모듈성은 객체 지향 프로그래밍에서 ‘객체(Object)’를 사용하여 더 세련되게 구현 가능 하다고 보면 된다.

위 7개중 아래 3개 항목인 클래스, 객체, 메서드는 구성요소로 분류하고, 나머지는 특징으로 나누어서 정리해보겠다.

OOP(Object Oriented Programming) 프로그래밍 특징 (APIE)

추상성 (Abstraction)

  • 관련없는 세부 사항을 무시하고 객체의 필요한 특성만 식별하는 프로세스로 정의
  • 추상클래스를 상속받은 자식클래스에서 추상메서드의 구현부를 완성해야 함(강제상속)

추상클래스

  • 클래스내 추상메소드가 선언되어 있음
  • 추상클래스는 자기 이름으로 자신의 객체를 생성 할 수 없음

추상메소드

  • 추상메소드는 선언부는 작성하고 구현부는 작성하지 않음 (추상메소드임을 알림)
  • 일반메소드가 추상 메소드를 호출 할 수 있음

장점

  • 객체를 보는 복잡성을 줄여 줌
  • 코드 복제를 방지하고 재사용성(reusability)을 높힘.
  • 중요한 세부 정보만 사용자에게 제공되므로, 응용 프로그램이나 프로그램의 보안이 강화

예제

//추상클래스 A
abstract class A{
    //추상메소드 b()
    public abstract int b();

    //추상클래스내 추상메소드가 아닌 메소드 존재 가능
    public void d(){
        System.out.println("world");
    }
}

//클래스 B는 추상 클래스 A를 상속
class B extends A{
    // 추상클래스 A의 추상 메소드인 메소드 b를 오버라이딩
    @Override
    public int b(){
        return 1;
    }
}

public class AbstractDemo {
    public static void main(String[] args) {
        //클래스 A를 상속받은 B클래스를 인스턴스화 하여 결과적으로는 추상 클래스 A를 사용 하게 됨
        B obj = new B();
        System.out.println(obj.b());
    }
}

output

1

다형성 (Polymorphism)

  • 동일한 이름을 가진 엔티티를 효율적으로 구별하는 능력
  • Overloading , Overriding
  • Reference 다형성 : 부모의 타입으로 자식의 객체를 생성하는 레퍼런스 다형성
  • Argument 다형성 : 부모의 이름으로 자식의 타입을 받는 아규먼트 다형성
  • Method 다형성 : 부모의 이름으로 자식을 생성하거나 받은 다음, 부모 쪽에 있는 메서드를 호출하면 오버라이딩 된 자식 메서드가 호출

예제

  • Overloading도 다형성의 한 예제
class {
    public void a(int param){
        System.out.println("숫자출력");
        System.out.println(param);
    }
    public void a(String param){
        System.out.println("문자출력");
        System.out.println(param);
    }
}

public class PolymorphismOverloadingDemo {
    public static void main(String[] args) {
        O o = new O();
        o.a(1);;
        o.a("one");
    }
}

output

숫자출력  
1  
문자출력  
one  

상속성 (Inheritance)

  • 한 클래스가 기존 클래스를 재사용 하기 위해 상속
  • extends를 사용하여 부모클래스(Parent Class)(=기본클래스(base class), 상위클래스(super class))의 필드, 메소드를 물려받음
  • 다른 클래스를 상속하는 자식 클래스(Child Class)(= 파생 클래스(derived class), 확장 클래스, 서브클래스(sub class), 하위 클래스)에서는 자체 필드, 메소드 추가 가능
  • 오버라이딩 은 상속관계가 성립했을 때에만 이루어 짐

예제

class Animal{  
    void eat(){
        System.out.println("eating...");
    }  
}  

class Dog extends Animal{  
    void bark(){
        System.out.println("barking...");
    }  
}  

class TestInheritance{  
    public static void main(String args[]){  
        Dog d=new Dog();  
        d.bark();  
        d.eat();  
    }
}  

output

barking...  
eating...

은닉성 (Encapsulation)

  • 단일 단위로 데이터를 래핑하는 것
  • 데이터 보호를 위해 멤버필드르 메서드를 통해 접근하는 것
  • 클래스가 숨겨짐으로 data-hiding 이라고도 함
  • 접근제한자(private)로 속성들을 생성하여 클래스 밖에서 접근하여 변경하지 못하게 함
  • 멤버필드는 private를 사용하고 메서드는 public을 사용하여 멤버필드를 보호하는 것

접근제한자

접근제한자는 필드, 메소드, 생성자 또는 클래스의 액세스 가능성 또는 범위를 지정하여 은닉성을 가능하게 하는 특징

  • pirvate : -, 오직 클래스 내에 서만 접근 가능. 클래스 외부에서는 접근 할 수 없음
  • default : ~, 같은 패키지에서 접근 가능. 패키지 외부에서 접근 할 수 없음. 접근제한자를 지정하지 않으면 이것이 기본값
  • protected : #, 내부 패키지와 하위 클래스를 통한 외부 패키지에서 접근 가능. 즉, 자식 클래스를 만들지 않으면 패키지 외부에서 접근 할 수 없음. (상속일 경우 어디서나 접근 가능)
  • public : +, 어디에서나 접근가능. 클래스 내, 외부 클래스, 패키지 내 및 패키지 외부에서 접근 가능.

public > protected > default > private


references

https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
https://www.geeksforgeeks.org/object-oriented-programming-oops-concept-in-java/?ref=lbp
https://opentutorials.org/module/516/6062
https://opentutorials.org/module/516/6127
https://www.javatpoint.com/inheritance-in-java
https://www.javatpoint.com/runtime-polymorphism-in-java


각주

  1. 시스템 기능별로 나누어 작성한 것으로, 프로그램 재사용성을 높이고 개발시간을 단축시킴 

  2. 프로시저 호출의 개념을 바탕으로 하고 있는 프로그래밍 패러다임을 의미 

Tags: ,

Categories:

Updated: