상속

박은빈·2022년 9월 27일
0

자바

목록 보기
2/25
post-thumbnail

상속이란

상속(Inheritance)는 상위클래스가 하위클래스의 개념을 확장, 세분화하는 의미이다

위에 그림을 보면 동물이라는 부모클래스가 존재한다

이 부모클래스에서 자식클래스 포유류와 조류를 만들어 개념을 확장, 구체화를 시켰고

여기서 포유류클래스는 고래, 박쥐, 조류클래스는 참새, 닭 클래스를 만들어서

한번 더 개념을 확장, 구체화를 시켰다

즉 상속은 이름만 상속(inheritance)지 사실은 확장(extedns)이 맞다

그리고 그에 맞게 자바에서 상속을 선언할때 extends를 이용한다

간단하게 “하위클래스는 상위클래스이다”와

하위클래스는 상위클래스의 한 분류이다”를 만족해야한다

ex) 조류는 동물이다, 고래는 포유류이다, 고래는 동물이다

상속을 쓰는이유

  • 상속을 쓰면 중복된 코드를 제거해 효율적인 코드를 작성할 수 있다
  • 상위 클래스의 특성을 확장, 세분화 할 수 있어 확장성과 통일성이 좋다

상속의 선언

class 부모 클래스명 {

}

class 자식 클래스명 extends 부모 클래스명 {

}

상속의 사용

상속은 부모클래스의 개념을 자식클래스가 확장하는 것이기때문에

부모클래스의 변수와 메서드들을 사용할 수 있다

class 동물 {
	String myClass;

	동물() {
		myClass = "동물";
	}

	public void showMe() {
		System.out.println(myClass);
	}
}

class 조류 extends 동물 {
	조류() {
		myClass = "조류";
	}
}

class 참새 extends 조류 {
	참새() {
		myClass = "참새";
	}
}

public class AnimalTest {
	public static void main(String[] args) {
		동물 animal = new 동물();
		조류 bird = new 조류();
		참새 sparrow = new 참새();

		animal.showMe;  //동물
		bird.showMe;    //조류
		sparrow.showMe; //참새
	}
}

상위클래스인 동물클래스의 변수인 myClass와 메서드 showMe를 재사용했기때문에

하위클래스 조류, 참새클래스에서 해당 변수와 메서드가 사용가능했다,

또한 상속은 상위클래스의 확장의 개념이기때문에

객체를 선언할때 자료형을 상위클래스로 넣어도 같은 값이 나오게 된다

public class AnimalTest {
	public static void main(String[] args) {
		동물 animal = new 동물();
		동물 bird = new 조류();
		동물 sparrow = new 참새();

		animal.showMe;  //동물
		bird.showMe;    //조류
		sparrow.showMe; //참새

		//그리고 해당 객체들을 하나의 배열에 넣을수도 있다
	
		동물[] animals = new 동물[3];
		동물[0] = new 동물();
		동물[1] = new 조류();
		동물[2] = new 참새();

		for(동물 a :  animals) {
			animals.showMe;
		}
		//동물 조류 참새
	}
}

super, this

상속에서 생성자를 호출할때 무조건 상위클래스의 생성자를 호출해야한다

하지만 우리가 하위클래스의 생성자를 만들때 상위 클래스의 생성자를 호출한 적이 없는데

코드가 정상적으로 돌아간다. 이유는 바로 super();가 생성자 안에 기본으로 들어가있기 때문이다

class Shape {
	protected int shapeX;
	
	public Shape() {
		shapeX = 100;
	}
	
	public void showShape() {
		System.out.println(shapeX);
	}
}

class Rect extends Shape {
	protected int rectX, shapeX;
	
	public Rect() {
		super();
		rectX = 200;
		shapeX = 300;
	}
	
	public void showRect() {
		System.out.println(rectX + ", " + super.shapeX + ", " + this.shapeX);
	}
}

public class SuperThis {

	public static void main(String[] args) {
		Rect rect = new Rect();
		
		rect.showShape();
		rect.showRect();
	}

}
//결과 : rectX   super.shapeX  this.shapeX
//		  200        100           300

위의 코드에서 Rect생성자 안에 super()를 선언해주었다. 사실 선언을 안해도 기본으로 들어가있다

이 super()는 상위 클래스의 생성자를 가져오기때문에 상위 크래스가 호출이되게된다

또한 Rect클래스레서 Shape클래스의 데이터를 사용하고 확장시킬 수 있다

변수와 메서드에서의 this와 super

  • this : 자신의 클래스 내에서의 변수와 메서드를 가리킨다
  • super : 상위클래스의 변수와 메서드를 가리킨다

위의 코드에서 Rect클래스 shapeX의 값을 재할당시켰다

이렇게되면 Shape클래스의 Rect클래스 변수의 값이 중복되는데

여기서 this와 super를 이용해 변수를 가리킬수있다

System.out.println(rectX + ", " + super.shapeX + ", " + this.shapeX);

super.shapeX는 상위클래스 Shape를 가리키고 this.shapeX는 하위클래스 Rect을 가리키므로

결과는 100, 300 각각 다르게 나온다

profile
안녕하세요

0개의 댓글