221215 상속

kangjuju·2022년 12월 15일
0

자바자습

목록 보기
3/3

어떤 클래스가 있을 때 클래스가 가지고 있는 변수와 메소드를 확장(상속)해서 다른 클래스가 갖도록 해서 재사용성, 유지 보수의 편의성, 가독성을 높이고 코드의 양을 줄이는 목적 달성

class Cal{
    public int sum(int v1, int v2){
        return v1+v2;
    }
    
    public int sum(int v1, int v2, int v3){  //<<<<< Overloading
        return v1+v2+v3;
    }
}
class Cal3 extends Cal{
    public int minus(int v1, int v2){
        return v1-v2;
    }

    public int sum(int v1, int v2){     // <<<<<Overriding
        System.out.println("Cal3!!");
        return v1+v2;
    }
 
}
public class InheritanceApp {
    public static void main(String[] args) {
        Cal c = new Cal();
        System.out.println(c.sum(2,1));
        System.out.println(c.sum(2,1,1));
 
        Cal3 c3 = new Cal3();
        System.out.println(c3.sum(2,1));
        System.out.println(c3.minus(2,1));
        System.out.println(c3.sum(2,1));
    }
}
class Cal2{
    public int sum(int v1, int v2){
        return v1+v2;
    }
    public int minus(int v1, int v2){
        return v1-v2;
    }
}

오버라이딩

부모 클래스에 있었던 메소드를 자식 클래스에서 재정의(덮어쓰기)하면서 코드 변경 가능

오버로딩

이름은 같지만 형태 및 내용이 다른 메소드가 존재할수있다.어떤메소드의 기능을 추가과적 하는것 ,정의 되는 위치가 부모 또는 자식 어느 쪽에서 구현을 하던 상관이 없기때문에 상속과는 관련이없는 기능임

this , super

this: 자신 클래스 내의 메서드, 필드를 지칭할 때 사용

class Cal{
    public int sum(int v1, int v2){
        return v1+v2;
    }
    // Overloading
    public int sum(int v1, int v2, int v3){
        return this.sum(v1,v2)+v3; 
        // 당연히 본인의 sum을 호출하겠지만, 명시적으로 this를 작성하는것이 좋음
    }
}

super: 부모 클래스 내의 메서드, 필드를 지칭할 때 사용

class Cal3 extends Cal{
    public int minus(int v1, int v2){
        return v1-v2;
    }
    // Overriding
    public int sum(int v1, int v2){
        System.out.println("Cal3!!");
        return super.sum(v1,v2);  //sum연산은 Cal의 sum연산을 가져옴
    }

}

상속과 생성자

class Cal{
    int v1,v2;
    Cal(int v1,int v2){
		System.out.println("Cal init!");
    	this.v1 = v1; this.v2 = v2;
    } 
    public int sum() {return this.v1+v2;}
}
class Cal3 extends Cal{

	Cal3(int v1, int v2) {
		super(v1, v2);                                //부모클래스의 생성자인 Cal메소드를 실행. 이 구문은 필수임
		System.out.println("Cal3 init!");
	}
	 public int minus() {return this.v1-v2;}
}
public class InheritanceApp {
    public static void main(String[] args) {
        Cal c = new Cal(2,1);                       //Cal의 생성자 실행. 출력 : Cal init!
        Cal3 c3 = new Cal3(2,2);                 //Cal3 실행.먼저 super문으로 부모의 Cal init! 출력 후 Cal3 init!출력
		System.out.println(c3.sum());         //cal3는 sum이 없으니 부모클래스의 sum실행
		System.out.println(c3.minus());      //cal3의 minus실행
    }
}

생성자가 있는 부모 클래스를 상속받으려면 생성자도 함께 상속 받아야 한다.

Cal3(int v1, int v2) {
super(v1, v2); }

이때는 this가 아닌, super를 써서 부모 클래스의 생성자임을 명확하게 하고, 부모에게서 상속받은 생성자임을 명시한다

생성자는 이전에도 배운 개념이지만, 초기화 하는 준비과정에서 일련의 과정들을 강제화시켜 사람들이 프로그래밍을 조금더 개발자의 의도에 맞게 쉽게 따라갈 수 있도록 하는것이다. (특정값을 집어넣어야만 작동되게 한다던지)

상속에서도 생성자까지 상속하게 된다면 확장된 클래스에서도 초기에 세팅된 값을 쓰게 되므로 불필요한 사용자의 탐구가 줄어들게 되며, 상속된 클래스까지 그 값을 사용하게 되므로 효율성과 재확장성이 늘어남을 알 수 있다

숙제

상속을 하면 기능이 급격하게 늘어남

  • 그렇게 되면 클래스들 간의 호환성이 떨어지게 되고 클래스를 다른 클래스로 교체하는 것이 어려워짐
  • 이런 맥락에서 자식 클래스, 부모 클래스로서 동작하도록 규제하는 것이 다형성(polymorphism)

접근 제어자(Access modifiers)

  • public, default, protected, private
  • 클래스, 메소드, 변수를 사용자들이 아무거나 건드리지 못하게 제한하는 기능

final

  • 클래스를 상속하지 못 하게 하거나 메소드를 오버라이딩 하지 못 하게 하거나 변수를 마음대로 수정하지 못 하게 하는 규제

abstract

  • 클래스를 상속해서 사용하려는 사용자에게 어떤 특정한 메소드는 꼭 구현하라고 강제
  • 상속자가 직접 구현해야 하는 기능을 구현하도록 강제

0개의 댓글