0. 복습
접근 제한자
: 클래스, 변수, 메서드, 생성자의 접근 범위를 제한하는 키워드
1) public
2) protected
- 같은 패키지 내에서만 접근 가능
- 단, 자식 클래스는 패키지가 달라도 사용 가능
3) default
- 접근제한자를 생략하면 default
- 같은 패키지 내에서만 접근 가능
4) private
- 같은 클래스 내부에서만 접근 가능
- getter, setter를 사용하여 필드에 접근하는 것을 허용
캐스팅(Casting)
: A타입 객체를 B타입으로 변환하는 것
일반적으로 불가능하지만 두 클래스가 상속관계인 경우 가능
1) 캐스팅의 종류
(1) 업캐스팅(Upcasting)
: 자식 클래스 객체를 부모 타입으로 변환
(2) 다운캐스팅(Downcasting)
: 부모 타입 객체를 자식 타입으로 변환
이미 업캐스팅 된 객체를 다시 자신의 타입으로 되돌리는 것
2) 캐스팅 주의사항
- 자식 클래스에서 재정의한 메서드는 업캐스팅 후에도 자식 클래스의 메서드가 호출됨
- 자식 클래스에서 추가한 메서드는 업캐스팅 후 사용할 수 없음
=> 사용하고 싶다면 다시 다운 캐스팅 해야함
** 자식 객체의 타입
: 자식 객체는 부모의 타입도 동시에 갖는다(타입이 여러개)
3) 캐스팅을 사용하는 이유
- 코드의 중복 방지와 재사용성 증가
- 유지보수성 증가
1. 추상 클래스
- abstract 키워드가 붙은 클래스
- 추상 메서드가 1개 이상 있는 클래스는 반드시 추상 클래스로 선언해야 한다
(미완성된 클래스)
1) 추상 메서드
- 메서드를 선언만 하고 구현({}중괄호 영역)을 하지 않은 것을 추상 메서드라고 한다(미완성된 메서드)
- ex) abstract 리턴타입 메서드명(매개변수, ...);
- 마지막(()뒤에) 세미콜론을 작성한다
2) 추상 클래스 선언
abstract class 클래스명{
리턴타입 메서드명(매개변수, ...);
* 일반 메서드도 들어갈 수 있음
}
- abstract 키워드 작성
- 객체를 만들 수 없다 => 미완성된 클래스이므로
** 미완성된 메서드(추상 메서드)는 상속 받는 자식 클래스에서 반드시 재정의하여 구현을 해야만 해당 자식 클래스로 객체화할 수 있다
그러므로 [강제성]을 부여하기 위해서 추상 메서드로 선언한다
3) 추상 클래스를 사용하는 이유
: 공통되는 속성과 행위를 추상화하여 부모 클래스를 만드는데
모든 자식 클래스에서 구현해야하는 메서드가 있다면 추상 메서드로 선언하는 것이 좋다
- 추상 클래스를 상속 받는 자식 클래스는 추상 메서드를 오버라이딩하지 않으면 오류가 발생하므로 [강제성]이 생기게 된다
- 만약 부모 클래스에서 메서드를 구현한다면 강제성이 없으므로 자식 클래스를 만드는 개발자가 재정의하지 않고 그냥 넘어갈 수 있다
2. 인터페이스(Interface)
- 클래스처럼 타입으로 사용가능한 것
- 기본적으로 상수와 추상 메서드로만 멤버로 선언할 수 있다
** 상수: 값을 한번만 저장할 수 있는 저장공간
- 즉, 인터페이스가 가지는 모든 메서드는 추상 메서드
=> 객체화 불가능
1) 인터페이스 문법
- 접근제어자 interface 인터페이스명 {}
ex) public interface MyInter{}
2) 문법 특징
- 모든 필드는 public static final 이 붙는다
- 모든 메서드는 public abstract가 붙는다
- 인터페이스는 extends 로 상속하는 것이 아니라 implements(구현)한다.
3) 인터페이스의 특징
- 인터페이스는 다중 구현이 가능하다
- 인터페이스끼리는 extends(상속)이 가능하다
- 클래스 상속과 인터페이스 구현은 별개이다
(하나의 클래스에 extends와 implements 가 동시에 가능)
4) 인터페이스 사용 이유
(1) 추상화와 다형성 구현
- 공통되는 기능을 하나의 인터페이스로 정의할 수 있다(추상화)
- 참조변수의 다형성(캐스팅)을 활용하면 여러 타입 객체를 하나의 상위 타입 변수로 편하게 다룰 수 있다
이를 통해 코드의 재사용성이 높아지고, 새로운 클래스 추가 시 기존 코드 변경을 최소화할 수 있다
(2) 메서드 표준화
- 메서드 선언부가 곧 메서드의 사용방법이다
- 공통되는 기능을 하나의 인터페이스로 추상화하게 되면 해당 인터페이스를 구현하는 여러 클래스들은 모두 같은 방식으로 기능을 제공하게 된다
- 메서드 표준화는 개발자간의 협업에서 매우 중요하다
(3) 다중 구현 지원
- 자바의 상속은 단일 상속만 지원한다
단일 상속을 모호성을 방지하기 위한 좋은 수단이지만 프로그램의 규모가 커지면 단일 상속이 아쉬운 경우가 많다
(하나의 클래스에서 할 수 있는 역할에 제한이 걸려 유연성이 떨어짐)
=> 이를 인터페이스의 다중 구현으로 대체한다