15번째 강의도 상속에 대한 내용이었다.
상속을 위한 두 클래스의 관계
- is - a 관계를 이룰 것
- 하위 클래스는 상위 클래스의 모든 특성(변수 + 메소드)를 지님. 이에 더하여 자신만의 추가적인 특성을 더함
- 문법적인 관계가 아닌 실제 또는 설계상의 관계를 뜻한다.
- 의미 또는 기능상 전혀 연관이 없는 클래스간의 상속을 피할 것
- 예
- 전자제품 <- 휴대전화 <- 스마트폰
- 분식 <- 라면 <- 신라면
상위 클래스의 참조변수를 통해 하위 클래스의 인스턴스를 참조할 수 있다.
- 하위 클래스의 참조변수로 상위 클래스의 인스턴스를 참조하는 역은 성립하지 않음
- 단 이렇게 사용하게 되면 하위 클래스에 추가된 특성은 해당 참조변수를 통해서는 사용할 수 없다.
- 배열로 선언하는 경우에도 동일하게 적용 가능함
class Electronics {...}
class MobilePhone extends Electronics {...}
Electronics E1 = new MobilePhone(); // --> 아무런 문제 없음
Electronics[] E2 = new MobliePhone[5]; // --> 아무런 문제 없음
/*---------------------------------------------------------------*/
class electronics {
String type;
public electronics(String n) {
this.type = n;
}
public void introduceType() {
System.out.println(type);
}
}
class mobliePhone extends electronics {
String name;
public mobliePhone(String t, String n) {
super(t);
this.name = n;
}
public void introduceName() {
System.out.println(name);
}
}
public static void main(String[] args) {
electronics E1 = new mobliePhone("Phone", "Anycall");
mobliePhone E2 = new mobliePhone("Phone", "Galaxy");
E1.introduceName(); // 작동 안됨. 애초에 컴파일러에서 에러 출력
E1.introduceType(); // 문제 없음
E2.introduceName(); // 문제 없음
E2.introduceType(); // 문제 없음
}
메소드 오버라이딩
- 하위 클래스에서 상위 클래스의 메소드와 동일한 반환형과 이름, 매개변수 구성을 가진 메소드를 선언하면 이를 메소드 오버라이딩이라고 지칭
- 상위 클래스의 참조변수를 통해서 하위 클래스의 인스턴스를 참조하여 메소드를 사용하더라도 하위 클래스에서 오버라이딩한 기능으로 메소드가 동작한다.
- 오버라이딩 된 상위 클래스의 메소드를 사용하려면 super 키워드를 사용해야 함
- 변수는 오버라이딩 되지 않는다.
- 애초에 비슷한 목적으로 코딩을 하면 바람직하지 않음
- 그냥 알고만 있자.
class electronics {
String type;
public electronics(String n) {
this.type = n;
}
public void introduce() {
System.out.println(type);
}
}
class mobliePhone extends electronics {
String name;
public mobliePhone(String t, String n) {
super(t);
this.name = n;
}
public void introduce() {
System.out.println(name);
}
}
public static void main(String[] args) {
electronics E1 = new mobliePhone("Phone", "Anycall");
mobliePhone E2 = new mobliePhone("Phone", "Galaxy");
E1.introduce(); // "Anycall" 출력됨
E2.introduce(); // "Galaxy" 출력됨
}
/*--------------------------------------------------------*/
class mobliePhone extends electronics {
...
public void introduce() {
super.introduce();
System.out.println(name);
}
}
public static void main(String[] args) {
electronics E1 = new mobliePhone("Phone", "Anycall");
mobliePhone E2 = new mobliePhone("Phone", "Galaxy");
E1.introduce(); // "Phone" 출력 후 개행 "Anycall" 출력됨
E2.introduce(); // "Phone" 출력 후 개행 "Galaxy" 출력됨
}
instanceof 연산자
- __REF__ instanceof __CLASS_NAME__
- __REF__가 __CLASS_NAME__의 인스턴스를 참조하면 True를 반환
- __REF__가 __CLASS_NAME__을 상속하는 클래스의 인스턴스일 경우 True 반환
- 인스턴스의 클래스 종류를 판별하는 조건으로 활용할 수 있다.
'프로그래밍 > Java' 카테고리의 다른 글
Java - 인터페이스 (0) | 2020.07.08 |
---|---|
Java - 상속 (3) (0) | 2020.07.08 |
Java - 상속 (1) (0) | 2020.07.05 |
Java - 콘솔 출력과 입력 (0) | 2020.06.29 |
Java - 메소드 오버로딩과 String 클래스 (0) | 2020.06.28 |