[JAVA] 상속과 오버라이딩, super

Ming·2022년 9월 26일

자바

목록 보기
4/14

상속

상속

기존의 클래스로 새로운 클래스를 작성하는 것 즉, 코드의 재사용을 뜻한다. 두 클래스를 부모와 자식으로 관계를 맺어주는 것이다.

class 자식클래스 extends 부모 클래스{
	// ...
}
class Parent{}
class Child extends Parent{
	//...
}

특징

  • 자식은 조상(부모의 부모)의 모든 멤버를 상속받는다.(생성자, 초기화블럭 제외) ➡️ 받고 싶은 것만 선택할 수 없다.
  • 자손의 멤버 개수는 조상보다 적을 수 없다. ➡️ 자손의 멤버가 조상의 멤버보다 같거나 많다.
  • 자손의 변경은 조상에 영향을 미치지 않는다.

클래스 간의 관계

상속(inheritance) 관계

공통부분은 조상에서 관리하고 개별부분은 자손에서 관리한다. 조상의 변경은 자손에 영향을 미치지만 자손의 변경은 조상에 영향을 미치지 않는다.

class Point{
	int x;
    int y;
}
class Point3D extends Point{
	int z;
}

포함(composite) 관계

클래스의 멤버로 참조변수를 선언하는 것이다. 작은 단위의 클래스를 먼저 만들고, 이 들을 조합해서 하나의 커다란 클래스를 만든다.

class Circle{
	int x;
    int y;
    int z;
}

class Circle{
	Point c=new Point();
    int r;
}

- 상속 관계 '~은 ~이다.(is-a)' - 포함 관계 '~은 ~을 가지고 있다.(has-a)'

오버라이딩

상속받는 조상의 메서드를 상속받는 클래스에 맞게 변경하는 것을 의미한다.

class Point{
	int x;
	int y;
	
	String getLocation(){
		return "x :" + x+", y:"+y;
	}
}

class Point3D extends Point{
	int z;

	String getLocation(){ //오버라이딩
		return "x :"+x+", y:"+y+", z:" +z;
	}
}

조상클래스의 getLocation()을 사용하면 자식 클래스는 z 좌표가 빠지게 된다. 그렇기 때문에 조상 클래스의 getLocation()을 변경해야한다. 선언문은 변경하지 못하고 구현부(내용)만 변경가능하다.

오버라이딩 조건

  • 선언부가 같아야 한다.(이름, 매개변수, 반환타입)
  • 접근 제어자를 좁은 범위로 변경할 수 없다.
    • 조상의 메서드가 protected라면, 범위가 같거나 넓은 protected나 public으로만 변경할 수 있다.
  • 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

오버로딩 vs 오버라이딩

  • 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는 것
  • 오버라이딩(overriding) : 상속받은 메서드의 내용을 변경하는 것

참조변수(super)

조상의 멤버를 자신의 멤버와 구별할 때 사용된다.

class Parent{
	int x=10;
}
class Child extends Parent{
	int x=20;
    
    void method(){
    	System.out.println("x="+x); //x=20
        System.out.println("this.x="+this.x); //this.x=20
        System.out.println("super.x="+super.x); //super.x=10
    }
}

this
인스턴스 자신을 가리키는 참조변수로 인스턴스의 주소가 저장되어있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

super() 조상의 생성자

조상의 생성자를 호출할 때 사용한다. 조상의 멤버는 조상의 생성자를 호출해서 초기화한다. 자식 클래스의 인스턴스를 생성하면, 자손의 멤버와 조상의 멤버가 합쳐진 하나의 인스턴스가 생성된다. 이때, 조상의 멤버들도 초기화가 되어야 하기 때문에 자손의 생성자의 첫문장에서 조상의 생성자를 호출해야 된다.

class Point3D extends Point{
	int z;
    
    Point3D(int x, int y, int z){
    	super(x, y); //조상클래스의 생성자 Point(int x, int y)를 호출
        this.z=z; //자신의 멤버를 초기화
    }
}

❗️생성자의 첫 줄에 반드시 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입한다.


[출처]
자바의 정석 - https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp

0개의 댓글