객체 지향 설계 - 이론
객체 지향 설계(OOP)
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 객체들의 상호작용(메시지 주고받기, 데이터 처리 등)으로 프로그램 로직을 구성하는 포로그래밍 패러다임
객체
대상을 나타내는 단어
현실의 모든 것을 객체라고 간주할 수 있습니다.
클래스
사람들은 일반적으로 같은 속성들을 갖고 있는데, 여기서 속성이란 눈, 코, 입, 손, 발, 등의 신체들을 의미한다고 하면,
사람같은 객체들이 공통적으로 갖는 속성들을 모아서 정의내린 것을 클래스라고 합니다.
ex) 객체: 붕어빵, 클래스: 붕어빵 틀
OOP 4가지 특징
1. 캡슐화(Encapsulation)
캡슐화란 하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메소드를 하나로 묶는 것을 의미합니다.
따라서 클래스를 우리가 만들 때 이후에 이 클래스에서 만들어진 객체가 특정한 목적을 가지고 사용해야할 변수와 그 변수를 가지고 특정한 메서드를 관련성 있게 클래스에 구성해야한다.
예를 들자면, 은행이라는 클래스는 잔고라는 변수가 있고 그 잔고를 조회하거나, 잔고를 수정할 수 있는 메서드등이 있다고 치는 것입니다.
근데 캡슐화를 하는 중요한 목적은 바로 정보의 은닉화입니다.
잔고라는 변수가 만약 public 으로 선언되어있다고 치면, 200만원인 나의 잔고가 누군가 접근에 의해 0원이 될수도 있는 것입니다.
따라서 잔고라는 변수를 바로 접근할 수 없도록 private로 선언하고 데이터를 보호하는 것입니다.
이렇게 보호된 변수는 getter나 setter등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것이 바로 캡슐화의 중요한 목적입니다.
2. 추상화(Abstraction)
추상적으로 생각해 일단 큰 틀의 클래스를 구현하고 거기에 최소 이러한 공통적인 요소나 필수적인 요소를 추출하여 만든 것이 추상클래스입니다.
예를 들자면, 벤츠,아우디,소나타,티코,밴틀리 등등 우리가 생각하는 여러종류의 자동차이 있다. 이것을 다 클래스화하고 변수와 메서드 등을 개별적으로 만드는 것은 무모한 짓입니다.
따라서 방금 나열한 자동차들의 공통적인 요소나 특징을 추출하는 과정인 추상화를 거쳐 요소를 끄집어 내면, 바퀴,배기통,핸들,차문,유리창,등 필수적인 부품이 있고 바퀴는 굴러가야하며, 핸들은 좌우로 돌아가야하고 차문은 열려야한다는 공통적인 행동 즉 어떤 차든 필수적으로 필요한 메서드가 추출됩니다.
3. 다형성(Polymorphism)
다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해준다. 이를 통해 코드의 재사용, 코드길이 감소가 되어 유지보수가 용이하도록 도와주는 개념입니다.
쉽게 같은 동작이지만 다른결과물을 나올때 이를 다형성이라고 생각하면 됩니다.
크게 자바프로그래밍 객체지향에서 다형성의 개념을 녹여내는 방법은 두가지인데, 바로 오버라이딩(Overriding) 과 오버로딩(Overloading) 입니다.
- 오버라이딩: 부모클래스에서 상속받은 서브클래스 즉 자식클래스에서 부모클래스,즉 상위클래스에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는 것을 말합니다.
- 오버로딩: 하나의 클래스 안에서 같은이름의 메서드를 사용하지만 각 메서드마다 다른 용도로 사용되며 그 결과물도 다르게 구현할 수 있게 만드는 개념인데 오버로딩이 가능하려면 메서드끼리 이름은 같지만 매개변수의 갯수나 데이터타입이 다르면 오버로딩이 적용되어 메서드 이름이 같아도 문법 에러가 나지않습니다.
4. 상속성(Inheritance)
상속이란 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념입니다.
기존클래스에 기능을 가져와 재사용할 수있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 준다.
자바에선 단일 상속 밖에 안되지만, 인터페이스를 다중 상속 할 수 있게 해서 임시적인 다중 상속이 가능합니다.
하지만 인터페이스의 존재 이유가 다중 상속을 지원하기 위함이 아닙니다.