강의를 들으며 내가 알고 있는 내용을 점검하고,
새로 배운 내용을 정리하며,
궁금한 내용을 알아가며 학습해나가는 것을 목표로 합니다.
자바는 객체지향 언어입니다.
하지만 객체지향적으로 프로그래밍 하지 않으면 객체지향이라고 할 수 없습니다.
그렇다면 객체지향 프로그래밍이란 무엇 일까요?
프로그램을 객체로 구성하는 것,
즉 프로그램이 명령어의 모임이 아닌 여러 개의 독립된 단위인 “객체"들의 모임으로 하고자 하는 것입니다.
프로그램의 규모가 커지면서 어떻게 규모가 큰 프로그램을 만들 것인가? 라는 문제가 생겼습니다.
객체 지향 프로그래밍은 이 문제에 대한 해결책중의 하나로 대두 되었습니다.
“작게 나눠서 만들고 그 후 합치자 “ 는 큰 틀에서의 객체지향 프로그래밍은
프로그램의 여러 동작을 각각의 객체가 작은 기능 별로 나눠서 수행하며 이러한 객체와 객체는 서로 협력 관계입니다.
즉, 분야별로 일을 잘게 쪼개 객체에게 위임하고, 서로 협력하게 만드는 것이 객체지향 프로그래밍이라고 할 수 있습니다.
그런데 이런 객체들의 역할과 기능을 나누려면 서로 구분할 필요가 있습니다.
이를 Java 에서는 type 으로 구분하며 type은 만들기 위해서 자바에서는 Class를 사용합니다.
import java.lang.*;
//class
class MyObj extends Object implements Runnable {
//속성
private int a = 0;
//행위
public void run() {
a += 1;
}
}
//인스턴스화
MyObj obj = new Object();
객체지향을 이해하기 위해서는,
개념적인 용어로서의 객체와 자바의 기술적인 용어인 class, instance의 차이를 이해해야합니다.
캡슐화의 특징입니다.
접근 지정자 | 접근 범위 | 동일 클래스 | 동일 패키지 | 다른 패키지의 자식 클래스 | 다른 패키지 |
---|---|---|---|---|---|
public | 제한 없음 | O | O | O | O |
protected | 동일 패키지와 상속받은 클래스 내 | O | O | O | |
default | 동일 패키지 내에서만 | O | O | ||
private | 동일 클래스 내에서만 | O |
상속의 특징입니다.
상속은 새로운 클래스가 기존의 클래스의 속성과 행위를 이용할 수 있게 하는 기능입니다.
공통된 기능을 여러 객체에게 전달하고 싶을 때 사용하는 경우가 많습니다.
그러나 상속은 “추상화"와 “구체화"의 관계에서만 쓰여야합니다.
추상화란 자료형을 구체적으로 정의하는 것입니다.
객체간의 관계에서는 상위 클래스가 하위 클래스보다 추상적여야 한다는 특징이 있습니다.
자바에서는 추상 클래스와 인터페이스는 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상 메소드를 구현하도록 강제합니다.
abstract class
interface
다형성이란 하나의 객체가 다양한 타입을 가지고 있을 수 있음을 의미합니다.
자바에서는 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 합니다.
class Login { ... }
class PortalLogin extends Login { ... }
...
Login login = new Login(); // 허용
PortalLogin pLogin = new PortalLogin(); // 허용
Login login = new Login(); // 허용
PortalLogin pLogin = new Login(); // 오류 발생.
다형성을 통하여 객체 간의 관계를 조직적으로 나타낼 수 있습니다.
instanceof 연산자를 통하여 참조 변수가 실제로 참조하고 있는 인스턴스의 타입을 확인할 수 있습니다.
그렇다면 어떻게 해야 객체지향을 잘 할 수 있을까요?
일단 객체지향적 프로그래밍을 하기 위해서는 다음 두 가지를 고려해야합니다.
이러한 두 가지를 고려하고 객체지향을 다른 사람에게 잘 설명하기 위해서는 설계가 필요합니다.
UML은 객체지향 프로그래밍 설계를 표현하기 위한 언어입니다.
SOLID는 Robert Martin이 소개한 객체 지향 프로그래밍의 다섯 가지 기본 원칙입니다.
Single responsibility principle(단일책임의 원칙)
한 클래스는 하나의 책임만을 가져야한다.
Open / closed principle
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
Liskov substitution principle
객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
Interface segregation principle
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
Dependency inversion principle
프로그래머는 “추상화에 의존해야하며 구체화에 의존하면 안된다.” 의존성 주입은 이 원칙을 따르는 방법 중 하나이다.
이러한 원칙을 따르며 지키며 설계하는 것이 객체지향 프로그래밍을 잘 할 수 있는 기초가 될 것입니다.