Java

[Java]상속

꽃달린감나무 2022. 1. 1. 19:49
728x90

상속은 기존의 클래스를 재활용하여 새로운 클래스를 만들기 위한 도구라고 할 수 있다. 하지만 상속을 이러한 측면에서만 보는 것은 옳지 않다. 그러한 이유는 무엇일까?

 

- 클래스 하나를 재활용하는 것이 새롭게 디자인하는 것보다 더 큰 노력이 든다.

- 재활용을 고려해서 클래스를 디자인할 경우, 설계에 필요한 시간이 몇 배 더 길어진다.

- 상속을 통해 연관된 일련의 클래스에 대한 공통적인 규약을 정의할 수 있다.

 

물론, 이런 경우만 있는 것이 아니지만, 이렇지 않은 사례들은 매우 드물 것이다.

 

상속의 특성 

- 상위 클래스를 상속받은 하위 클래스에서 상위 클래스에서 정의된 변수와 메소드를 사용가능하다.

- 상속받은 클래스를 하위 클래서, 유도 클래스, 상속하는 클래스 상위 클래스, 기초 클래스라 부른다.

 

상속과 생성자

하위 클래스 생성자를 호출하면서 상위 클래스의 생성자도 호출해야한다. 그러기 위해서는 하위 클래스의 생성자에 상위 클래스 생성자 호출문 super를 사용하는 방법과 직접 상위 클래스의 생성자를 사용하지 않고 하위 클래스에서 상위 클래스의 변수를 초기화해줘도 되지만 직접 초기화 하는 방법은 별로 좋지 않은 방법이다. 인스턴스 변수의 초기화는 인스턴스 변수가 선언된 클래스의 생성자를 통해서 진행하는 것이 가장 좋은 모델이다. 그 이유는

 

- 클래스가 정의될 때 인스턴스의 변수의 초기화 방식도 함께 결정되기 때문이다.

- 하위 클래스에서 상위 클래스의 모든 인스턴스 변수를 초기화하는 일은 상황에 따라 부담스러운 일이 된다.

 

상위클래스의 생성자 호출 super()

 

super(1,3,5) 

 

이 코드의 뜻은 "상위 클래스의 생성자를 호출하면서 1,3,5를 인자로 전달해라" 이다.

 

class Man{
	
	private String name;
	
	//상위 클래스 생성자
	public  Man(String name) {this.name = name;}
	
	//이름을 출력하는 메소드
	public void tellYourName() {System.out.println("My name is " + name);}
}

class BusinessMan extends Man{
	
	private String company;
	private String position;
	
	//하위 클래스 생성자
	public BusinessMan(String name, String company, String position) { 
		
		super(name); //상위 클래스 생성자 호출!
		this.company = company;
		this.position = position;
	}
	
	//객체의 정보를 출력하는 메소드
	public void tellYourInfo() {
		
		System.out.println("My company is " + company);
		System.out.println("My position is " + position);
		tellYourName(); // Man클래스를 상속받았기 때문에 Man 메소드 사용가능
	}
}
public class BasicInheritance {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		BusinessMan man1 = new BusinessMan("김무현", "capital", "사원");
		BusinessMan man2 = new BusinessMan("최혁준", "restorang", "어시턴트 매니저");
		
		System.out.println("man1 Info");
		man1.tellYourInfo();
		System.out.println("man2 Info");
		man2.tellYourInfo();
	}

}

여기서 드는 의문점은 하위 클래스의 생성자와 상위 클래스의 생성자 중에 무엇이 먼저 생성되는 가이다.

 

그 해답은 인스턴스를 생성하면서

 

1. 메모리 공간에 인스턴스를 할당한다( 주의 : 생성자의 호출이 완료되지 않았으므로 완전한 인스턴스로 볼 수 없다.)

2. BusinessMan(하위 클래스) 생성자를 호출한다.

3. Man(상위 클래스)의 생성자를 호출 및 실행한다.

4. BusinessMan(하위 클래스) 생성자를 실행한다.

 

즉, 하위 클래스의 생성자가 먼저 호출되지만, 상위 클래스의 생성자가 먼저 실행된다라고 정리할 수 있다.

 

만약, 하위 클래스의 super()문이 없다면 어떻게 될까? 인자를 전달받지 않는 상위 클래스의 생성자 호출을 위한 super문이 자동으로 삽입된다.

 

참고사항

자료형의 초기화 디폴트 값

int, double, long - 0

boolean - false

 

다른 예제를 참고하실 거면 아래 링크가 도움이 될 거에요!

https://github.com/wpdbs1229/Java/tree/main/Inherintance

728x90