Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 IT일지

상속 본문

프로그래밍 언어/Java

상속

세레프 2023. 4. 15. 04:55

 클래스객체를 만들기 위한 설계도이며, 해당 객체의 특징을 블록에 변수와 메서드를 통해 표현한다. 그리고 클래스를 통해 객체를 생성하게 되면, 클래스로 구현한 특징들을 객체가 사용할 수 있게 된다. 이때, 같은 특징을 가지는 클래스를 생성하는 경우가 생기게 된다. 이럴 경우에 사용하는 기능이 상속 기능이다.

 

상속

 상속이란 부모클래스(superclass)의 기능을 자식클래스(subclass)가 물려 받는 것으로, 부모클래스에서 작성한 기능을 사용하기 위해서 사용한다.

 즉, 공통적인 특징을 매 객체마다 만드는 것이 아닌 공통적인 특징의 객체를 생성(추상화)하고 사용하기 위해서 상속을 사용한다.

 

 부모 클래스는 자식클래스를 선언할 때, extends를 이용해서 다음과 같은 구조로 선언한다.

  class 클래스명 extends 부모클래스명{

...

}
 
package pack0414;

class Person{
	String name;
	int age;
	void breath() {
		System.out.println("숨쉬기");
	}
	void talk() {
		System.out.println("말하기");
	}
	void greet() {
		System.out.println("인사하기");
	}
}

class Student extends Person{
	void learn() {
		System.out.println("배우기");
	}
}

class Teacher extends Person{
	void teach() {
		System.out.println("가르치기");
	}
}
package pack0414;

public class Code1 {

	public static void main(String[] args) {
		Student student1 = new Student();
		
		student1.breath();
		student1.talk();
		student1.learn();
		
		Teacher teacher1 = new Teacher();
		
		teacher1.breath();
		teacher1.talk();
		teacher1.teach();	
	}
}

 위의 코드는 Student클래스와 Teacher클래스를 생성할 때 Person클래스의 기능을 추가하는 상속기능을 사용하며, 상속으로 인해 Student클래스와 Teacher클래스를 통해 생성한 객체에는 Person클래스의 기능을 사용할 수 있는 것을 확인 할 수 있다.

 

 상속을 사용 사용할 때 다음과 같은 주의사항이 있다.

  • 부모객체의 생성자는 상속되지 않는다.
  • 중복 상속시에 해당 객체에는 중복적인 필드나 메서드가 생성되기에 다중상속은 지원하지 않는다.
  • 클래스 앞 final 키워드를 가진 객체는 다른 클래스에게 상속이 불가하다.

 

메서드 오버라이딩

 부모 클래스의 모든 메서드가 자식 클래스에 맞게 설계되어 있는 경우는 극히 드물다. 그래서 상속된 일부 메서드를 자식 클래스에서 다시 수정해서 사용하게 된다. 이를 오버라이딩이라고 한다.

 

 오버라이딩자식클래스에서 부모클래스로 부터 받아온 메서드를 재정의하는 것으로, 변경할 부모클래스의 메서드를 자식 클래스에서 다시 정의하면 된다.

class Person{
	String name;
	int age;
	void breath() {
		System.out.println("숨쉬기");
	}
	
	void talk() {
		System.out.println("말하기");
	}
	void greet() {
		System.out.println("인사하기");
	}
}

class Student extends Person{
	void learn() {
		System.out.println("배우기");
	}
	void greet() {
		System.out.println("선생님께 인사하기");
	}
}
package pack0414;

public class Code1 {

	public static void main(String[] args) {
		Student student1 = new Student();

		student1.greet();		
	}
}

 이처럼 자식클래스에서 부모클래스의 메서드를 재정의하면, 부모클래스의 메서드의 블록 대신에 재정의된 자식 클래스의 메서드의 블록이 사용된다. 하지만 부모클래스의 메서드의 블록나 필드의 값을 사용해야 하는 경우가 발생한다. 이러한 경우에는 super키워드를 사용해서 부모클래스의 메서드, 필드를 호출해야 한다.

class Person{
	String name;
	int age;
	void breath() {
		System.out.println("숨쉬기");
	}
	
	void talk() {
		System.out.println("말하기");
	}
	void greet() {
		System.out.println("인사하기");
	}
}

class Student extends Person{
	void learn() {
		System.out.println("배우기");
	}
	void greet() {
		System.out.println("선생님께 인사하기");
		super.greet();
	}
}
package pack0414;

public class Code1 {

	public static void main(String[] args) {
		Student student1 = new Student();

		student1.greet();		
	}
}

 

 

super( )메서드

 부모객체의 생성자는 상속되지 않는다. 그래서 자식 객체에서 부모객체의 기능을 사용하기 위해서는 부모객체를 생성해야 한다. 그래서 부모객체를 먼저 생성하고 자식 객체가 생성해야 된다. 그렇다면 부모객체의 생성자는 어디에 있는 것일까? 부모 생성자는 자식생성자의 첫 줄에서 호출되고 있다. 

 일단 자식클래스에서 생성자를 선언하지 않았을 경우에는 컴파일과정에서 기본적으로 자식 기본생성자가 생성이 되며, 자식 기본생성자의 블록에 super()메서드가 추가되어서 부모 기본생성자를 호출한다. 

class A{
	int a;
}

class B extends A{
	int am;
    
	B(){
	super();
	}
}

 위의 클래스 코드는 부모 클래스에서 생성자를 선언하지 않았기에, 기본 생성자가 사용되며, 자식 클래스에서 생성자를 선언할 때 "super()"를 통해 부모클래스의 기본생성자를 호출하는 것을 확인 할 수 있다.

이때, super()메서드부모의 생성자를 호출하는 메서드로, 자식생성자의 첫 줄에 작성해야 한다.

super(부모 생성자 매개값 1, 부모 생성자 매개값 2 ... );

class Car{
	int wheel;
	int speed;
	String color;
	
	Car(){}
	Car(String color){
    	this.color = color;
	}
}

class SportsCar extends Car{
	int speedlimit;
	SportsCar(String color, int speedlimit){
		this.color = color;
		this.speedlimit = speedlimit;
	}	
}
package pack0414;

public class Code2 {

	public static void main(String[] args) {
		SportsCar mysc1 = new SportsCar("red",300);
		System.out.println(mysc1.color);
		System.out.println(mysc1.speedlimit);
	}
}

 위의 코드는 부모 클래스에서 생성자가 선언했을 때, 자식 클래스의 생성자를 생성하는 코드로, 클래스에서 생성자를 선언하게 되면, 기본 생성자는 생성되지 않기 때문에, 기본생성자를 선언해야 한다.

 추가적으로 자식 클래스의 생성자에서는 "super()"메서드가 생략 되었지만 컴파일 과정에서 "super()"가 자동적으로 추가되기 때문에 부모의 기본생성자가 존재하는 것이다.

 

 위의 방법 외에도 부모의 생성자에 있는 매개변수의 갯수와 형태에 따라서 super메서드의 매개값을 추가해서 선언하면 형식이 같은 부모의 생성자를 호출 할 수 있다. 

class Car{
	int wheel;
	int speed;
	String color;
	
	Car(String color){
		this.color = color;
	}
}


class SportsCar extends Car{
	int speedlimit;
	SportsCar(String color, int speedlimit){
		super(color);
		this.speedlimit = speedlimit;
	}
	
}

 위의 코드를 보면 "super(color);"를 통해 "Car(String color)" 생성자를 호출하는 것을 확인 할 수 있다. 즉 부모 클래스에 있는 호출할 생성자의 매개변수의 갯수와 형태에 맞춰서 매개값을 추가해서 "super()"메서드를 호출하면 부모 클래스의 생성자를 호출 할 수 있다.

 

 

'프로그래밍 언어 > Java' 카테고리의 다른 글

추상화  (0) 2023.04.19
다형성  (0) 2023.04.18
생성자  (0) 2023.04.13
객체 배열  (0) 2023.04.11
정적 멤버  (0) 2023.04.08
Comments