Language/Java

객체지향 프로그래밍

SambaLim 2019. 5. 24. 23:28

**Java, C++**등 객체지향 언어들을 사용하여 프로그래밍을 하면서 부끄럽게도 객체지향이 무엇인지에 대해 생각해본적이 없었다.

객체지향의 기본 구성 요소와 특징, 객체지향 개발 5원칙을 바탕으로 이해해보려 한다.

기본 구성 요소

클래스

객체지향 프로그램의 기본적인 사용자 정의 데이터형으로 클래스는 연관되어있는 변수와 메소드의 집합이다.

객체

클래스가 실제 메모리상에 할당된 것(인스턴스)이다.

객체는 자신의 고유 속성을 가지며 클래스에서 정의한 행위를 할 수 있다.

메소드&메시지

메소드는 한 객체에서 객체의 속성을 조작하는데 사용된다.

메시지는 객체간의 통신을 가능하게하는 도구이다.

특징

추상화

객체들의 공통적인 속성이나 행동을 추출하는 것을 추상화라고 한다.

객체지향 프로그래밍은 객체의 구체적인 개념에 의존하지 않고 추상적인 개념에 의존한다.

캡슐화

정보 은닉(information hiding)을 통해 높은 응집도(Cohesion)와 낮은 결합도(Coupling)을 유지할 수 있도록 하는 것을 캡슐화라고 한다.

  • 정보 은닉(information hiding) : 외부에서 필요없는 정보는 접근하지 못하게 한다. (private)

  • 응집도(Cohesion) : 클래스내의 요소들의 밀접한 정도

  • 결합도(Coupling) : 한 클래스의 기능을 실행하는데 다른 클래스에 얼마나 의존적인지

상속성

상위 클래스의 특징을 하위 클래스가 갖는 것을 상속성이라 한다.

한 클래스의 속성이나 행동을 다른 클래스에게 넘겨주고자 할 때 사용한다.

다형성

하나의 클래스 내부에 같은 이름의 행동을 두 개이상 정의하거나 상위 클래스의 행동을 하위 클래스에서 재정의하여 사용할 수 있는 객체지향의 특징을 다형성이라 한다.

앞서 이야기에서 전자를 오버로딩, 후자를 오버라이딩이라 한다.

객체지향 개발 5원칙 (SOLID)

객체지향의 기본 구성 요소와 특징을 가지고 개발을 할 때, 기본 컨셉과 같이 유연하고, 확장이 용이하며 유지보수하기 쉬운 프로그램을 만들고 싶은 것은 객체지향 프로그래밍을 하는 모든 개발자의 바람이라 생각합니다.

이러한 개발자의 바람들을 지키기 위한 **객체지향 개발 5원칙(SOLID)**을 알아보려합니다.

Single Responsibility Principle (단일 책임 원칙)

말 그대로 모든 클래스는 단 하나의 책임을 갖는다는 원칙입니다. 한 클래스는 자신의 책임을 다하는데 집중해야 합니다.

책임의 영역이 확실해진다면 다른 책임들로부터의 연쇄작용에 자유로워질 수 있습니다.

Open Close Principle (개방 폐쇄의 원칙)

클래스, 함수등의 소프트웨어 구성요소는 확장에는 열려있고, 수정에 대해서는 폐쇄돼야 한다는 원칙입니다.

요구사항의 변경이나 추가사항이 발생하더라도 기존 구성요소는 최대한 적게 수정하고 이를 확장하여 재사용할 수 있어야 합니다.

변경될 것과 변하지 않을 것을 확실히 구분해야 합니다.

Liskov Substitution Principle (리스코프 치환 법칙)

자식 클래스는 언제나 부모 클래스를 변경할 수 있어야 합니다.

부모클래스 자리에 자식 클래스를 넣어도 잘 작동할 수 있어야합니다. (업캐스팅)

Interface Segregation Principle (인터페이스 분리 원칙)

클래스에서 자신이 사용하지 않는 인터페이스는 구현하지 말아야합니다.

통합된 하나의 인터페이스를 설계하기보다는 여러개의 구체적인 인터페이스를 설계해야 합니다.

Dependency Inversion Principle (의존성 역전 법칙)

하위 클래스로 인하여 상위 클래스를 변경하는 일이 일어나서는 안됩니다.

의존성 역전 법칙은 컴포넌트간의 커뮤니케이션 관계를 단순화하도록 도와줍니다.

참고자료