1. 객체 지향 프로그래밍 ( Object Oriented Programing )
1) 객체
객체란 말 그대로 대상을 나타내는 단어.
예를 들어, 사람 개인 한 명 한 명을 모두 객체라 할 수 있고, 책 한 권 한 권을 객체라 할 수 있습니다.
사람은 생김새와 성격이 똑같을 수는 없기 때문에 개개인을 객체라 할 수 있으며,
책도 내용이 같을지라도 한 권의 책에 흠집을 낸다고 해서 모든 책들이 전부 흠집이 나는 것이 아니기 때문에 한 권 한 권을 객체라 할 수 있습니다.
2) 클래스
사람들은 일반적으로 같은 속성들을 갖고 있다.
여기서 속성이란 눈, 코, 입, 손, 발, 등의 신체들을 의미한다.
책도 책 이름, 작가, 출판사, 출판일 등 같은 속성을 갖고 있다고 할 수 있다.
사람, 책 같은 객체들이 공통적으로 갖는 속성들을 모아서 정의 내린 것을 클래스라고 한다. -이를 추상화라고 하는데 뒤에서 살펴보자.-
즉 사람이라는 클래스는 눈, 코, 입 등의 속성이 존재하고 객체들은 눈, 코, 입의 생김새가 다르기 때문에 다른 객체로 분류된다.
3) 객체 지향 프로그래밍 ( OOP )
OOP는 객체의 관점에서 프로그래밍 하는 것을 의미한다.
C언어를 절차 지향 프로그래밍이라 하는데, 절차 지향 프로그래밍은 프로세스가 함수 단위로 순서대로 진행되는 것을 말한다.
반면 OOP는 객체들의 유기적인 관계를 통해서 프로세스가 진행된다.
즉, 애플리케이션을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍 하는 것을 말한다.
2. OOP의 특징
1) 추상화
추상화는 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념.
객체들은 실제하지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다.
다시 말하면, 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라 할 수 있다.
2) 캡슐화
캡슐화란 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것을 말한다.
캡슐화를 하는 이유는 다음 두가지 이유가 있는데
- 데이터 보호(data protection) – 외부로부터 클래스에 정의된 속성과 기능들을 보호
- 데이터 은닉(data hiding) – 내부의 동작을 감추고 외부에는 필요한 부분만 노출
외부로부터 클래스에 정의된 속성과 기능들을 보호하고, 필요한부분만 외부로 노출될 수 있도록 하여 각 객체 고유의 독립성과 책임 영역을 안전하게 지키고자 하는 목적이 있습니다.
캡슐화를 하기 위해서는
객체간의 결합도를 낮추고 접근제한지시자를 이용한다.
3) 상속
Java에서 상속이란 기존 클래스를 재사용해 새로운 클래스를 만드는 것이다.
앞서 봤던 추상화의 연장으로 클래스간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화 시켜 해당 상위클래스로부터 확장된 하위클래스에서 사용할 수 있도록 한다.
상속이 필요한 이유는 코드의 중복을 없애기 위함이다.
중복이 많아지면 개발 단계에서도 피곤하지만, 유지 보수에서도 많은 비용이 들기 때문에 -코드의 이원화 문제- 개발시 코드의 중복을 피해야 한다.
OOP에서는 상속을 통해 코드의 중복 문제를 일부 해결할 수 있다.
상위 클래스에 여러 속성들을 정의해 놓고 상위클래스에 해당하는 하위클래스, 예를 들면 강아지 클래스가 필요할 경우 포유류 클래스와 상속 관계를 맺는 등, 상속관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없습니다.
이것이 상속이 필요한 이유이다.
4) 다형성(多形性)
어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미한다.
비유적으로 표현하자면, 어떤 중년의 남성이 있다고 했을 때 그 남자의 역할이 아내에게는 남편, 자식에게는 아버지, 부모님에게는 자식, 회사에서는 회사원, 동아리에서 총무 등 상황과 환경에 따라서 달라지는 것과 비슷하다고 할 수 있다.
객체 지향에서의 다형성도 이와 비슷하다. 즉, 어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할수 있는 객체 지향의 특성을 의미한다. 대표적인 예로 메서드 오버라이딩과 메서드 오버로딩(method overloading)이 있다.
객체 지향 프로그래밍은 객체 간 관계와 협력을 설계하는 것인데, 다형성은 그 관계를 보다 유연하고 확장이 용이한 설계가 가능하도록 하는데 핵심적인 역할을 한다는 사실이 중요하다. 또한, 다형성을 제대로 활용하기 위해선 추상화와 상속에 대한 내용들이 함께 존재해야 한다. 즉, 추상화가 있어야 각 객체들의 역할 정의가 가능하고, 인터페이스는 상위 클래스-하위 클래스를 전제하기 때문에 상속에서 배웠던 개념들이 함께 필요하다.
3. 정리
추상화, 캡슐화, 상속, 다형성
결국에 OOP를 한다는 것은 어떻게 하면 유지보수를 잘할 수 있을까의 관점이지 않을까.
'Backand > Java' 카테고리의 다른 글
[JWT] JSON Web Token과 보안에 관하여 (0) | 2023.06.29 |
---|