객체 지향 4대 특성 : 다형성, 캡슐화
3. 다형성 : 사용 편의성
3-1. 오버라이딩(Overriding)와 오버로딩(Overloading)
🔹오버라이딩 : 상위 클래스의 메서드를 재정의 하는 것으로 같은 메서드 이름, 같은 인자를 받는다.
🔹오버로딩 : 같은 기능을 수행하는 메서드를 확장 사용하기 위한 기능으로
같은 메서드 이름, 다른 인자로 다수의 메서드를 중복해서 정의한다.
상위 클래스의 메서드를 하위 클래스 내부에 오버라이딩 하게 되면, 재정의 된 메서드가 실행된다.
이는 상위 클래스 타입의 참조 변수를 사용하더라도 하위 클래스에 재정의 된 메서드가 있다면 해당 메서드가 우선적으로 호출된다.
이러한 특성으로 형변환이나 instanceof 연산자를 사용하여 굳이 하위 클래스가 누구인지 찾아볼 필요가 없어진다.
예를 들어, 정수 타입 두 개를 더하는 메서드를 만든다면
public int add(int a, int b) {
return a + b;
}
위와 같이 만들어 볼 수 있을 것이다.
그렇다면 실수 타입과 정수 타입을 더하는 메서드를 추가하고 싶다면 어떻게 해야 할까.
public double addIntDouble(int a, double b){
return (double)(a + b);
}
만일 오버로드와 같은 기능을 지원하지 않으면 같은 기능을 수행하지만 같은 이름으로 메서드를 선언할 수 없으니,
다른 이름으로 만들게 된다.
이러한 메서드가 한 두 개가 아니라면 메서드 이름 만드는 데에도 큰 힘이 들 수 있다.
때문에 오버로드의 기능으로 같은 기능을 하는 메서드는 사용할 인자를 달리하여 활용하는 것이고,
바로 이것이 다형성의 특징적인 면이라고 할 수 있다.
4. 캡슐화 : 정보 은닉
서로 연관된 변수나 메서드 등을 하나의 클래스로 만들어 외부로부터의 접근을 막는 것이 바로 캡슐화의 가장 큰 목표이다.
클래스 내부의 중요 데이터를 외부에서 바꾸지 못하게 하고 객체로 제공되는 영역에서만 접근할 수 있도록 하는 것이다.
접근에 제한을 둠으로써 코드 확장 시 오류를 줄일 수 있고 클래스 내 정보에도 영향을 주지 않게 할 수 있다.
4-1. 접근 제어자
Java 에서는 제어자 키워드를 통해 클래스, 변수, 메서드로의 접근을 제한할 수 있으며 두 개 이상 같이 사용할 수 없다.
🔹 public : public 접근 제어자로 선언되면 클래스 멤버는 외부에 공개되며 어디에서나 직접 접근이 가능하다.
인스턴스에 private 으로 선언된 멤버가 있다면, public 를 통해 접근이 가능하다. (일종의 인터페이스 역할)
🔹default : Java 에서는 접근 제어자를 명시적으로 작성하지 않을 경우 기본적으로 default 접근 제어자를 제공하고 있다.
default 접근 제어자로 설정된 멤버는 같은 패키지 내에서는 자유롭게 접근이 가능하지만,
다른 패키지에서의 접근은 모두 불가능하다는 특징이 있다.
🔹private : private 접근 제어자로 선언되면 클래스 멤버는 외부에 공개되지 않으며, 외부에서의 직접 접근이 불가능하다.
선언된 클래스 내부에서만 접근이 가능하고, 이외의 곳에서 접근은 모두 불가능하다.
🔹protected : protected 접근 제어는 상위 클래스로의 접근을 담당한다.
같은 패키지와 하위 클래스에 한해서는 public 레벨의 접근이 허용되지만,
다른 패키지의 일반 클래스의 경우는 private 레벨이 된다.
접근 제어자 | 같은 클래스의 멤버 | 같은 패키지의 멤버 | 하위 클래스의 멤버 | 그 외 |
public | 가능 | 가능 | 가능 | 가능 |
protected | 가능 | 가능 | 가능 | 불가능 |
default | 가능 | 가능 | 불가능 | 불가능 |
private | 가능 | 불가능 | 불가능 | 불가능 |