※ 본 글은 Oracle의 java-developers-guide를 참고하였으며,
자바에 대한 개인적 공부와 정리를 위해 Oracle의 공식적인 자바 개발자를 위한 가이드를 보며
주기적으로 글을 작성하도록 해본다.
1.1.1 자바와 OOP(객체지향 프로그래밍) 용어
- 클래스
- 오브젝트
- 인터페이스
- 캡슐화
- 상속
- 다형성
1.1.1.6 캡슐화(Encapsulation)
캡슐화는 객체가 자신의 데이터와 메서드를 외부 세계로부터 숨길 수 있는 능력을 설명하며, 객체 지향 프로그래밍의 기본 원칙 중 하나이다. Java에서는 클래스가 객체의 상태를 유지하는 필드와 객체의 동작을 정의하는 메서드를 캡슐화한다.
캡슐화를 통해 재사용 가능한 프로그램을 작성할 수 있으며, 객체의 기능 중 public으로 선언된 것만 접근할 수 있도록 제한할 수 있다. 나머지 필드와 메서드는 private으로 선언되어 내부 객체 처리에만 사용할 수 있다.
1-1에서 설명된 예에서 id 필드는 private으로 선언되어 있으며, 해당 필드는 정의한 객체만 접근할 수 있다. 다른 객체들은 getId() 메서드를 통해서만 이 필드에 접근할 수 있다. 캡슐화를 사용하면 getId() 메서드를 private으로 선언하거나 정의하지 않음으로써 id 필드에 대한 접근을 거부할 수 있다.
- ex) 캡슐화
public class Employee {
private String id;
public String lastName;
public String getId() {
return id;
}
public void setId(String anId) {
this.id = id;
}
}
'id' 필드는 'private'으로 선언되어 있어 외부에서 직접 접근할 수 없다. 대신, 'getId()'와 setId(String anId)' 메서드를 통해서만 접근이 가능하다. 이를 통해 'id' 필드에 대한 무분별한 접근을 막고, 필요한 경우에만 접근할 수 있도록 제어할 수 있다.
1-1에서 보듯이, Employee 클래스의 인스턴스는 각각 고유의 상태(id와 lastName)를 가진다. 이 상태는 클래스에서 제공하는 메서드를 통해서만 접근 가능하다.
1.1.1.7 다형성(Polymorphism)
다형성은 서로 다른 객체들이 동일한 메시지에 다르게 응답할 수 있는 능력이다. 객체 지향 프로그래밍 언어에서는 동일한 이름의 메서드를 하나 이상 정의할 수 있다. 이러한 메서드들은 서로 다른 동작을 수행하고 서로 다른 값을 반환할 수 있다.
1-1의 예에서, 서로 다른 유형의 직원들이 자신의 현재까지의 보상을 응답할 수 있어야 한다고 가정한다.
보상은 직원 유형에 따라 다르게 계산된다.
- 정규직 직원은 보너스를 받을 수 있다.
- 비정규직 직원은 초과 근무 수당을 받는다.
절차적 언어에서는 다음과 같이 서로 다른 가능한 경우가 정의된 switch 문을 작성한다.
switch : (employee.type)
{
case: Employee
return employee.salaryToDate;
case: FullTimeEmployee
return employee.salaryToDate + employee.bonusToDate;
...
}
새로운 유형의 직원을 추가하면 switch 문을 업데이트해야 한다. 또한, 데이터 구조를 수정하면 이를 사용하는 모든 switch 문도 수정해야 한다. 객체 지향 언어인 Java에서는 Employee 클래스의 서브클래스 각각에 compensationToDate() 메서드를 구현할 수 있다.
예를 들어, 비정규직 직원의 compensationToDate() 메서드를 다음과 같이 구현할 수 있다.
public float compensationToDate()
{
return (super.compensationToDate() + this.overtimeToDate());
}
정규직 직원의 compensationToDate() 메서드는 다음과 같이 구현할 수 있다.
public float compensationToDate()
{
return (super.compensationToDate() + this.bonusToDate());
}
이러한 공통 메서드 이름 사용을 통해 직원의 유형을 지정하지 않고도 서로 다른 클래스의 메서드를 호출하고 필요한 결과를 얻을 수 있다. 정규직 직원과 비정규직 직원을 처리하는 특정 메서드를 작성할 필요가 없다.
또한, Employee 속성을 상속하지 않는 Contractor 클래스를 생성하고 compensationToDate() 메서드를 구현할 수 있다. 총 급여를 계산하는 프로그램은 정규직, 비정규직 직원 또는 계약직 직원 여부에 상관없이 급여에 포함된 모든 사람을 반복적으로 계산하고 각각의 compensationToDate() 메서드를 호출하여 반환된 값을 합산한다. 개별 compensationToDate() 메서드나 클래스에 안전하게 변경을 가할 수 있으며, 메서드를 호출하는 호출자는 올바르게 작동할 것이다.
'자바 기초' 카테고리의 다른 글
자바 기초 개념 - 자바 클래스 계층 구조 (0) | 2024.07.11 |
---|---|
자바 기초 개념 - 언어의 주요 특징 / JVM (0) | 2024.07.10 |
자바 기초 개념 - 상속 / 인터페이스 (0) | 2024.07.08 |
자바 기초 개념 - 객체 / 모듈 (0) | 2024.07.05 |
자바 기초 개념 - 클래스 (0) | 2024.07.04 |