Java Section 10 : 상속
[상속]
■ 상속 : 부모 역할을 하는 클래스가 자식 역할을 하는 클래스에게 클래스 멤버와 메서드를 물려주는 것
- 클래스를 재사용하기 때문에 중복을 줄여주고 수정을 최소화함
□ 자식 클래스에서 "extends" 키워드를 사용하여 상속받을 클래스를 지명한다.
※ 자바는 다중 상속을 허용하지 않으므로 extends 뒤에 하나의 부모 클래스만 허용한다.
- 부모 클래스의 상속을 받은 자식 클래스는 부모 클래스의 모든 멤버를 가져다 쓸 수 있다.
부모 클래스 == 상위 클래스 == 기반 클래스
자식 클래스 == 하위 클래스 == 파생 클래스
[상속에서의 생성자]
특별한 역할을 하지 않는 기본 생성자는 비어있는 것이 맞지만 자식 클래스의 기본 생성자는 super()라는 메소드를 가지고 있으며 이는 생략되어 있다.
1) super()
: 부모 클래스의 생성자를 호출할 때 사용
Comic(){
super();
}
- 개발자가 직접 생성자를 선언할 때도 자식 클래스에서는 반드시 부모 클래스의 생성자를 호출해야 한다.
- 만약 부모 클래스의 생성자가 호출될 때 매개변수로 값을 전달받아 부모 클래스의 필드들을 초기화 하도록 구현되어 있으면, 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때도 부모 클래스 대신 값을 매개변수로 받아서 부모 생성자에 넣어주어야 한다.
- 부모 클래스
public class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
- 자식 클래스
public class Customer extends Person {
int memberID;
Customer(String name, int age, int memberID) {
super(name, age);
this.memberID = memberID;
}
void enter() {
System.out.println("회원번호 : " + memberID + " ( "+ name + " , " + age + "세) 님 입장하셨습니다.);
}
}
[오버라이딩]
■ 오버라이딩 : 상속 받은 메서드를 변경해서 다시 구현하는 것
- 오버라이딩한 후 자식 객체를 생성하여 해당 메서드를 호출하면 자식 클래스에서 구현한 메서드가 실행된다.
※ 제약 사항
□ 부모 클래스의 메서드 이름/반환 타입/매개변수와 동일해야 한다.
□ 부모 클래스의 메서드보다 접근 제한을 줄일 수는 있으나 (범위를 넓힐 수 있으나) 접근 제한을 늘릴 수는 없다.
- default -> public (o), public -> private (x)
※ 오버로딩과 오버라이딩
오버로딩은 새로운 메서드를 정의하는 것이고, 오버라이딩은 상속받은 기존의 메서드를 재정의하는 것이다.
※ @Override 어노테이션 : 주석과 마찬가지로 코드 실행 시 영향을 미치지 않는다. 자동완성으로 오버라이딩 할 시 자동으로 상단에 @Override가 추가된다. 없어도 되는데 추가할 시 컴파일러에게 한번 더 짚어주면서 개발자의 실수를 줄여줄 수 있다.
※ super 키워드 : 부모 클래스에서 상속받은 필드나 메서드를 자식 클래스에서 참조하는 데 사용하는 참조변수
super.부모 메서드();
- super 참조 변수를 사용할 수 있는 대상은 인스턴스 메서드뿐이며, 클래스 메서드에서는 사용할 수 없다.
[접근 제한자]
■ 접근 제한자 : 정보 은닉을 위해 사용. 클래스와 멤버에 대해 외부에서 접근하지 못하도록 접근 권한을 제한할 때 사용
- public, private, protected,default 등..
① public : 접근 제한자 중 가장 사용 범위가 큰 제어자. 모든 패키지, 모든 클래스 어디서나 해당 클래스로 객체 생성 가능
② private : 접근 제한자 중 가장 사용 범위가 작은 제어자. private로 선언된 멤버들은 클래스 외에서 접근이 전혀 불가능하다.
[final 클래스와 final 메서드]
① final 클래스 : 상속의 마지막 클래스임을 나타낸다. 어떠한 클래스도 이 클래스의 자식 클래스가 될 수 없고, 이 클래스는 다른 클래스의 부모 클래스가 될 수 없다.
② final 메서드 : 상속받더라도 오버라이딩 불가. final로 선언된 메서드는 자식 클래스에서 오버라이딩하지 못하고 그대로 사용해야 한다.
※ 객체 지향의 특징
① 캡슐화 : 객체 내부의 멤버(필드, 메서드 등)를 객체 외부에서 볼 수 없도록 캡슐화 함.
② 추상화 : 공통된 기능과 정보를 추출해 객체화함
③ 상속 : 미리 정의된 부모 클래스의 모든 멤버를 자식 클래스가 물려받음
④ 다형성 : 하나의 방법으로 여러 객체를 호출하여 사용할 수 있음