상속
상속의 개념
현실에서 상속이란 부모가 자식에게 물려주는 행위이다. 하지만 자바에서 상속이란 부모 클래스에서 정의된 필드와 메소드를 자식 클래스가 물려받는 것이다.
- 공통의 특징을 가진 클래스 사이의 멤버(필드, 메소드) 선언이 불필요하다.
- 부모 클래스의 멤버(필드, 메소드)를 재사용함으로써 자식 클래스가 간결해진다.
- 클래스간 계층적 분류 및 관리가 쉬워진다.
상속의 특징
상속은 이미 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 코드의 중복을 줄여준다. 상속을 해도 부모 클래스의 모든 필드와 메소드를 물려받는 것은 아닌데, 부모클래스에서 PRIVATE 접근 제한자를 갖는 필드와 메서드는 상속에서 제외된다.
자바에서 부모 클래스를 super class라 하고 자식 클래스를 sub class라 한다. 자바 상속의 특징으로는 3가지 정도가 있다.
- 자바에서는 다중상속을 지원하지 않는다. 따라서 extends 뒤에는 단 하나의 부모 클래스만 올 수 있다.
- 자바에서는 상속의 횟수에 제한을 두지 않는다.
- 자바에서 최상위 클래스는 Object클래스이다. Object 클래스만이 유일하게 super class를 가지지 않으며 자바의 모든 클래스들은 Object 클래스의 자손이라고 볼 수 있다.
public class Parent{
//부모클래스
....
}
public class Child extends Parent{
// Parent를 상속받는 클래스 Child선언
....
}
상속과 접근 지정자
접근 지정자에는 public, pirvate, default, protected가 있다.
- public : 모든 클래스에서 접근 가능하다.
- priavte : 자신 클래스에서만 접근 가능하다.
- default : 같은 패키지의 클래스에서만 접근 가능하다.
- protected : 같은 패키지 혹은 다른 패키지라도 상속받은 클래스에서 접근 가능하다.
자동 타입 변환 (Promotion)
자동 타입 변환은 프로그램 실행 도중에 자동적으로 타입변환이 일어나는 것을 뜻한다. 자동 타입 변환은 다음과 같은 조건에서 일어난다.
부모클래스 변수 = 자식클래스타입; // 자동 타입 변환
자동 타입 변환의 개념은 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것이다.
강제 타입 변환 (Casting)
강제 타입 변환은 부모타입을 자식으로 변환하는 것을 말한다. 그렇다고 모든 부모타입을 자식 클래스 타입으로 변환 가능한 것은 아닌데, 자식타입이 부모 타입으로 자동 변환 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.
자식클래스 변수 = ( 자식클래스 ) 부모클래스타입;
// 🔼 자식 타입이 부모타입으로 변환된 상태
자식 타입이 부모 타입으로 자동 변환하면, 부모 타입에 선언된 필드와 메서드마 사용가능하다는 제약사항이 따른다. 먼저 자식타입에 선언된 필드와 메서드를 꼭 사용해야 한다면 강제 타입 변환해서 다시 자식 타입으로 변환한 다음 자식 타입의 필드와 메서드를 사용하면 된다
.
인터페이스
인터페이스란
자바에서 인터페이스는 객체의 사용방법을 정의한 타입이다.
인터페이스는 객체의 호환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다.
인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 인터페이스의 메서드를 호출하면 인터페이스는 객체의 메서드를 호출시킨다.
객체가 메서드를 직접 호출하지 않고 인터페이스를 거쳐 호출하는 이유는 개발 코드를 수정하지 않고 사용하는 객체를 변경할 수 있도록 하기 위함이다. 하나의 객체가 아니라 여러 객체들과 사용 가능하므로 어떤 객체를 사용하는냐에 따라 실행 내용과 리턴값이 다를 수 있다.
인터페이스(interface) 선언
인터페이스(Interface) 선언 형식은 다음과 같이합니다.
인터페이스(Interface)
[public]interface 인터페이스명 { ... }
인터페이스는 클래스 이름을 작성하는 방법과 동일하다. 단 클래스와 달리 인터페이스는 상수와 메서드만을 구성멤버로 가진다. 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다.
인터페이스(Interface) 구성요소
상수 필드(Constant Field)
상수는 인터페이스에 고정된 값으로 런타임 시에 데이터를 바꿀 수 없다. 상수 선언시 반드시 초기값을 대입해야한다.
public static final 타입 상수명 = 값;
추상 메서드(Abstract Method)
객체가 가진 메서드를 설명한 것. 호출 시 어떤 매가값이 필요하고, 리턴 타입이 무엇인지만 알려준다. 실제 실행부는 객체가 갖고있다.
생략이 가능하다. 리턴타입, 메서드명, 매개변수만
기술되고 { } 를 붙이지 않는 메서드를 말한다.
디폴트 메서드(Default Method)
디폴트 메서드는 인터페이스에 선언되지만 사실 객체가 가진 인스턴스 메서드라고 생각해야한다. 기존 인터페이스를 확장해 새로운 기능 추가할 수 있기 떄문이다.
[ public ] default 리턴타입 메서드명 (매개변수 , ..) {
...
}
정적 메서드(Static Method)
디폴트 메서드와 달리 객체가 없어도 인터페이스 만으로 호출 가능하다.
[ public ] static 리턴타입 메서드명 (매개변수 , ..) {
...
}
인터페이스 구현
개발 코드가 인터페이스 메서드 호출 시 인터페이스는 객체의 메서드를 호출한다. 객체는 인터페이스에서 정의된 추상 메서드와 동일한 메서드 이름 , 매개 타입, 리턴 타입을 가진 실제 메서드를 가지고 있어야한다.
구현 클래스는 선언부에 implements 를 추가해준다.
상속과 인터페이스의 차이
- 상속은 말그대로 부모 자식 간 상속 (자식은 부모에게 유전적 형질을 받음) 인터페이스는 객체의 행위의 추상화이다. ( 객체를 단순화 시키는 것이다. )
- 상속은 강제하거나 특정한 영역에 집중시킨다면 인터페이스는 유연하다.
- 추상클래스는 단일 상속이지만, 인터페이스는 다중 상속이 가능하다.