Java Day 12 상속
16 Dec 2020 | JavaJava Day 12 상속
-
상속
- 클래스간의 기능을 확장이전 함으로서 코드의 중복을 줄여주고 유지보수성이 증대됨
- 기본클래스(Base Class), 부모클래스(Parent Class), 상위클래스(Super Class) - 주는쪽
- 유도클래스(Derivation Class), 자식클래스(Child Class), 하위클래스(Sub Class) - 받는쪽
- 자바에서는 다중상속을 허용하지 않는다
- 자식클래스는 extends 예약어를 사용하여 상속을 받음
-
super() 생성자
- 자식클래스가 생성될 때 눈에는 보이지 않지만 메모리상으로는 부모를 먼저 생성한 후 상속을 받아 생성된다. 따라서, 자식클래스는 부모 생성자를 호출함
- 아무것도 적지 않아도 사실 자식 클래스의 생성자의 첫줄에 super();가 생략되어있는것
- 만약 부모클래스의 기본생성자가 매개변수를 받는 경우 자식클래스의 super() 생성자도 같은 자료형의 매개변수를 받아야 컴파일오류가 안난다
public class Human{ public Human(int age){ System.out.println(age); } } public class Women extends Human{ public Women(){ super(30); //super(); 매개변수 안받으면 compile error } } public class SuperEx{ public static void main(String[] args){ Women me = new Women(); //30 출력, 부모클래스의 생성자가 호출됨 } }
-
오버라이드(Override)
- 상위클래스의 메소드를 하위클래스에서 재정의
- 오버로드(Overload)와 헷갈리니 주의, 오버로드는 하나의 클래스에서 같은 이름의 메소드 혹은 생성자를 인자,자료형 다르게 해서 재사용하는것
- 오버라이딩은 부모의 메소드와 이름, 매개변수, 리턴타입이 같아야한다
- 접근제한은 더 넓게만 가능하다 ex) 부모 : protected = 자식 : protected, public
- 윗줄에 명시적으로 @Override 표기를 해주는 것이 좋다
class CellPhone{ public void cell(){ System.out.println("음성 통화"); } } public class SmartPhone extends CellPhone{ @Override public void cell(){ super.cell(); //부모 메소드 호출 System.out.println("영상 통화"); } } public static void main(String[] args){ SmartPhone sp = new SmartPhone(); sp.cell(); }//음성통화, 영상통화 출력
-
final 클래스, final 메소드
- final 지정어가 붙은 클래스는 자식클래스에서 상속이 불가능하다 ex) String class..
- final 지정어가 붙은 메소드는 자식클래스에서 오버라이딩 할 수 없다
-
protected 접근제한자
- protected가 붙은 메소드, 멤버, 생성자는 같은 패키지면 접근이 가능하지만 다른 패키지에서 접근하려면 해당 클래스를 상속받은 후 사용해야한다
참고 자료
KG아이티뱅크 자바 강의자료