6. 객체 지향 프로그래밍(Object-Oriented Programming)
객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임의 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.
기본 구성 요소
클래스(Class) - 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것으로 객체지향 프로그램의 기본적인 사용자 정의 데이터형(user define data type)이라고 할 수 있다. 클래스는 프로그래머가 아니지만 해결해야 할 문제가 속하는 영역에 종사하는 사람이라면 사용할 수 있고, 다른 클래스 또는 외부 요소와 독립적으로 디자인하여야 한다.
객체(Object) - 클래스의 인스턴스(실제로 메모리상에 할당된 것)이다. 객체는 자신 고유의 속성(attribute)을 가지며 클래스에서 정의한 행위(behavior)를 수행할 수 있다. 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다.
메서드(Method), 메시지(Message) - 클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지라 할 수 있다. 메서드는 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는 데 사용된다. 또 객체 간의 통신은 메시지를 통해 이루어진다.
장점
소프트웨어 공학의 관점에서 볼 때 S/W의 질을 향상시키기 위해 높은 응집력(Strong Cohesion)과 낮은 결합력(Weak Coupling)을 지향해야 하는데, OOP의 경우 클래스에 하나의 문제 해결을 위한 데이터를 모아 놓은 데이터형을 사용함으로써 응집력을 강화시키고, 클래스간에 독립적으로 디자인함으로써 결합력을 약하게 만들 수 있다.
특징
1. 코드의 재사용성
- 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2. 코드의 관리가 용이
- 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성 높은 프로그래밍
- 코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있다.
# 캡슐화와 데이터 은닉
우리가 캡슐로 되어진 알약을 먹을 떄, 그안에 어떤 약들이 있는지 모르면서 약을 먹듯이. 자바의 객체 내부가 어떤 형태로 구성되어 있는지 모르고 어떤 메서드를 사용하면 어떠한 결과를 얻을 수 있다는 개념으로 프로그래밍 한다. 즉, 구체적인 내용은 몰라도 원하는 결과를 얻을 수 있기에 코딩하는데 있어서 보다 수월하다. 또한 객체 외부에서 데이터를 직접 건들면 데이터가 변환될 수 있기 때문에 변환을 막기 위해 데이터 은닉 이라는 개념이 존재한다. 캡슐화와 데이터 은닉은 클래스의 접근 권한을 결정하는 접근 지정자를 사용하여 구현한다.
# 다형성과 메소드의 오버로딩
다형성은 이름이 동일한 메소드가 어떠한 자료와 사용되는지에 따라 다르게 동작하는 것을 의미한다. 자바에서는 메소드의 이름으로 전달 인자의 자료형이나 개수를 서로 다르게 주어 같은 메소드 이름으로 여러번 정의할 수 있다. 이렇게 동일한 이름의 메소드를 여러번 정의하는 것을 메소드의 오버로딩이라 한다.
# 상속성
객체지량의 가장 대표적인 특징, 특정 객체의 성격을 다른 객체가 상속받아 사용할 수 있도록 하는 것. 클래스를 설계할 때 공통적으로 필요한 성격들을 기본적인 클래스에 정의해 두면 다른 클래스를 작성할 떄 공통적인 내용은 담은 클래스에서 상속 받아 사용할 수 있다.
참조 : 위키피디아, 자바의 정석