JAVA에서 클래스 상속

Polynomeer·2020년 3월 24일
0

JAVA

목록 보기
2/8
post-thumbnail

JAVA에서 클래스의 상속

상속은 클래스를 재활용하는데에 그 목적이 있다고 보기 힘들다. 현실적으로 재활용을 고려해서 클래스를 디자인하는 것이 새로운 클래스를 디자인하는 것보다 몇 배나 더 큰 노력과 시간이 들기 때문이다. 그렇다면 JAVA에서 상속은 왜 중요하며 그 목적은 무엇일까?

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

1. 상속의 기본원리

상속은 기존에 정의된 클래스에 메소드와 변수를 추가하여 새로은 클래스를 정의하는 것이다. 예를들어, Man이라는 클래스가 있고 Man은 name이라는 멤버변수를 포함한다. 그리고 BusinessMan이라는 클래스를 정의하려고 할때 BusinessMan은 name을 포함하여 company, position라는 멤버변수를 가진다. 이때 BusinessMan은 별도로 name멤버를 표현할 필요없이 Man클래스를 상속하면 name멤버를 그대로 활용가능하다.

class Man {
	private String name;
    	public void showName() { System.out.println("My name is " + name); }
}
class Business Man extends Man {
	public String company;
    	public String position;
    	public void showInfo() {
    		System.out.println("My company is " + company);
        	System.out.println("My position is " + position);
        	showName(); // Man클래스를 상속했으므로 호출 가능
    }
}

여기서 Man을 부모 클래스라고 하며, extends 키워드를 통해 부모를 상속한 클래스인 BusinessMan을 자식 클래스라고 한다. 그 용어는 다르게 표현될 수 있다.

  • class Man : 부모 클래스, 슈퍼 클래스, 상위 클래스, 기본 클래스
  • class BusinessMan : 자식 클래스, 서브 클래스, 하위 클래스, 유도 클래스

상속과 생성자

항상 클래스의 조작과 관련된 문법을 공부할 때에는 가장 기본적인 메소드라고 할 수 있는 생성자에 관하여 생각해 보면 잘 이해가 된다. 이는 오버로딩과 오버라이딩과 같이 메소드관련 문법을 이해하는데에도 중요하다.

class Man {
	private String name;
    	public Man(String name) { this.name = name; } // super class 생성자
    	public void showName() { System.out.println("My name is " + name); }
}
class Business Man extends Man {
	public String company;
    	public String position;
    	public BusinessMan(String name, String company, String position) { // sub class 생성자
    		super(name); // super class 생성자 호출
        	this.company = company;
        	this.position = position;
    	}
    	public void showInfo() {
    		System.out.println("My company is " + company);
        	System.out.println("My position is " + position);
        	showName(); // Man클래스를 상속했으므로 호출 가능
    	}
}

Man과 Business클래스에 각각 생성자를 추가했다. 그런데 BusinessMan클래스에 super(name)이라는 키워드를 사용하였다. 먼저, 자식 클래스에서 부터 역으로 생각해보면 BusinessMan클래스에서 생성자를 통해 부모 클래스의 멤버변수인 name을 초기화 하기위해 접근하려한다. 하지만 부모 클래스에서 private로 접근이 제한되어있다. 그렇다면 부모 클래스의 메소드를 통해서 접근하는 방법 밖에 없다. 즉, 부모 클래스의 생성자를 통해서 초기화 해야한다.

super는 부모 클래스(super class) 그 자체를 의미한다. 따라서 여기서 super(name)은 Man(name)과 같은 의미가 된다. 즉, 부모 클래스의 생성자를 호출하여 name을 인자로 넘겨주면서 초기화하게 된다.

  1. 자식 클래스는 모든 멤버를 초기화 해야할 의무가 있다. 따라서 부모 클래스의 멤버까지도 초기화 해야한다.
  2. 부모 클래스에는 부모의 멤버를 초기화하도록 생성자가 잘 정의되어 있을것이므로 부모의 멤버는 자식 클래스에서 부모 클래스로 넘겨주어 초기화한다.
profile
어려운 문제를 어렵지 않게.

0개의 댓글