객체 지향의 특징 <추상화, 캡슐화, 다형성, 상속>

heeo·2023년 6월 27일

Java

목록 보기
1/4

추상화

프로그래밍은 현실의 문제를 해결하기 위한 것이다.
그러나 현실은 복잡하고 이 모든 걸 코드로 표현할 수 없다.
그래서 해결해야 할 문제에 필요한 내용(공통적인 것과 본질)만 남기고 걷어내는 과정을 추상화 한다고 한다.
현실의 모든 것은 객체라고 볼 수 있는데 객체 간의 공통적인 속성이나 행동들을 묶어서 이름을 붙인다.

예를 들어, 사자, 토끼, 강아지라는 객체가 존재할 때 이 객체들을 하나로 묶으면 동물 또는 생물이라는 추상적인 객체로 정의할 수 있다.

또 다른 예를 들면, 지하철 노선도는 서울의 지리를 추상화시켜서 보여준다.


캡슐화

캡술화는 외부에서 알 필요가 없는 부분을 감춤으로써 대상을 단순화하는 추상화의 한 종류이다.
객체의 속성과 행위를 캡슐처럼 하나로 묶어 실제 구현 내용을 외부로부터 은닉하고 보호한다. 외부와의 상호 작용을 위해 필요한 부분만 공개하고 나머지는 직접적인 접근을 막는다.
캡슐화가 중요한 이유는 불안정한 부분(구형)과 안정적인 부분(퍼블릭 인터페이스)을 분리하여 변경의 영향을 통제할 수 있기 때문이다,
자바에서는 이러한 캡슐 기능이 클래스를 통해 구현되며, 외부 접근이 허락된 멤버 변수와 메소드를 통해서만 다른 객체와 상호 작용할 수 있게 한다.

캡슐화의 장점은 다음과 같다.

  1. 사용하기 쉽게 한다.
    구현을 감추고 꼭 필요한 인터페이스만 사용자에게 보여줌으로써 사용을 쉽게 해준다.
    클래스에 쓸데없는 메서드들이 많고, 멤버 변수들까지 public으로 접근하게 하면 케이스 없는 컴퓨터를 설계하는 것과 같다.
  2. 객체 간의 결합을 약하게 함으로써 유지 보수 비용을 줄인다.
    만약 컴퓨터 본체와 모니터가 수많은 선으로 연결됐다면 모니터 교체 시 많은 시간과 노력이 필요할 것이다. 하지만 실제론 하나의 케이블로 연결 돼있다. 그러니 모니터가 고장 났다면 케이블 하나만 뽑아서 새로운 모니터에 꽂으면 되는 것이다. 이것이 바로 유지보수가 적다는 것이다.

다형성

다형성은 하나의 객체나 메소드가 여러 가지의 얼굴을 갖게 하는 것이다.
인터페이스 또는 클래스에서 정의된 메소드를 구현 클래스(또는 자식 클래스)에서 재정의(오버라이딩)되어 사용하는 것을 의미한다.

예를 들면 RealCal 클래스는 인터페이스 Printable 과 Carculable 을 구현하고 있다.

interface Printable {
    void print();
}
interface Carculable {
    double PI = 3.14;
}
class RealCal implements Printable, Carculable {
    public int sum(int v1, int v2) {
        return v1+v2;
    }
}

b는 Printable로써 동작해서 Carculable에 있는 PI는 못 쓰고,
c는 Carculable로써 동작해서 Printable에 있는 print()는 못 쓴다.

RealCal a = new RealCal();
a.print();
System.out.println(a.PI);
System.out.println(a.sum(2,1));

Printable b = new RealCal();
b.print();
System.out.println(b.PI);
// System.out.println(b.sum(2,1));

Carculable c = new RealCal();
// c.print();
System.out.println(c.PI);
System.out.println(c.sum(2,1));

그래서 필요한 기능만 골라서 구현할 수 있다.
다형성이란 하나의 클래스가 데이터 타입(여기선 인터페이스)을 무엇으로 하느냐에 따라 다양한 얼굴을 갖는 것이다.


상속성

한 클래스가 또 다른 클래스의 필드 멤버와 메소드를 사용할 수 있게 하는 것이다.

상속을 준 클래스는 부모 클래스, 받은 클래스는 자식 클래스라고 부른다.
하나의 부모 클래스가 여러 자식 클래스를 가지는 것은 가능하지만 하나의 자식 클래스가 여러 부모 클래스를 상속받을 수는 없다.
자식 클래스는 부모 클래스의 필드 멤버와 메소드를 재사용할 수 있거나 새로운 필드 멤버와 메소드를 추가할 수 있다.

상속을 통해서 비효율적인 코드 중복을 피할 수 있으며, 유지 보수의 편리성을 얻을 수 있다.

profile
Hello, World!

0개의 댓글