[Java] 상속과 super키워드

김용준·2022년 10월 5일
0

Java Basic

목록 보기
21/22

상속이란?

  • 기존의 클래스(상위클래스)를 재사용하여 새로운 클래스(하위클래스)를 정의하는 것.

  • 하위 클래스는 상위 클래스의 멤버를 상속받는다. 다르게 표현하면 상위 클래스를 확장시켜 하위 클래스를 정의한다.

  • 하위 클래스는 추가적인 코드 작성 없이 상위 클래스의 멤버를 그대로 사용할 수 있다.

  • extends키워드를 통해 상속한다.

public class 상위클래스 {

	필드1;
	메소드1;
    
}


public class 하위클래스 extends 상위클래스 {

	필드2;
    메소드2;
    
    // 상위클래스로부터 상속받은 필드1과 메소드1은
    // 하위클래스에서 정의하지 않아도 사용할 수 있다.
}

장점

  • 보다 적은양의 코드로 새로운 클래스를 정의할 수 있다.
    -> 코드의 중복을 제거하고 재사용성을 높인다.

  • 하위 클래스들은 상위 클래스의 코드를 공통으로 갖기 때문에 코드의 추가 및 변경이 용이하다.
    -> 프로그램의 유지보수성이 높아진다.

주의사항

  • 단일 상속만 지원한다. 즉, 하위 클래스는 단 하나의 상위 클래스만 상속받을 수 있다.

  • 동시에 여러 개의 상위 클래스를 상속받을 수는 없지만, 여러 상위 클래스를 수직적으로 상속받을 수는 있다.

Object 클래스

  • Object 클래스는 배열을 포함한 모든 클래스의 최상위 클래스다.즉, 자바의 모든 클래스는 Object 클래스의 하위 클래스다.

  • 상위클래스가 지정되지 않은 클래스는 항상 Object 클래스를 상속받는다.

  • Object 클래스에는 배열을 포함한 모든 객체가 꼭 포함해야할 메소드가 정의되어 있다.

상속받은 객체의 사용

  • 하위 객체를 생성하면 상위 객체도 같이 생성된다. 즉, 생성된 하위 객체가 내부에 상위 객체를 포함한다.

  • 모든 하위 객체들이 하나의 상위 객체를 공유하는 것이 아니라 각각의 하위 객체는 자신만의 상위 객체를 갖고 있다.

  • 하위 객체의 참조변수로 상위 객체의 멤버를 사용할 수 있다.

  • 단, 상위 객체의 생성자나 상위 객체의 private멤버는 사용할 수 없다.

다음 예제를 통해 상속 구조와 상속받은 클래스로부터 생성한 객체의 사용을 이해해보자.Phone으로부터 SmartPhone이 상속받았고, SmartPhone으로부터 각각 GalaxyIphone이 상속받았다.

public class Phone {
	
	private String number;
	
	public String getNumber() {
		return number;
	}
	
	public void setNumber(String number) {
		this.number = number;
	}
	
	public void tel() {
		System.out.println("["+number+"] 전화 기능을 실행합니다.");
	}
	
	public void sms() {
		System.out.println("["+number+"] 문자 기능을 실행합니다.");
	}
}
public class SmartPhone extends Phone {

	private String ip;
	
	
	public String getIp() {
		return ip;
	}
	
	public void setIp(String ip) {
		this.ip = ip;
	}
	
	public void internet() {
		System.out.println("["+ip+"] 인터넷 기능을 실행합니다.");
	}
}
public class Galaxy extends SmartPhone {

	private String samsungId;
	
	public String getSamsungId() {
		return samsungId;
	}

	public void setSamsungId(String samsungId) {
		this.samsungId = samsungId;
	}

	public void samsungPay(int amount) {
		System.out.println("["+amount+"]원을 삼성페이로 결제합니다. ");
	}
}
public class Iphone extends SmartPhone {

	private String appleId;
	
	public String getAppleId() {
		return appleId;
	}

	public void setAppleId(String appleId) {
		this.appleId = appleId;
	}

	public void applePay(int amount) {
		System.out.println("["+amount+"]원을 애플페이로 결제합니다.");
	}
}
public class PhoneApp {

	public static void main(String[] args) {
		
		System.out.println("### Phone객체 생성해서 사용하기");
		Phone phone = new Phone();
		phone.setNumber("010-1111-1111");
		phone.tel();
		phone.sms();
		System.out.println("------------------------------------");
		
		System.out.println("### SmartPhone객체 생성해서 사용하기");
		SmartPhone smartPhone = new SmartPhone();
		smartPhone.setNumber("010-2222-2222");	// Phone클래스로부터 상속받은 기능이다.
		smartPhone.tel();						// Phone클래스로부터 상속받은 기능이다.
		smartPhone.sms();						// Phone클래스로부터 상속받은 기능이다.
		smartPhone.setIp("192.168.10.100");		// SmartPhone클래스에 정의된 기능이다.
		smartPhone.internet();					// SmartPhone클래스에 정의된 기능이다.
		System.out.println("------------------------------------");
		
		System.out.println("### Galaxy객체 생성해서 사용하기");
		Galaxy galaxy = new Galaxy();
		galaxy.setNumber("010-3333-3333");		// Phone클래스로부터 상속받은 기능이다.
		galaxy.tel();							// Phone클래스로부터 상속받은 기능이다.
		galaxy.sms();							// Phone클래스로부터 상속받은 기능이다.
		galaxy.setIp("192.168.**.***");			// SmartPhone클래스로부터 상속받은 기능이다.
		galaxy.internet();						// SmartPhone클래스로부터 상속받은 기능이다.
		galaxy.setSamsungId("kyj0829");			// Galaxy클래스에 정의된 기능이다.
		galaxy.samsungPay(50000);				// Galaxy클래스에 정의된 기능이다.
		System.out.println("------------------------------------");
		
		System.out.println("### Iphone객체 생성해서 사용하기");
		Iphone iphone = new Iphone();
		iphone.setNumber("010-4444-4444");		// Phone클래스로부터 상속받은 기능이다.
		iphone.tel();							// Phone클래스로부터 상속받은 기능이다.
		iphone.sms();							// Phone클래스로부터 상속받은 기능이다.
		iphone.setIp("192.168.**.***");			// SmartPhone클래스로부터 상속받은 기능이다.
		iphone.internet();						// SmartPhone클래스로부터 상속받은 기능이다.
		iphone.setAppleId("kyj0409");			// Iphone클래스에 정의된 기능이다.
		iphone.applePay(40000);					// Iphone클래스에 정의된 기능이다.
	}
}
출력

### Phone객체 생성해서 사용하기
[010-1111-1111] 전화 기능을 실행합니다.
[010-1111-1111] 문자 기능을 실행합니다.
------------------------------------
### SmartPhone객체 생성해서 사용하기
[010-2222-2222] 전화 기능을 실행합니다.
[010-2222-2222] 문자 기능을 실행합니다.
[192.168.10.100] 인터넷 기능을 실행합니다.
------------------------------------
### Galaxy객체 생성해서 사용하기
[010-3333-3333] 전화 기능을 실행합니다.
[010-3333-3333] 문자 기능을 실행합니다.
[192.168.**.***] 인터넷 기능을 실행합니다.
[50000]원을 삼성페이로 결제합니다. 
------------------------------------
### Iphone객체 생성해서 사용하기
[010-4444-4444] 전화 기능을 실행합니다.
[010-4444-4444] 문자 기능을 실행합니다.
[192.168.**.***] 인터넷 기능을 실행합니다.
[40000]원을 애플페이로 결제합니다.

super 참조변수

하위 객체 생성 시, 객체 내부에 this라는 참조변수가 자동으로 생성된다. 마찬가지로 super라는 참조변수도 자동으로 생성된다. 참조변수super를 통해 상위 객체의 멤버에 접근할 수 있다. 즉, super는 상위 클래스를 의미하는 참조변수이다. 상위 클래스의 멤버와 하위 클래스의 멤버 이름이 같을 때, 둘을 구분하기 위해 사용한다.

다음은 super참조변수의 활용을 보여주는 예제이다. 상위, 하위 클래스의 멤버변수 이름이 같아 구분하기 위해 사용했다.

public class Parent {

	int x;
}
public class Child extends Parent {
	
	int x;
	
	public void test1() {
		x = 10;
		System.out.println("x = " + this.x);
	}

	public void test2() {
		super.x = 20;
		System.out.println("x = " + super.x);
	}
}
public class SueprApp {

	public static void main(String[] args) {
		
		Parent parent = new Parent();
		Child child = new Child();
		
		child.test1();
		child.test2();
	}
}
출력

x = 10
x = 20

super() 메소드

상위 클래스로부터 상속받을 때, 상위 클래스의 생성자는 상속받을 수 없다. 그래서 super() 메소드를 통해서 상위 클래스의 생성자를 호출한다.
this() 메소드가 생성자에서 해당 클래스 내부의 또 다른 생성자를 호출하기 위해 사용했다. 비슷한 맥락으로 super() 메소드는 하위 클래스의 생성자에서 상위 클래스의 생성자를 호출하기 위해 사용한다.

다음은 상위 클래스의 생성자를 하위 클래스의 생성자에서 사용한 예제이다.

public class Parent {

	int x;
	int y;
    
	public Parent(int x, int y) {
		this.x = x;
		this.y = y;
	}
}
public class Child extends Parent {
	
	int z;

	public Child(int x, int y, int z) {
		super(x, y);
		this.z = z;
	}
}

정리하면 상위클래스의 생성자와 은닉화된(private) 멤버변수는 상속받을 수 없지만, 하위 클래스의 생성자에서 super() 메소드를 통해 상위 클래스의 생성자를 호출할 수 있기 때문에 상위클래스의 은닉화된 멤버변수를 초기화 할 수 있다.
또한 super()라는 코드는 개발자가 직접 넣지 않아도 컴파일러가 자동으로 추가한다.

profile
차선이 모여 최선이 된다.

0개의 댓글