Object Oriented Programming


  • 목차
  • OOP(Object Oriented Programming)는 현실 세계의 사물 및 개념들을 객체의 관점으로 보고 그 객체들을 조립하여 프로그래밍 하는 기법
  • 절차 지향적 프로그래밍(C언어)의 코드의 재 사용성중복 제거를 목적으로 만들어진 기법

절차 지향 프로그래밍

  • 실행하고자 하는 절차를 정하고, 그 절차대로 프로그래밍
  • 목적을 달성하기 위한 일의 흐름에 중점을 둔다.

객체 지향 프로그래밍

  • 현실 세계의 사물 및 개념들을 객체의 관점으로 보고 표현하여 프로그래밍
  • 객체 지향을 사용하여 변경에 유연하고 재사용성과 확장성이 높은 개발을 할 수 있다.
  • 객체들의 관계를 결정하고 이들의 상호 작용에 필요한 함수(메서드)와 변수(필드)를 설계 및 구현
  • 하나의 클래스를 바탕으로 서로 다른 상태를 가진 인스턴스를 만들면 서로 다른 행동을 하게 됨
  • 즉, 하나의 클래스가 여러 개의 인스턴스가 될 수 있다 - 재활용 성

객체지향(OOP)의 특징

1. 추상화

  • 필요한 객체 관련 속성들 만 정의하고 불필요한 세부 정보는 숨기는 설계 기법
  • 추상 클래스(Abstract Class)와 인터페이스(Interface)를 사용하여 구현된다.

2. 캡슐화

  • 외부에 노출할 필요가 없는 정보들은 은닉하고 필요한 정보만 보여주게 설계 (정보 은닉)
  • 정보 은닉(information hiding): 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것
  • 정보 은닉을 통해서 높은 응집도와 낮은 결합도를 유지(변경에 대한 유연함과 유지보수성 증가)

3. 상속성

  • 부모 클래스가 자식 클래스에게 속성을 상속
  • 코드의 재사용

4. 다형성

  • 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것
  • 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
  • 반복된 코드를 줄이며 꼭 필요한 코드만 수정한다는 장점을 가짐
  • 다형성의 구현 방법
    • 오버로딩(Overloading)** : 한 클래스 내에서 매개변수 개수와 타입이 다르면, 같은 이름의 메서드를 **중복 정의 (같은 이름의 메서드지만 서로 다른 동작을 한다 - 다형성)
    • 오버라이딩(Overriding)** : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 **재정의

        class A{
            public String x(){return "A.x";}
        }
              
        class B extends A{
        		@Override
            public String x(){return "B.x";}
              
            public String y(){return "y";}
        }
              
        class B2 extends A{
        		@Override
            public String x(){return "B2.x";}
        }
              
        public class Test {
            public static void main(String[] args) {
                A obj = new B();
                A obj2 = new B2();
                System.out.println(obj.x());
                System.out.println(obj2.x());
            }
        }
              
        // 출력 결과
        // B.x
        // B2.x
      
      • 서로 다른 클래스 B와 B2가 동일한 데이터 타입 A로 인스턴스화 되었다.
      • 하지만 두 인스턴스의 메소드 x를 호출한 결과는 서로 다르다.
      • 이것이 상속오버라이딩 그리고 형변환(업캐스팅)을 이용한 다형성이다.
    • 함수형 인터페이스와 enum을 함께 사용
      • 함수형 인터페이스란? 람다식을 사용하기 위한 API로 자바에서 제공하는 인터페이스에 구현할 메소드가 하나 뿐인 인터페이스

객체 지향(OOP)의 장점

  • 객체 중심으로 프로그래밍하기 때문에
    • 사람의 관점에서 프로그램을 이해하고 파악하기 쉽다.
    • 강한 응집력약한 결합력을 가진다. (변경에 유연하다)
      • 응집력 : 해당 기능을 수행하기 위해 얼마 만큼의 기능과 아이디어가 뭉쳐있는지
      • 결합력 : 한 코드의 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 의존적인지
    • 재사용성, 확장성, 융통성이 높다.

객체 지향(OOP)의 단점

  • 객체가 많으면 프로그램 용량이 커질 수 있다. 느려진다.
  • 설계에 많은 시간이 투자된다.
  • 설계 실패 시, 다시 처음부터 시작해야 한다.

좋은 객체 지향 설계의 5가지 원칙

  Aa 원칙 설명
S SPR 단일 책임 원칙 객체는 단 하나의 책임(역할)만 가져야한다
O OCP 개방 폐쇄 원칙 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다
L LSP 리스코프 치환 원칙 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야한다
I ISP 인터페이스 분리 원칙 인터페이스를 클라이언트에 특화되도록 분리 시키라는 설계 원칙(특징에 맞춰 여러 개의 인터페이스로 분리)
D DIP 의존 역전 원칙 추상화에 의존해야지, 구체화에 의존하면 안된다. 의존 관계를 맺을 떄 변화하기 쉬운 것 또는 자주 변화하는 것 보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다.