je개발 복습/Java

[ Java ] 상속 (Inheritance)

Je-chan 2022. 3. 26. 23:12

1. 클래스의 상속

  새로운 클래스를 정의하는 방법 중에는 이미 구현된 클래스의 모든 내용을 이어 받고 거기에 속성이나 기능 등을 더 추가해서 클래스를 구현하는 방법이 있다. 이것을 상속이라고 하며 기존의 클래스에서 더 구체적인 사항을 구현하고자 할 때 사용한다.

 

  예를 들어 개발자, 프론트엔드, 백엔드로 클래스를 만들어본다 생각해보자. 프론트엔드와 백엔드는 서로 다르지만 개발자라는 카테고리 안에 묶인다. 그렇다면 개발자라는 클래스를 먼저 먼저 만들고, 그것을 상속받아 프론트엔드와 백엔드를 각각 만들어 주면 된다.

 

2. super( ) 

  super 는 하위 클래스가 상위 클래스를 참조하는 값이다. 좀더 쉽게 풀이하자면 super 를 사용해서 상위 클래스의 메소드나 멤버 변수에 접근이 가능하다. super( ) 는 따로 명시하지 않아도 기본적으로 호출되기 떄문에 그렇게 신경쓰지 않아도 된다. 하지만, 한 가지 예외 사항이 존재한다. 만약, 상위 클래스에서 기본 생성자가 없자면, 하위 클래스는 super( ) 를 명시적으로 호출해야 한다. 

 

public class Developer {
	// protected 수식어는 하위 클래스에서는 접근이 가능하지만, 그 외의 외부 클래스에서는 접근이 불가능하도록 하는 것
	protected String developerName;
	protected String mainLanguage;
    
	public Developer (String developerName, String mainLanguage) {
    	this.developerName = developerName;
        this.mainLanguage = mainLanguage;
	}
}

 

  위와 같은 클래스는 새로 만든 생성자를 만들어서 사용한다 이런 경우, 상위 클래스의 생성자를 명시적으로 호출해야 한다.

 

public class FrontendDeveloper extends Developer{
	public String usingFramework;
    
    public FrontendDeveloper (String developerName, String mainLanguage, String usingFramework) {
    	super(developerName, mainLangauge);
        
        this.usingFramework = usingFramework
    }
}

 

  위의 예시는 사실 좋은 예시라고 보기는 힘들다. 저럴 바에는 그냥 기본 생성자를 사용하는게 나을 수 있다. 하지만, 그래도 일단은 저렇게 된다는 사실만 알면 될 거 같다.

 

 

3. 업 캐스팅 (형변환)

  상위 클래스로 변수를 선언하고 하위 클래스의 생성자로 인스턴스를 생성할 수 있다. 

 

// 위의 예제가 아니라 기본 생성자가 있는 클래스라고 생각한다면, 
Developer je = new FrontendDeveloper();

  

  하위 클래스는 상위 클래스의 타입을 모두 갖고 있다. 그렇기 떄문에 저렇게 선언을 하더라도 업캐스팅 되어 변환이 가능해진다. 정리하면 상속된 하위 클래스는 상위 클래스로 업캐스팅이 모두 가능하다. 하지만, 상위클래스를 하위 클래스로 업캐스팅할 수는 없다.