< 상속의 개념 >
부모클래스에 만들어진 필드와 메소드를 자식 클래스가 물려받는 것으로 상속 선언만 하면 자식클래스는 부모클래스에 만들어진 필드와 메소드를 만들지 않고도 만든 것과 같은 효과를 얻는다. 단 상속은 클래스 사이의 상속이지 객체 사이의 상속이 아니다.
<상속의 필요성>
자바에서 상속이 필요한 예를 들어보자.
class Student | class StudentWorker | class Researcher | class Professor |
말하기 먹기 걷기 잠자기 공부하기 |
말하기 먹기 걷기 잠자기 공부하기 일하기 |
말하기 먹기 걷기 잠자기 연구하기 |
말하기 먹기 걷기 잠자기 연구하기 가르치기 |
개발자가 위 표와 같이 4개의 클래스를 작성한다고 했을 때, 4개의 클래스에는 '잠자기', '말하기', '먹기', '걷기'의 코드가 공통으로 들어있다. 만일 '말하기' 멤버에 오류가 있어서 수정하게 되면 4개의 클래스를 모두 수정해야 해서 코드가 중복되면 클래스의 유지 보수가 번거로워진다.
이럴때 상속을 이용하면 간단하게 해결된다. 공통된 코드를 모아 person클래스를 작성하고 나머지 클래스를 상속 관계로 선언하면 코드를 중복 작성할 필요없이 물려받기만 하면 된다.
위 그림에서 화살표(↑)가 위로 향하는 것은 아래 클래스가 위 클래스를 상속받아 확장함을 뜻한다.
student 클래스는 person 클래스를 상속받고 '공부하기' 멤버만 만들면 되고(빨간색 네모), studentWorker 클래스는 strudent 클래스를 상속받아 '일하기'만 만들면(보라색 네모) 된다.
이렇게 코드 중복을 제거하여 클래스를 간결하게 구현할 수 있도록 하는 것이 상속이다.
<클래스 상속과 객체>
<자바의 상속 선언>
자바에서는 부모 클래스를 슈퍼 클래스(super class), 상속받는 자식 클래스를 서브 클래스(sub class)라고 부르며, 상속을 선언할 때 확장한다는 뜻을 가진 extends 키워드를 사용한다.
public class Person{
. . .
}
public class Student extends Person { //person을 상속받는 클래스 Student 선언
...
}
public clss StudentWorker extends Student{ // student를 상속받는 클래스 StudentWorker 선언
...
}
<상속과 객체>
class Point{
private int x, y;
// 한 점을 구성하는 x, y 좌표, private이라서 외부에서 접근불가, 상속관계여도 안됨.
public void set(int x, int y){
this.x = x; this.y = y;
}
public void showPoint() { // 점의 좌표 출력
System.out.println("(" + x + "," + y + ")"); //(x, y)
}
}
class ColorPoint extends Point { //point를 상속받은 ColorPoint 선언
private String color; // 점의 색
public void setColor(String color){
this.color = color;
}
public void showColorPoint(){ // 컬러 점의 좌표 출력
System.out.print(color);
showPoint(); // Point(부모) 클래스의 showPoint() 호출
}
}
public class ColorPointEx{
public static void main(String [] args){
Point p = new Point(); //point 객체 생성
p.set(1, 2); // Point 클래스의 set() 호출
p.showPoint();
ColorPoint cp = new ColorPoint(); //ColorPoint 객체 생성
cp.set(3, 4); // Point 클래스의 set() 호출
cp.setColor("red"); // ColorPoint 클래스의 setColor() 호풀
cp.showColorPoint(); // 컬러와 좌표 출력
}
}
<상속 선언>
class ColorPoint extends Point {
...
}
<서브 클래스 객체 생성>
Point p = new Point();
ColorPoint cp = new ColorPoint(); // 서브 클래스 객체 생성
<서브 클래스 객체 활용>
ColorPointEx 클래스의 main( ) 메소드에서는 cp객체를 구성하는 ColorPoint 클래스의 bublic 멤버와 슈퍼 클래스인 Point 클래스의 public 멤버를 모두 접근할 수 있다. 그러나 x, y, color 필드는 private 속성이어서 접근할 수 없다.
<서브 클래스에서 슈퍼 클래스 멤버 접근>
서브 클래스는 슈퍼 클래스의 private 멤버를 제외하고 모든 멤버를 접근할 수 있다. x,y는 Point의 private멤버로 오직 set( )과 showPoint( ) 에게만 접근이 허용되므로 ColorPoint클래스의 메소드들은 접근 할 수 없다.
<자바 상속의 특징>
· 자바에서는 클래스의 다중 상속을 지원하지 않는다.
- 자바는 클래스를 여러개 상속받는 다중상속을 지원하지 않으므로 extends 다음에는 클래스 이름을 하나만 지정할 수 있다.
· 자바에서는 상속의 횟수에 제한을 두지 않는다.
· 자바에서 계층 구조의 최상위에 java.lang.Object 클래스가 있다.
- 사용자가 만들든 자바패키지에서 제공하든, 자바에서 모든 클래스는 (Object를 상속받도록 선언하지 않아도) Object 클래스를 자동으로 상속받도록 컴파일된다.
<상속과 protected 접근 지정자>
<슈퍼 클래스에 대한 접근 지정>
· 슈퍼클래스의 private 멤버
- 서브클래스를 포함하여 다른 어떤 클래스에서도 접근이 불가함. 오직 현재 클래스 멤버들에게만 접근을 허용함.
· 슈퍼클래스의 디폴트 멤버
- 패키지에 있는 모든 클래스가 접근 가능. 다른 패키지에 있다면 슈퍼 클래스의 디폴트 멤버는 접근할 수 없음.
· 슈퍼클래스의 protected 멤버
- 패키지에 상관없이 상속받는 서브 클래스와 같은 패키지에 속한 모든 클래스들 접근 가능.
· 슈퍼클래스의 public 멤버
- 패키지에 상관없이 모든 클래스에서 접근이 가능.
'프로그래밍 공부 > java' 카테고리의 다른 글
[JAVA] 피보나치 수열에서 4백만 이하이면서 짝수인 항의 합 (0) | 2023.01.12 |
---|---|
[JAVA] 1000보다 작은 자연수 중에서 3 또는 5의 배수를 모두 더하면? (0) | 2023.01.10 |
[JAVA] 매크로 작성을 위한 팁 모음 (0) | 2023.01.03 |
[Java] 이것이 자바다 6장 확인 문제 1 : this()를 활용해서 중복 코드 제거하기 (1) | 2022.12.30 |
[JAVA] 클래스와 객체 - 객체 배열, 메소드, 접근지정자, static, final클래스 (0) | 2022.12.30 |