본문으로 바로가기

[DP] 1. 객체 지향 프로그래밍 (OOP)

category CS/Design Pattern 2019. 4. 12. 19:46

1. 객체 지향 프로그래밍

  1. 객체 지향 프로그래밍 (OOP)
  2. OOP 특징
  3. 오버로딩과 오버라이딩
  4. 추상클래스와 인터페이스

 

1. 객체 지향 프로그래밍 (OOP)

1.1. OOP (Object Oriented Programming)

OOP(객체 지향 프로그래밍) 이전의 프로그래밍을 살펴보면, 컴퓨터가 사고하는대로 프로그래밍을 하는 컴퓨터 중심적 패러다임 이었다. 하지만, 객체 지향 프로그래밍이란 인간 중심적 패러다임 이라고 할 수 있다. 즉, 현실 세계를 프로그래밍으로 옮겨와 프로그래밍하는 것을 말한다. 현실 세계의 사물들을 객체라고 보고, 그 객체로부터 개발하고자 하는 애플리케이션에서 필요한 특징들을 뽑아와 프로그래밍 하는 것이다.

1.2. 클래스 (Clsss)

연관되어 있는 변수와 메서드의 집합이다. 객체를 만들어 내기 위한 설계도 혹은 틀이라 표현할 수 있다.

1.3. 객체 (Object)

소프트웨어 세계에 구현할 대상이다. 클래스에 선언된 모양 그대로 생선된 실체로, 클래스의 인스턴스 라고도 부른다. 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.

1.4. 인스턴스 (Instance)

클래스를 바탕으로 소프트웨어에 구현된 구체적인 실체이다. 즉, 객체를 소프트웨어에 실체화 하면 그것을 인스턴스라고 부른다.

  • 인스턴스는 객체에 포한된다고 볼 수 있다
  • OOP 관점에서 객체가 메모리에 할당되어 실제 사용될 때 인스턴스 라고 부른다
  • 인스턴스는 어떤 원본(추상적인 개념)으로부터 생성된 복제본 을 의미한다

 

 

2. OOP 특징

2.1. 추상화 (Abstraction)

어떤 영역에서 필요로 하는 속성이나 행동을 추출하는 작업

  • 사물들의 공통된 특징, 즉 추상적 특징 을 파악해 인식의 대상으로 삼는 행위
  • 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념(집합) 으로 다루는 수단

2.2. 캡슐화 (Encapsulation)

캡슐화는 낮은 결합도 를 유지할 수 있도록 해주는 객체지향 설계 원리이다

  • 캡슐화는 정보 은닉 을 통해 높은 응집도와 낮은 결합도를 갖도록 해준다

정보 은닉 (Information Hiding)

  • 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것
  • private 키워드

응집도 (Cohesion)

  • 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지

결합도 (Coupling)

  • 어떤 기능을 실행하는 데 다른 클래스나 모듈들에 얼마나 의존적인지

2.3. 일반화 (Generalization)

일반화는 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정이다

  • 일반화 관계는 객체지향 프로그래밍 관계에서 상속 관계 라고 한다
  • 따라서 속성이나 기능의 재사용만 강조해서 사용하는 경우가 많다

일반화는 또 다른 캡슐화

  • 일반화 관계는 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종이다
  • 즉, 자식 클래스 자체를 캡슐화 하는 것으로 확장된다
  • 서브 클래스의 캡슐화는 외부 클라이언트 가 개별적인 클래스들과 무관하게 프로그래밍을 할 수 있게 한다

2.4. 다형성 (Polymorphism)

다형성은 서로 다른 클래스의 객체가 같은 메시지 를 받았을 때, 각자의 방식 으로 동작하는 능력이다

  • 다형성이 상속과 연계되어 동작하면 매우 효과적이다
  • 다형성과 일반화 관계는 코드를 간결하게 할 뿐 아니라 변화에도 유연하게 대처할 수 있게한다
// 부모 클래스
public abstract class Pet {
  public abstract void talk();
}

// 자식 클래스
public class Cat extends Pet {
  public void talk(){ System.out.println("야옹"); }
}
public class Dog extends Pet {
  public void talk(){ System.out.println("멍멍"); }
}
public class Parrot extends Pet {
  public void talk(){ System.out.println("안녕"); }
}

 

 

3. 오버로딩과 오버라이딩

3.1. 오버로딩 (Overloading)

두 메서드가 같은 이름을 갖고 있으나, 인자의 수나 자료형이 다른 경우를 말한다

public double getArea(Circle c) { }
public double getArea(Circle c1, Circle c2) { }
public double getArea(Square s) { }

3.2. 오버라이딩 (Overriding)

상위 클래스의 메서드와 이름의 용례(signature)가 같은 함수를 하위 클래스에 재정의 하는 것을 말한다

public abstract class Shape {
  public void print() { System.out.println("Shape"); }
}

public class Circle extends Shape {
  @Override
  public void print() { System.out.println("Circle"); }
}

public class Square extends Shape {
  @Override
  public void print() { System.out.println("Square"); }
}

 

 

4. 추상클래스와 인터페이스

4.1. 추상 클래스 (Abstract Class)

abstract 키워드로 선언된 클래스를 뜻하며, 하나 이상의 추상 메소드를 가지고 있다면 반드시 추상 클래스로 선언해야한다.

abstract class Shape {
  Shape() { }
  void edit() { }
  abstract public void draw();
}

class Circle extends Shape {
  public void draw() { System.out.println("Circle"); }
}

4.2. 인터페이스 (Interface)

추상 메소드와 상수만을 포함하며, interface 키워드를 사용하여 선언한다. 상속받을 서브 클래스에게 구현할 메소드의 원형을 모두 알려주어, 클래스가 자신의 목적에 맞게 메소드를 구현하도록 한다.

  • 오직 상수 필드와 추상 메소드로 구성됨
  • 모든 메소드는 추상 메소드로서, abstract public 생략 가능
  • 상수는 public static final 이며, 생략 가능
  • 인터페이스를 상속받아 새로운 인터페이스를 만들 수 있음
interface Phone {
  int BUTTONS = 20;
  void sendCall();	// 추상 메소드
  abstract public void receiveCall();	// 추상 메소드
}

class IphoneX implements Phone {
  // Phone의 모든 추상 메소드를 구현한다
  public void sendCall() { }
  public void receiveCall() { }
  // 추가적으로 다른 메소드를 작성할 수 있다
  public void callSiri() { }
}

4.3. 추상 클래스와 인터페이스

공통점

  • 인스턴스(객체) 를 생성할 수 없다
  • 선언만 있고 구현 내용은 없다

차이점

  • 서로 다른 목적을 가지고 있다

    • 추상클래스 : 자식 클래스가 추상 메소드를 구체화하여 그 기능을 확장
    • 인터페이스 : 서로 관련이 없는 클래스에서 공통적으로 사용하지만 각각 기능을 구현할 때
  • 추상 클래스는 클래스이지만 인터페이스는 클래스가 아니다

  • 추상 클래스는 단일 상속이지만 인터페이스는 다중 상속이 가능하다

  • 추상 클래스는 is a kind of , 인터페이스는 can do this

    • 추상클래스 : Appliances - TV, Refrigerator
    • 인터페이스 : Flyalbe - Plane, Bird

 

 

 

 


참고 자료

'CS > Design Pattern' 카테고리의 다른 글

[DP] 2. 디자인 패턴 (Design Pattern)  (0) 2019.05.01