[Java] 09. 클래스 상속

PYOUNANI·2022년 10월 10일
0

Java

목록 보기
10/14
post-thumbnail

9. 클래스 상속

9-1. 클래스 상속이란

비슷한 동작을 하는 서로 다른 객체들이 존재할 수 있다. 두가지 방법으로 코드를 짜보는 것을 떠올 수 있을 것이다.

  • 포괄적인 클래스를 구현하여 비슷한 동작을 하지만 서로 다른 객체들을 포함시킬 수 있을 것이다. 하지만 이는 지나친 일반화로 인해 객체들간의 구분이 모호해진다.
  • 다른 방법으로는 독립적인 클래스로 구현해볼 수 있다. 하지만 비슷한 부분들을 중복된 코드로 반복하여 작성하는 문제가 생긴다.

이러한 문제들을 해결하기 위해 독립적으로 클래스로 구현하지만 반복적인 행위를 다시 쓰지 않도록 하게 하기 위한 것이 상속이다.


9-1-1. 객체지향 언어에서의 클래스 상속

특정 클래스가 가지고 있는 속성 행위를 다른 새 클래스에게 제공하기 위해서 관계를 맺게 되는데, 이 특징을 클래스 상속이라고 한다.
새로운 클래스는 이미 존재하는 클래스를 이용한다. 멤버를 그대로 사용 가능하고 새로운 멤버를 추가하는 것도 가능하다.
기존의 코드를 재사용함으로 오류를 최소화할 수 있으며 코드를 재작성할 필요가 없으므로 효율적으로 코드 작성 가능하다. 중요한 다른 이점도 있는데, 공통 규약을 정의할 수 있다.

9-1-2. 상속 조건

IS-A(~중의 하나)관계가 성립할 때 상속 통해 만들 수 있다. 예시를 들면, 대학생 클래스와 학생 클래스가 있다고 하자. 대학생은 학생 중에 하나이다. 그렇다면 대학생 클래스는 학생 클래스으로부터 상속받아 만들 수 있다.

HAS-A(~을 갖는) 회원명부가 학생 관련이 있어 상속 받아 클래스를 만들게 될 수 있다. 하지만 회원명부는 학생 클래스에 포함이 되어 지는 것이기에 멤버 필드에 두는 것이지 상속으로 새로 클래스를 만드는 것이 아니다.

9-1-3. 자바에서의 클래스 상속

보통 따로 상속을 지정하지 않고 클래스를 정의를 했을 때 object 클래스로부터 파생된 클래스이다.
자바에서는 단일 상속만 제공한다. C++에서는 다중 상속이 가능한다. 자바에서는 이 다중 상속에 대한 개념을 위해 추가로 interface 제공하고 있다. 이 개념은 이후에 배워볼 것이다.

9-1-4. Super 클래스 vs Sub 클래스

상위 클래스(부모 클래스, super 클래스)들로부터 상속 받아서 하위 클래스(자식 클래스,sub 클래스)를 만들어내는 것이다.
언어들마다 부모 클래스와 자식 클래스를 주로 부르는 명칭에 차이가 있다.


person 클래스으로부터 상속 받아 대학생 클래스가 있다. 대학생 클래스는 상속을 받았기에 person 클래스에 있는 속성들에다가 고유 속성인 전공을 추가를 한 상태이다.

9-1-5. 상속 지정하는 방법

class <subcClassName> extends <superClassName>{
	// sub 클래스에서 추가될 멤버 선언
}
  • Sub 클래스의 객체는 super 클래스에서 상속받은 멤버들과 sub 클래스에 추가된 멤버들을 모두 자신의 멤버처럼 사용 가능
  • 부모 클래스의 private 멤버도 상속은 가능하나 직접 참조는 불가능하다. 부모 클래스의 access 메서드를 이용하여 접근해야한다.
  • protected 멤버는 같은 패키지는 허용하고 다른 패키지에서는 상속된 클래스에서만 허용한다.

실습 예제

package ex.basic;

public class Person{
	
    int age;
    String name;
    
    void WhatYourName(){
    	System.out.println(name);
    }
    
    void HowOldAreYou(){
    	System.out.println(age + "세");
    }
}
package ex.basic;

public class UnivStudent extends Person{

	String major;
    
    void WhoAreYou(){
    	this.WhatYourName();
        HowOldAreYou();
        
        System.out.println(this.major + "전공");
    }
}
package ex.basic;

public class StudentTest{
	public static void main(String[] args){
    
    	UnivStudent s = new UnivStudent();
        s.age = 20;
        s.name = "홍길동";
        s.major = "컴퓨터공학";
        
        s.WhoAreYou();
    }
}

9. 클래스 상속

9-2. 메서드 오버라이딩


9-2-1. 메서드 오버라이딩

Sub 클래스에서 super 클래스에서와 같은 이름의 멤버를 다시 정의하는 것이 메서드 오버라이딩이다. 이 과정에서 Super 클래스에서 상속된 멤버는 은폐된다. 이 은폐된 멤버에 접근하기 위해서는 super 참조변수 이용한다.
추가로 앞서서 배운 오버로딩하고는 다르다.

package ex.overriding;

public class Person{
	
    protected int age;
    protected String name;
    
    public void WhatYourName(){
    	System.out.println(name);
    }
    
    public void HowOldAreYou(){
    	System.out.println(age + "세");
    }
    
    public void WhoAreYou(){
    	WhatYourName();
        HowOldAreYou();
    }
}
package ex.overriding;

public class UnivStudent extends Person{

	protected String major;
    
    public void WhoAreYou(){             //메서드 오버로딩
  		super.WhoAreYou();
    	System.out.println(this.major + "전공");
    }
}
package ex.overriding;

public class StudentTest{
	public static void main(String[] args){
    
    	UnivStudent s = new UnivStudent();
        s.age = 20;
        s.name = "홍길동";
        s.major = "컴퓨터공학";
        
        s.WhoAreYou();
    }
}

9-2-2. java.lang.Object

특별히 상속관계를 명시하지 않았을 때 기본적으로 Object로부터 상속된다.
object 클래스의 메서드 중 재정의하면 좋은 toString()을 가지고 코드를 작성해보자.

package ex.overriding;

public class Person{
	
    protected int age;
    protected String name;
    
    public void WhatYourName(){
    	System.out.println(name);
    }
    
    public void HowOldAreYou(){
    	System.out.println(age + "세");
    }
    
    public void WhoAreYou(){
    	WhatYourName();
        HowOldAreYou();
    }
    
    @Override //재정의이다 알려주는 확인 컴파일 타임 때
    public String toString(){
    	return name + "(" + age + "세)";
    }
}
package ex.overriding;

public class UnivStudent extends Person{

	protected String major;
    
    public void WhoAreYou(){     //메서드 오버로딩
  		super.WhoAreYou();
    	System.out.println(this.major + "전공");
    }
    
     @Override //컴파일 타임 때 재정의임을 확인해줌
    public String toString(){
    	return super.toString() + " " + major + "전공 대학생";
    }
}
package ex.overriding;

public class StudentTest{
	public static void main(String[] args){
    
    	UnivStudent s = new UnivStudent();
        s.age = 20;
        s.name = "홍길동";
        s.major = "컴퓨터공학전공";
        
        System.out.println(s);
        System.out.println(s.toString());   //홍길동(20세) 컴퓨터공학전공 대학생
    }
}

0개의 댓글