본문 바로가기

프로그래밍 언어/Java

Week5) Java Programming Lab : Inheritance

Java-Lecture5.pdf
1.44MB

1. What is Inheritance?

  • 소프트웨어 재사용 형태
  • 객체지향 프로그래밍의 주요 특성
  • 기존의 클래스로부터 새로운 클래스를 만드는 것 : 기존의 클래스 데이터와 메소드를 그대로 흡수하고, 수정이나 새로운 메소드 또는 데이터 등을 추가하여 향상 시킴 
  • 중복 코드를 제거하기 위해 사용함  No redundant code 
  • general class -> special case class 
class Animal: 
// general class - general features 
	move
    legs
    speed
    feed
    
class Dog:
// special class, inherits Animal class features
	fetch 
    ...

2. Subclass and Superclass

자바는 다중상속을 허용하지 않음 (vs. C++은 가능)

Subclass (Child, derived class)

  • 한 객체 그룹의 특정한 클래스
  • superclass로부터 데이터와 메소드를 상속
  • 메소드를 추가하거나 수정 가능 = override

Superclass (Parent, base class)

  • 한 객체 그룹의 대표가 되는 클래스
  • 서브클래스에 데이터와 메소드를 제공
  • direct or indirect

class hierarchy

  • superclass는 공통적, 일반적인 특징을 가지도록 디자인
  • subclass는 특정한 특징을 가지도록 디자인 

  • 각 클래스의 특별한 속성은 area 구하는 공식이 모두 다르기 때문에 각 클래스가 그렇게 각자만 가지고 있는 특징을 가지고 있어야 함 

Object class 

  • java.lang
  • 자바 클래스 계층의 최상위
  • 모든 자바 클래스들이 상속하는 최상위 클래스로 
  • .toString(), .clone(), .equals() 등을 자동으로 상속 
// 하나의 파일에 여러 클래스를 선언하는건 권장하지 않음. 

public class TwoDShape{
	// parent = java.lang.object
}

class TestShape {
	/* public 불가능 - 이 파일 외부에서 접근 불가 */
    public static void main(String[] args) {
    	TwoDShape object1 = new TwoDShape();
        object1.toString();
    }
}

3. Is-a vs. has-a relationships

public class ClassName extends SuperClass{
	...
}

ex)
public class Dog extends Animal{
	...
}
  • superclass에서 상속받은 메소드를 수정하는 것 = override
  • 새로운 메소드 추가 가능 
클래스 변수는 private으로 하고, public get, set 메소드를 선언해서 직접 접근하지 못하도록 하는 것 권장 

Is-a

  • 상속을 나타내는 표현 
  • subclass is a superclass
  • extends, implements

Has-a

  • 조합을 나타내는 표현 Composition 
  • 객체는 하나 이상의 객체나 다른 클래스를 멤버로 가지고 있음
  • ex) Car has 4 Steering Wheels 

요구사항 정의는 인간의 언어로 표현되기 때문에 그것을 해석해서 프로그래밍하기 위해서 다음과 같은 관계를 정의할 수 있어야 함. 

4. Strategy for coding with inheritance

  • 공통 특징을 superclass에
  • 특별한 특징을 subclass에 
  • public 멤버는 모두 subclass에서 상속받아 사용 가능
  • private 멤버, constructor은 subclass에서 사용 불가능
  • static 메소드은 경우 상속되지만 override (수정) 할 수 없음 

5. Protected members

  • protected 멤버는 서브클래스에서 상속, 오버라이드 가능 
  • public - private의 중간 단계 키워드 
  • superclass, subclass, 같은 패키지의 클래스들에서 접근 가능
  • super. : 서브 클래스 메소드에 의해 오버라이드되는 수퍼클래스 메소드에 접근하기 위해 사용 
  • protect 인스턴스 변수 사용하는것 권장되지 않음 
  • 외부 패키지에 있는 클래스 상속하고 싶으면 extends ExternalPackageName.SuperClass 로 상속 가능  
public class TwoDShape{
	// parent = java.lang.object
    protected String Name;
    private String Color;
    private double dimension1;
    private double dimension2;
    
    // constructor
    public TwoDShape(String name, String color, double dimension1, double dimension2) {
    	Name = name;
        Color = color;
        this.dimension1 = dimension1;
        this.dimension2 = dimension2;
    }
    
    // set. get methods
    ...
    
    public String toString() {
    	return "Base class to string";
    }
    
    
}

class Circle extends TwoDShape {

	// 위와 같이 디폴트가 아닌 constructor를 선언한 경우 
    public Circle(String name, String color, double dimension1, double dimension2) {
    	// 이렇게 필요한 인자를 다 전달해서 초기화해주어야 함 
    	super(name, color, dimension1, dimension2);
    }
    
    public double getArea() {
    	// dimension 변수들은 private이기 때문에 get 메소드로만 접근 가능 
    	return Math.PI * getDimension1() * getDimension2();
    }
    
    // override
    public String toString() {
    	return "subclass class to string calling " + super.toString();
        // >> subclass to class to string calling base class to string 
    }

}

class TestShape {
    public static void main(String[] args) {
    	
        Circle object = new Circle("Circle", "red", 5);
        // object는 TwoDShape, Circle의 모든 변수와 메소드 사용 가능 
        System.out.println(object.getName());
        System.out.println(object.getColor());
        System.out.println(object.getArea());
        
        // protected 키워드를 쓰면 직접 수정 가능 
        object.Name = "New Circle";
        System.out.println(object.getName());
    }
}

6. Constructors in subclasses

  • constructor는 상속 불가
  • super()로 호출 가능 
  • 모든 인스턴스 변수는 상속 가능하지만 private 변수는 직접 접근이 불가능 (get, set으로만!) 

7. Full example with inheritance 

Lecture5-codes.zip
0.00MB


References

  • 성균관대학교 소프트웨어학과 타메르 교수님 2021-1 <자바 프로그래밍 실습>