[Java] 객체 지향 프로그래밍(OOP)
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍의 패러다임 중 하나로써 만들고자 하는 현실을 추상화하여 독립된 상태와 행위를 가지는 객체를 만들고 각 객체가 상호 작용할 수 있도록 개발하는 것이다.
객체 지향 프로그래밍은 독립적인 여러 객체를 가지고 개발하는 것이기 때문에 코드의 재사용이 쉽고 모듈화하기 용이하기 때문에 기존에 만들어 둔 코드나 오픈 소스 등을 활용하기 좋고 더 좋은 코드를 찾으면 대체하는 것 또한 쉽기에 대규모 프로젝트를 만드는 데 사용하기 좋고 유지 보수하는 데도 좋다.
다만 추상화하는 과정이 어렵고 추상화하는 과정 중에 문제가 있으면 구현할 때 어려움이 발생할 가능성이 높다.
객체 지향 프로그래밍의 기본 구성 요소와 특징은 아래와 같다.
기본 구성 요소
클래스(Class) - 객체를 생성하기 위해 객체의 상태와 행위를 정의해 둔 사용자 정의 데이터형이다. 간단하게 설명하자면 객체를 만들기 위한 설계 도면이다.
객체(Object) - 클래스를 통해 만들어진 인스턴스로써 자신만의 고유한 상태를 가지며 클래스에서 정의한 행위(Method)를 수행하며 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다.
메서드(Method) - 객체의 동작을 설명하고 클래스 내부에 정의되는 함수이다.
상태(Attribute) - 클래스에 정의되며 객체의 상태를 나타낸다.
객체 지향 프로그래밍의 특징
추상화(Abstraction)
객체와 객체 간의 공통적인 속성과 기능을 추출하여 정의하는 것을 의미한다. 이렇게 추상화했을 때 객체의 정의와 구현을 분리할 수 있기 때문에 코드를 변경할 때 유연하게 변경할 수 있다는 장점이 있다.
상속(Inheritance)
하나의 클래스가 다른 클래스의 상태와 행위를 재사용하기 위한 것으로 상속받는 클래스를 하위 클래스, 자식 클래스 등으로 부르며 상속되는 클래스를 상위 클래스, 부모 클래스 등으로 부른다. 이러한 상속을 통해 클래스 간의 종속 관계를 만들어 클래스를 조직화하여 공통의 논리를 만들 수 있어 정확하게 데이터를 분석하고 개발 시간을 단축할 수 있게 한다.
* 다중 상속
하나의 클래스가 두 개 이상의 클래스를 상속받는 것으로 다이아몬드 상속 문제 등이 있어 Java에서는 지원하지 않는다. 다만 interface를 통해서 유사한 기능을 구현할 수 있다.
다형성(Polymorphism)
하나의 객체가 여러 개념을 갖는 것으로 둘 이상의 다양한 타입을 받을 수 있도록 한다. 이러한 다형성으로 인해 부모 클래스 타입의 변수는 자식 클래스 타입의 인스턴스를 참조할 수 있다. 그리고 다형성이기에 오버라이딩과 오버로딩을 사용할 수 있다.
캡슐화(Encapsulation)
모든 정보가 외부로 노출되지 않고 선택된 정보만 노출하는 것이다. 이렇게 노출하지 않음으로써 보안을 강화하고 의도하지 않은 데이터 손상을 방지할 수 있다.
객체 지향 언어로는 Java, C++, C#, Python, 등이 있고 모든 언어는 동일하게 만들어지지 않았고 이 페이지는 자바를 기반으로 이해한 객체 지향 프로그래밍에 대하여 설명했기 때문에 다른 언어에는 맞지 않는 부분이 있을 수 있다.