이전 포스트에서 클래스와 인스턴스의 차이를 설명할 때 객체라는 개념이,
접근제어자를 설명 할 때 캡슐화라는 개념이 등장했습니다.
이 개념들은 자바의 중요한 개념인 OOP(Object-Oriented Programming : 객체 지향 프로그래밍)의 특징들 중에 하나인데요.
이 객체 지향 프로그래밍이란 개념은 정확히 어떤 개념일까요?
객체 지향 프로그래밍(OOP)은 소프트웨어를 만드는 한 가지 방법입니다. 이 방식은 프로그램을 여러 '객체'라고 하는 부분들로 나누어 구성하고, 이 객체들이 서로 작용하면서 전체 프로그램을 만듭니다. 객체 지향 프로그래밍의 중요한 점은 우리가 실제로 보고 경험하는 것들을 프로그램 안에서 간단한 형태로 나타내는 것입니다.
재사용성: 이미 작성된 클래스를 재사용하거나 확장하여 새로운 클래스를 쉽게 만들 수 있습니다.
유지 보수성: 프로그램의 일부를 수정해야 할 경우, 해당 부분만을 수정하면 되므로 유지 보수가 용이합니다.
모듈성: 프로그램을 독립적인 모듈로 나누어 개발할 수 있어, 개발 과정이 효율적입니다.
확장성: 시스템의 요구사항이 변경될 때 추가적인 코드 작성으로 기능을 확장할 수 있습니다.
성능 부담: OOP는 추가적인 처리 과정을 거치기 때문에, 기본적인 프로그래밍 방식에 비해 더 많은 컴퓨터 자원을 소모합니다. 다형성을 적용할 때 특히, 이러한 성능 부담이 커질 수 있습니다.
이해와 관리의 어려움: 클래스 간의 상속과 다중 상속이 프로그램의 복잡성을 증가시켜, 코드를 이해하고 유지 보수하기 어려워집니다.
개발에 소요되는 시간과 노력: OOP를 사용한 소프트웨어 개발은 초기 설계와 모델링에 상당한 시간과 노력을 필요로 합니다. 이로 인해 프로젝트의 개발 속도가 느려질 수 있습니다.
재사용성의 한계: 일반화된 클래스 설계의 복잡성과 상속 구조나 클래스 간 의존성으로 인해 실제 재사용성이 제한됩니다.
추상화는 복잡한 실세계의 개념을 단순화하는 과정입니다. 클래스를 정의함으로써 필요한 속성과 동작만을 추려내어 모델링합니다.
캡슐화는 객체의 상태와 해당 데이터를 조작하는 메소드를 하나로 묶는 과정입니다. 이를 통해 객체의 구현 세부 사항을 외부로부터 숨기고, 객체에 대한 접근을 제어할 수 있습니다.
상속은 한 클래스가 다른 클래스의 속성과 메소드를 이어받을 수 있게 하는 메커니즘입니다. 이는 코드 재사용을 촉진하며, 계층적 분류를 가능하게 합니다.
다형성은 객체가 여러 형태를 가질 수 있는 특성을 의미합니다. Java에서는 메소드의 오버로딩과 오버라이딩을 통해 실현됩니다. 이 두 기법은 같은 이름의 메소드를 사용하되, 그 목적과 사용 방법에 차이를 둡니다.
다형성을 이해할 때 중요한 두 가지 개념, 오버로딩과 오버라이딩에 대해서 알아보겠습니다.
오버로딩은 같은 이름을 가진 메소드를 하나의 클래스 안에서 여러 번 정의할 수 있게 합니다. 중요한 점은, 이 메소드들이 받는 정보의 종류나 수가 서로 달라야 한다는 것입니다. 이를 통해 하나의 메소드 이름으로 여러 상황에 맞는 다양한 작업을 수행할 수 있습니다. 예를 들어, add
라는 메소드가 정수 두 개를 더하는 기능과 실수 두 개를 더하는 기능을 제공할 수 있습니다.
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
오버라이딩은 자식 클래스가 부모 클래스로부터 물려받은 메소드를 자신의 상황에 맞게 다시 작성하는 것을 의미합니다. 오버라이딩된 메소드는 부모 클래스의 메소드와 같은 이름과 매개변수를 가지지만, 내부에서 수행하는 기능은 자식 클래스에 맞게 변경됩니다. 이 과정을 통해 물려받은 메소드를 다양한 방식으로 활용할 수 있게 됩니다.
class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("Dog barks");
}
}
오버로딩과 오버라이딩은 프로그램에 다양성을 부여하는 중요한 방법입니다. 오버로딩은 하나의 메소드 이름으로 여러 기능을 수행할 수 있게 해주고, 오버라이딩은 물려받은 기능을 새로운 방식으로 사용할 수 있게 합니다. 이런 특성 덕분에 자바 프로그래밍은 더 유연하고 다양한 상황에 맞게 조정될 수 있습니다.
이전 접근제어자 포스팅에서 정보 은닉화라는 개념이 나왔습니다.
이 개념은 캡슐화와 비슷하면서도 다른 면이 있는데, 어떤 차이가 있는지 알아보겠습니다.
비슷한 점: 캡슐화와 정보 은닉 모두 객체의 구조를 간결하게 만들고, 사용하기 쉬운 인터페이스를 제공하여 객체를 보호합니다.
다른 점: 캡슐화는 데이터와 기능을 하나로 묶어 구조를 정리하는 반면, 정보 은닉은 이 묶인 데이터와 기능에 대한 접근을 제한하여 보호합니다.