java,jsp,spring/java
java 상속
프루트
2022. 7. 31. 14:06
상속
- 객체 지향의 상속
- 서브(자식)클래스의 간결화
- 클래스 관리 용이
- 생산성 향상

- 상속 선언

- 특징
- 다중 상속 안됨 > 자식 클래스 한개가 여러 부모 클래스에게서 상속을 못받음
- 상속 횟수는 제한 없음
- 최상위 조상 클래스는 java.lang.Object >> 자동 상속
ex 예제
class Point{
private int x,y; // 외부에서 직접 속성 수정 못하게 하기 위해 private 사용 > 메소드로 수정
public void set(int x, int y) {
this.x = x; this.y = y;
}
public void showPoint() {
System.out.println("("+x+","+y+")");
}
}
class ColorPoint extends Point {
private String color;
public void setColor(String color) {
this.color=color;
}
public void showColorPoint() {
System.out.print(color);
showPoint(); // 부모 클래스에서 상속 받음
}
}
public class ColorPointEx {
public static void main(String[] args) {
Point p = new Point();
p.set(1, 2);
p.showPoint();
ColorPoint cp = new ColorPoint();
cp.set(3, 4);
cp.setColor("red");
cp.showColorPoint();
}
}
- 서브/슈퍼 클래스의 생성자 호출 및 실행
- 서브 클래스 객체 생성 시 서브/슈퍼 클래스의 생성자가 모두 실행 됨
- 서브/슈퍼 클래스의 생성자 중 슈퍼 클래스의 생성자가 먼저 실행

- 서브 클래스에서 슈퍼 클래스의 생성자 선택
- 여러 생성자 작성 가능
- 생성자 하나 선택
- 컴파일러가 자동으로 선택 > 기본 생성자가 없으면 오류 발생
- super() 이용 > 인자(매개변수)를 넣을 수 있음, 첫번째 줄에 작성해야 함
class Point2 { private int x,y; public Point2() { this.x = this.y = 0; } public Point2(int x, int y) { this.x = x; this.y = y; } public void showPoint() { System.out.println("("+x+","+y+")"); } } class ColorPoint2 extends Point2 { private String color; public ColorPoint2(int x, int y, String color) { super(x,y); // 매개변수가 2개인 슈퍼클래스의 생성자 호출 > x=5,y=6 입력 this.color = color; } public void showColorPoint() { System.out.print(color); showPoint(); } } public class SuperEx { public static void main(String[] args) { ColorPoint2 cp = new ColorPoint2(5,6,"blue"); cp.showColorPoint(); // 출력값: blue(5,6) } }
업캐스팅(UPCASTING)
- 서브 클래스의 객체 > 슈퍼클래스의 객체로 볼 수 있음
- 업캐스팅된 레퍼런스(참조 변수)는 서브 클래스의 객체를 가르키지만 슈퍼 클래스의 멤버에만 접근 가능

다운캐스팅(DOWNCASTING)
- 다운 캐스팅된 참조 변수는 슈퍼 클래스와 서브 클래스의 멤버에 접근 가능

instanceof 연산자
- 객체 타입을 확인하는 연산자 > 형변환 가능여부를 확인하며 true / false 로 결과를 반환
- 형태 : 객체 레퍼런스 instanceof 클래스 타입
class Person{}
class Student extends Person{}
class Researcher extends Person{}
class Professor extends Researcher{}
public class InstanceOfEx {
static void print(Person p) { // Person p = new Student();
if (p instanceof Person) {
System.out.print("Person ");
}
if (p instanceof Student) {
System.out.print("Student ");
}
if (p instanceof Researcher) {
System.out.print("Researcher ");
}
if (p instanceof Professor) {
System.out.print("Professor ");
}
System.out.println();
}
public static void main(String[] args) {
System.out.print("new Student() -->\t"); print(new Student()); //메소드 호출 > 학생 객체를 넘김
System.out.print("new Researcher() -->\t"); print(new Researcher());
System.out.print("new Professor() -->\t"); print(new Professor());
}
}
오버라이딩
- 슈퍼클래스에 있는 메소드를 동일하게 서브클래스에 만들어서 사용(메소드 재정의) 동적 바인딩 : 실행을 하는 시점에 파일의 성격이 결정

- 오버라이딩(동적 바인딩), super(정적 바인딩) 키워드

- 오버라이딩 vs 오버로딩
비교요소 메소드 오버로딩 메소드 오버라이딩 메소드 이름 같음 같음 매개변수 타입 갯수가 같으면 타입이 달라야함 같음 매개변수 갯수 타입이 같으면 갯수가 달라야함 같음 리턴 타입 상관없음 같음