▸JAVA/기본 문법

클래스 상속 (extends)

코데방 2019. 12. 10.
728x90

상속을 사용할 때는 접근 제한자(캡슐화)에 대한 부분만 머릿속에서 잘 그리면 사용이 그리 어렵진 않습니다. 기본적으로 Java에서는 다중 상속을 허용하지 않고 있기 때문에 부모 클래스와 자식 클래스의 관계가 명확합니다. 프로그램이 커질 수록 객체 간 상관관계를 구조도로 그려두는 것이 좋겠네요.

 


 

일단 클래스 생성 시 필드는 private으로 생성하는 것이 좋습니다. 자식 클래스 또는 다른 클래스에서 데이터에 직접 접근하는 것을 방지하기 위함 입니다. 그리고 해당 데이터에 접근할 수 있는 함수를 추가로 만들어두는데, 값을 가져오는 것을 "getter", 값을 변경하는 것을 "setter"라고 부릅니다. 거의 필수적인 구조라 이클립스에서는 아예 해당 함수를 자동 생성해주는 기능이 있습니다.

 

package study.first;

public class Test {

	private int x;
	public int y;
	
	/* 생성자 선언 */
	public Test(int x, int y) {
		this.x = x;
		this.y = y;
	}		
	
	/* getter, setter */
	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

 

 

"우클릭 - Source - Generate Getters and Setters" 기능을 이용하면 자동으로 생성됩니다. 생성자 선언 또한 아랫쪽에 있는 "Generate Constructor using Fields" 기능을 이용하면 자동으로 만들어 줍니다. 굳이 마우스를 이용하지 않고 "Alt + Shift + S"를 누르면 해당 팝업이 뜹니다.

 

 

 


 

다른 클래스에서와 마찬가지로 자식 클래스에서도 부모클래스의 private 필드는 접근이 불가합니다. 오직 getter와 setter 함수를 이용해서면 접근이 가능하게 됩니다. 또한 부모 클래스의 private 메소드 또한 마찬가지로 자식 클래스에서는 호출이 불가능합니다. 물론 필드나 메소드의 접근 제한자가 private이 아니라면 모두 직접 호출이 가능 합니다.

오버라이딩을 사용하지 않았다면 부모 클래스의 메소드 호출에는 굳이 앞의 super.를 붙여줄 필요는 없지만 코드의 가시성을 위해 붙여주는 편이 보기가 좋습니다. 오버라이딩을 사용했다면 두 메소드를 구분해줘야 합니다. 부모 클래스는 super.메소드가 되고 자식 클래스(자기 자신)에서는 this.메소드가 됩니다.

 

 

 

 


 

부모 클래스에서 생성자 선언을 했다면, 자식 클래스에서도 무조건 생성자 선언을 해줘야 합니다. 부모 클래스의 생성자를 그대로 쓰고 자식 클래스에서 생성자가 추가됐다면 추가해주면 됩니다. 이 코드 또한 이클립스에서 자동으로 생성할 수 있습니다.

부모클래스에 생성자를 넘겨주는 방식은 super()구문을 사용합니다. 생성자 필드를 public으로 셋팅했더라도 그냥 수동으로 this.x = x 방식으로는 생성자 전달이 되지 않습니다. 무조건 super()구문으로 부모 클래스의 생성자를 셋팅해줘야 합니다. 위에서 언급한 이클립스의 생성자 선언 기능을 사용하면 부모 클래스의 생성자 선언까지 알아서 만들어 줍니다.

package study.first;

public class TestSub extends Test {

	private String a;
	
	/* 생성자 선언 */
	public TestSub(int x, int y, String a) {
		super(x, y);	// 부모 클래스 생성자
		this.a = a;
	}	package study.first;

public class TestSub extends Test {

	private String a;
	
	/* 생성자 선언 */
	public TestSub(int x, int y, String a) {
		super(x, y);	// 부모 클래스 생성자
		this.a = a;
	}	

 

 


 

이제 최종적으로 다른 클래스에서 자식 클래스의 인스턴스를 하나 생성하게 되면 자식 클래스 기준으로 접근 가능한 부모 클래스의 필드나 메소드는 모두 사용이 가능하며, 반대로 자식 클래스에서 접근 불가능한 부모 클래스의 private인자나 자식 클래스가 가지고 있는 private인자는 호출이 불가능 합니다. 기본 원리와 동일하게 작동합니다. 머릿속에 해당 구조만 그리고 있으면 상속은 크게 무리 없이 사용이 가능합니다.

아래와 같이 자식 클래스 인스턴스를 생성할 때 두 개의 클래스가 동시에 묶여서 객체화가 된다고 생각하면 머릿속에서 더 쉽게 구조화를 할 수 있을 듯합니다.

 

728x90

댓글

💲 추천 글