본문 바로가기
Computer Science/Computer Science

Object Oriented Programming(OOP) 객체 지향 프로그램

by SeleniumBindingProtein 2023. 1. 25.
728x90
반응형

객체 지향 프로그램

  • 객체 지향 프로그램 : 객체의 관점에서 프로그래밍 <-> C 언어 : 절차 지향적인 프로그래밍(프로세스가 함수 단위로 순서대로 진행됨)
  • 객체를 기준으로 코드를 나누어 구현함
  • 애플리케이션을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍함
  • Java => 구성 부분 단위는 클래스이며, 클래스는 설계도 역할이고, 구현체는 인스턴스임
    • 클래스 : 객체를 정의하고 만들어 내기 위한 설계도이며, 클래스 안에 객체를 만들어내기 위해 변수와 메서드들이 존재함
    • 객체 : 클래스에 선언된 모양 그대로 생성된 실체로 클래스의 인스턴스라고 부름
    • 인스턴스 : 클래스를 통해 구현해야 할 객체가 실제로 구현된 구체적인 실체
  • 캡슐화(Encapsulation) 
    • 정의 : 하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶음
    • 목적 : 정보은닉
      • ex) 정보를 가지고 있는 어떤 객체에서 그 정보가 public으로 선언되어 있다면, 누구든 접근해서 타겟 정보를 변경할 수 있기 때문에 => private으로 선언하여 데이터를 보호하고, 접근을 제한해야 함
      • 보호된 변수는 getter or setter 등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것이 캡슐화의 목적임  
      • 캡슐화는 불필요한 정보를 감출 수 있기 때문에 정보은닉 할 수 있다는 특징이 있는 것이지, 정보은닉과 동일한 개념은 아님
        • ex) 사용자 입장에서 public으로 정의된 속성만 알면 되며, private으로 정의된 속성은 알 필요가 없다는 의미임
  • 추상화(Abstraction)
    • 정의 : 목적과 관련이 없는 부분을 제거하여 필요한 부분만 표현함
      • 추상클래스 : 추상적으로 끄집어 낸 개념들을 큰 틀에서 클래스로 만듦
      • 추상화 : 객체들의 공통된 특징을 파악해 정의해놓은 설계 기법
  • 다형성(Polymorphism)
    • 정의 : 상속을 통해 기능을 확장하거나 변경함
      • 다형성 : 형태가 같은데 다른 기능을 하는 것을 말함
        • 같은 동작을 하지만 다른 결과물이 나올 경우, 다형이라고 함 => 코드의 재사용, 코드의 길이가 감소되어 유지보수가 용이함
        • 같은 이름의 속성을 유지함에 있어서, 속성을 사용하기 위한 인터페이스 유지 및 메서드 이름 낭비가 없다는 장점이 있음(API가 많아질수록, 복잡성이 증하기 때문에 다형성이 유용함)
    • Overriding : 부모 클래스에서 상속받은 자식 클래스에서 부모클래스에서 만들어진 메서드를 자식 클래스에서 자신의 입맛대로 다시 재정의해서 사용함
    • Overloading : 같은 이름의 메서드를 사용하지만, 메서드마다 다른 용도로 사용되며, 그 결과물도 다르게 구현할 수 있게 만듦
      • 오버로딩이 가능하려면 메서드끼리는 이름이 같지만, 매개변수의 갯수나 데이터 타입이 다르면 오버로딩 적용되며, 메서드 이름이 같아도 문법 에러는 발생하지 않음
  • 상속성(Inheritance)
    • 정의 : 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와줌
      • 기존 클래스에 기능을 가져와 재사용할 수 있고, 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 줌
      • 자바에선 상속은 단일 상속밖에 지원이 안되며, C++에선 다중상속이 지원됨
    • 목적 : 코드의 중복을 없애기 위함
      • 개발도 복잡하고, 유지보수에서도 많은 비용이 발생함
  • 객체 지향적 설계 원칙
    • SRP(Single Responsibility Principle) : 단일 책임 원칙
      • 클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 한다.
        • 클래스가 여러 책임을 갖게 되면, 그 클래스는 각 책임마다 변경되는 이유가 발생하기 때문에 =>  클래스가 한 개의 이유로만 변경되려면 클래스는 한 개의 책임만 가져야 함
    • OCP(Open-Closed Principle) : 개방-폐쇄 원칙 
      • 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
        • 기능을 변경하거나 확장할 수 있으면서, 그 기능을 사용하는 코드는 수정하지 않음
        • 변화하는 부분을 추상화함으로써, 기존 코드를 수정하지 않고, 확장할 수 있게 만들어 줌
        • 개방 폐쇄 원칙을 지키는 방법으로는
          • 1) 변화하는 부분을 추상화 하는 것
          • 2) 상속을 이용하는 것
        • 원칙을 지키지 않았을 경우, 문제점
          • 1) 다운 캐스팅
          • 2) 비슷한 if ~ else 블록이 존재
    • LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
      • 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
        • 특정 메소드가 상위타입을 인자로 사용한다고 할 때, 그 타입의 하위 타입도 문제없이 정상적으로 작동해야 함
        • 원칙 위반 문제
          • 리스코프 치환 원칙이 지켜지지 않으면 개방 폐쇄 원칙을 위반하게 되므로 기능 확장을 위해 더 많은 부분을 수정해야 함
    • ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
      • 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
        • 클라이언트는 자신이 사용하는 메소드에만 의존해야 한다.
        • 인터페이스 분리 원칙은 클라이언트를 기준으로 인터페이스를 분리함으로써, 클라이언트로부터 발생하는 인터페이스의 여파가 다른 클라이언트에 미치는 영향을 최소화하는 것
    •  DIP(Dependency Inversion Principle) : 의존 역전 원칙
      • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다. 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
728x90
반응형

댓글