JAVA

[JAVA] 상속

개발로 먹고 살자 2022. 1. 4. 16:37

자바에는 상속이라는 개념이 존재한다.

 

부모 클래스와 자식 클래스가 존재하며 자식 클래스는 부모 클래스를 상속 받을 수 있다.

상속을 받는다는 의미는 자식 클래스에서 부모 클래스의 멤버 필드를 그대로 사용할 수 있다는 뜻이다.

 

각각의 자식 클래스에서 계속 멤버 필드를 생성하는 것이 아니라 부모 클래스에서 상속 받아 사용하기 때문에 효율적이며 개발 시간을 줄여준다.

 

public class Person { // 부모
	String name;
	String age;
}

public class User1 extends Person{ // 자식

	public User1(String name, String age) {
		this.name = name;
		this.age = age;
	}
}

public class Test {

	public static void main(String[] args) {	
		User1 user1 = new User1("홍길동", "25"); // 명시적 선언
		System.out.println(user1.name);
		System.out.println(user1.age);
	}
}

User1에서 따로 변수를 선언하지 않았음에도 불구하고 main에서 User1 객체를 생성하여

name과 age라는 변수를 사용할 수 있는데 그 이유는 User1이 Person을 상속받았기 때문이다.

 

코드에서는 부모 객체를 따로 생성하는 부분이 없지만 자바에서는 자식 객체를 생성하면

내부적으로 부모 객체가 생성이 된 후, 자식 객체가 생성이 된다.

main에서 User1이라는 객체를 생성하기전에 Person이라는 객체가 내부적으로 먼저 생성이 되는 것이다.

 

객체는 User1 user1 = new User1(); 와 같은 생성자를 호출해야만 생성이 되는데

부모 객체를 생성할 때 부모 생성자를 어디서 호출하는 것일까?

 

우선적으로 명시적으로 생성자를 선언해주지 않는다면 컴파일러가 자동적으로 기본 생성자를 생성하여 호출한다.

위 코드와 같이 부모 클래스는 명시적 생성자가 존재하지 않고, 자식 클래스에는 존재한다면

자식 클래스 생성자 선언 내부 첫 줄에 super();로 생성이 된다.

super();는 부모 클래스의 기본 생성자를 컴파일러가 호출하는 것이다.

super()가 생성이 되기 때문에 자식 클래스는 부모 클래스의 멤버 필드를 그대로 사용할 수 있는 것이다.

 

 

여기서 부모의 명시적 생성자가 있는 경우라면 어떻게 작성해야 할까?

public class Person { // 부모
	String name;
	String age;
	
	public Person(String name, String age) {
		this.name = name;
		this.age = age;
	}
}

public class User1 extends Person{ // 자식

	public User1(String name, String age) {
		super(name, age);
	}
}

public class Test {

	public static void main(String[] args) {	
		User1 user1 = new User1("홍길동", "25");
		System.out.println(user1.name);
		System.out.println(user1.age);
	}
}

컴파일러가 기본 생성자만 자동으로 호출하기 때문에 명시적 생성자의 경우

직접적으로 자식 클래스에서 super();를 통해 선언을 해주어야 한다.

반드시 생성자 내부 첫 줄에 해주어야 한다.

 

 

'JAVA' 카테고리의 다른 글

[JAVA] 정적 변수, 정적 메소드(Static)  (0) 2022.01.05
[JAVA] 접근제어자  (0) 2022.01.04
[JAVA] 오버로딩과 오버라이딩  (0) 2022.01.04
[JAVA] 생성자  (0) 2022.01.04
[JAVA] List와 ArrayList  (0) 2022.01.04