OOP (Object-Oriented Programming)이란 객체 지향적인 프로그래밍 입니다. 즉, C언어같은 절차 지향적인 프로그래밍이 아닌 객체의 관점에서 프로그래밍을 한다는 것 입니다.
OOP는 작은 문제들을 해결할 수 있는 객체들을 만든 뒤 이 객체들을 조합해서 큰 문제를 해결하는 Bottom-up(상향식) 해결법을 도입한 것입니다. 객체가 다른 객체와의 의존성이 없이 독립성이 보장되게 만들면 재사용성도 높아지므로 개발기간과 비용 또한 줄게 됩니다.
이러한 OOP의 특징으로는 캡슐화 (Encapsulation) 추상화 (Abstraction) 다형성(Polymorphism) 상속성 (Inheritance) 이 있습니다. 차례대로 알아보도록 하겠습니다.
1. 캡슐화의 목적 : 기능 분리
캡슐화란 하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메서드를 하나로 묶는 것을 의미합니다. 따라서 클래스에서 만들어진 객체가 특정한 목적을 수행할 수 있도록 사용해야할 변수와 메서드를 관련성 있게 구성해야 합니다.
2. 캡슐화의 목적 : 정보은닉(은닉화)
캡슐화를 하는 또 다른 목적은 바로 정보은닉 입니다. 리모컨 기능을 가지고 있는 리모컨이라는 클래스에서 버튼의 정보가 public으로 선언되어 있다면, 누구든 버튼의 정보를 변경할 수 있습니다. 그렇기 때문에 private로 해서 데이터를 보호해서 접근을 제한해야 합니다. 이렇게 보호된 변수는 getter나 setter 등의 메서드와 같은 외부 인터페이스를 두고 이를 통해서만 간접적으로 접근이 가능하도록 합니다.
행위나 상태를 캡슐화 합니다. 외부에 노출할 상태, 행위와 내부에 감춰둘 상태 행위를 구분해서 감춥니다.
ex) TV 리모컨 : TV를 조작하기 위한 기능을 묶음.
외부 기능 : 리모컨의 인터페이스에 해당하는 볼륨 up/down , 전원 , 채널 변경 버튼 등
내부 기능 : 리모컨 내부의 전기 신호 작동원리, 내부에서 작동하는 데이터 값
3. 캡슐화의 예제
TV 리모컨이라는 객체가 있다고 가정해보면, 외부의 클라이언트로는 사용자가 있습니다. 사용자는 TV 리모컨의 인터페이스에 해당하는 볼륨 up/down, 전원, 채널 변경 버튼 등을 통해 TV를 조작할 수 있습니다. 그러나 볼륨 up/down 버튼을 눌렀을 때 어떤 과정을 통해서 볼륨이 올라가고 내려가는지는 TV 리모컨 객체 내부에서 처리됩니다. 이렇게 TV 리모컨 객체의 내부 데이터나 상태가 외부에 직접적으로 노출되지 않으며, 외부에서는 TV 리모컨 객체의 인터페이스를 통해 간접적으로 TV를 조작할 수 있게 됩니다.
1. 추상화는 각각의 사물의 특성을 일반화하고 세부사항을 제거해서 단순화 시키는 과정입니다. 즉, 공통적인 요소나 특징을 추출하는 과정이 추상화라고 할 수 있습니다. 이렇게 추상적으로 추출된 특징들을 클래스로 만들게 되면, 그것이 추상클래스가 됩니다.
2. 추상화의 예
이를 통해서 다리가 4개 있고, 목이 있고 움직이고 숨을 쉬는 동물로 추상화를 할 수있고 이러한 동물을 SuperType이라 하고, 그 아래 기린과 강아지는 SubType이 됩니다.
다형성은 상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해줍니다. 즉, 다형성은 형태가 같은데 다른 기능을 하는 것을 의미 합니다. 이를 통해 코드의 재사용, 코드 길이 감소가 되어 유지보수가 용이하도록 도와줍니다.
1. 오버라이딩, 오버로딩
자세한 글 : 오버로딩-오버라이딩Overloading-Overriding
2. 하나의 참조변수로 여러 타입의 객체를 참조
예제
- 상속이란 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념입니다.
- 기존 클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 줍니다.
https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)
https://ko.wikipedia.org/wiki/%EC%BA%A1%EC%8A%90%ED%99%94
https://ko.wikipedia.org/wiki/%EC%B6%94%EC%83%81%ED%99%94_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)