Object-Oriented Programming(OOP)

업데이트:

Object-Oriented Programming(OOP)

  • 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 객체들의 모임으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임이다.1
  • 강한 응집도(Cohesion)과 약한 결합도(Coupling)을 지향한다.

응집도(Cohesion)

한 모듈 내부의 기능적인 연관도를 나타낸다.2

응집도의 종류

순서대로 응집도는 감소한다.

기능적 응집도(Functional Cohension)

모듈 내부의 모든 기능이 단일한 목적을 위해 수행되는 경우.

순차적 응집도(Sequential Cohension)

동일합 입력과 출력을 사용하여 다른 기능을 수행하는 활동들이 모여있을 경우.

절차적 응집도(Procedural Cohension)

모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성요소들이 그 기능을 순차적으로 수행할 경우.

시간적 응집도(Temporal Cohension)

연관된 기능이라기 보단 특정 시간에 처리되어야 하는 활동들을 한 모듈에서 처리할 경우.

논리적 응집도(Logical Cohension)

유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들이 한 모듈에서 처리되는 경우.

우연적 응집도(Coincidentail Cohesion)

모듈 내부의 각 구성요소들이 연관이 없을 경우.

결합도(Coupling)

어떤 모듈이 다른 모듈에 의존하는 정도를 나타내는 것이다.3

결합도의 종류

순서대로 결합도는 감소한다.

내용 결합도(Content Coupling)

다른 모듈 내부에 있는 변수나 기능을 다른 모듈에서 사용 하는 경우. 한 모듈에서 수정이 일어날 경우 다른 모듈 또한 수정이 필요하다.

공통 결합도(Common Coupling)

파라미터가 아닌 모듈 밖에 선언되어 있는 전역 변수를 참조하고 전역변수를 갱신하는 식으로 상호작용하는 경우. 전역 변수를 변경하면, 그 자원을 사용하는 모든 모듈의 변경이 필요하다.

외부 결합도(External Coupling)

어떤 모듈에서 반환한 값을 다른 모듈에서 참조해서 사용하는 경우.

제어 결합도(Control Coupling)

단순히 처리를 해야할 대상인 값만 전달되는게 아니라 어떻게 처리를 해야 한다는 제어 요소(DCD, Flag등)이 전달되는 경우.

스탬프 결합도(Stamp Coupling)

모듈간의 인터페이스로 배열이나 오브젝트, 스트럭쳐등이 전달되는 경우.

자료 결합도(Data Coupling)

모듈간의 인터페이스 전달되는 파라미터를 통해서만 모듈간의 상호 작용이 일어나는 경우.

추상화(Abstraction)

  • 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.
  • 자료 표현에 불필요한 정보는 숨기고, 필요한 정보만 표현함으로써 프로그램을 간단히 만드는 것이다.
  • 객체의 구조인 클래스의 속성과 기능을 정의하는 것이다.
public class Class {

  // It can only be used inside.
  private String variable;

  // It can also be used outside.
  public String getVariable() {
    return this.variable;
  }

  // It can only be used inside the package.
  protected void setVariable(String variable) {
    this.variable = variable;
  }

}

캡슐화(Encapsulation)

  • 객체가 맡은 역할을 수행하기 위해 관련성 있는 속성과 기능을 하나로 묶는 것이다.
  • 객체 외부에서는 함수를 통해서만 객체 내부에 있는 데이터에 접근이 가능하게 한다.

은닉화(Hiding)

  • 객체 내부의 속성과 기능을 외부에서 접근하지 못하도록 숨기는 것이다.
  • 접근제어자를 이용하여 정보 제공에 대한 범위를 정의한다.

상속(Inheritance)

  • 상위의 개념의 속성과 기능을 하위 개념이 물려 받는 것이다.
public class Media {

  public String name;

  public Media(String name) {
    this.name = name;
  }

  public void play() {
    System.out.printf("The media(%s) is played.%n", this.name);
  }

}
public class Music extends Media {

  public Music(String name) {
    super(name);
  }

  @Override
  public void play() {
    System.out.printf("The music(%s) is played.%n", this.name);
  }

}

다형성(Polymorphism)

  • 프로그램 언어의 각 요소들이 다양한 자료형에 속하는 것이 허가되는 성질을 가리킨다.
  • 코드의 재사용성이 높아지고, 유지보수가 용이해진다.

오버 라이딩(Overriding)

  • 상위의 개념의 기능을 하위 개념이 물려 받아 새로운 기능으로 정의하는 것을 말한다.
  • 같은 이름의 기능이 여러 클래스에서 다른 기능을 한다.
public class Main {

  public static void main(String[] args) {
    Media media = new Music("Graceful Ghost");
    media.play();
  }

}
The music(Graceful Ghost) is played.

오버 로딩(Overloading)

  • 같은 이름의 기능이 매개변수의 개수나 자료형에 따라서 다른 기능을 하는 것을 말한다.
public class Media {
  ...
  public void play(String place) { // Overloaded the play method.
    System.out.printf("The media(%s) is played in %s.%n", this.name, place);
  }

}
public class Music extends Media {
  ...
  @Override
  public void play(String place) {
    System.out.printf("The music(%s) is played in %s.%n", this.name, place);
  }

}
public class Main {

  public static void main(String[] args) {
    Media media = new Music("Graceful Ghost");
    media.play("the Seoul Arts Center");
  }

}

The music(Graceful Ghost) is played in the Seoul Arts Center.

Reference

댓글남기기