java,jsp,spring/java

java 상속

프루트 2022. 7. 31. 14:06

상속

  • 객체 지향의 상속
  • 서브(자식)클래스의 간결화
  • 클래스 관리 용이
  • 생산성 향상

  • 상속 선언

  • 특징
    1. 다중 상속 안됨 > 자식 클래스 한개가 여러 부모 클래스에게서 상속을 못받음
    2. 상속 횟수는 제한 없음
    3. 최상위 조상 클래스는 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 오버로딩
    비교요소 메소드 오버로딩 메소드 오버라이딩
    메소드 이름 같음 같음
    매개변수 타입 갯수가 같으면 타입이 달라야함 같음
    매개변수 갯수 타입이 같으면 갯수가 달라야함 같음
    리턴 타입 상관없음 같음