출처: 생활코딩 JAVA 상속
상속
상속을 이용하면 기존의 클래스를 수정하지 않고도, 유지보수가 쉬운 클래스를 만들 수 있음
재사용성 유지보수편의성 가독성 코드의양감소
caculateApp.java
class Cal {
public int sum(int v1, int v2) {
return v1 + v2;
}
}
class Cal3 extends Cal{ // Cal을 상속받은 Cal3
}
public class calculate {
public static void main(String[] args) {
Cal c = new Cal();
System.out.println(c.sum(2,1));
Cal3 c3 = new Cal3();
System.out.println(c3.sum(2,1));
}
}
기능의 개선과 발전
Overriding, 상속이 존재하는 근본적인 원인 중 하나
class Cal {
public int sum(int v1, int v2) {
return v1 + v2;
}
}
class Cal3 extends Cal{ // Cal을 상속받은 Cal3
// 부모가 갖고있지 않은 메소드를 추가
public int minus(int v1, int v2) {
return v1 - v2;
}
// Overriding, 부모가 갖고있는 메소드를 재정의(덮어쓰기)
public int sum(int v1, int v2) {
System.out.println("Cal3!!");
return v1 + v2;
}
}
public class calculate {
public static void main(String[] args) {
Cal c = new Cal();
System.out.println(c.sum(2,1)); // 3
Cal3 c3 = new Cal3();
System.out.println(c3.sum(2,1)); // Cal3!! 3 , 재정의된 채로 출력
System.out.println(c3.minus(2,1)); // 1
System.out.println(c3.sum(2, 1)); // Cal3!! 3, 재정의된 채로 출력
}
}
Overriding vs Overloading
class Cal {
public int sum(int v1, int v2) {
return v1 + v2;
}
// Overloading, 자바는 같은 이름의 메소드를 여러개를 과적할 수 있다. 어떻게? 형태만 다르게!
// v3 추가
public int sum(int v1, int v2, int v3) {
return v1 + v2 + v3;
}
}
class Cal3 extends Cal{ // Cal을 상속받은 Cal3
public int minus(int v1, int v2) {
return v1 - v2;
}
public int sum(int v1, int v2) {
System.out.println("Cal3!!");
return v1 + v2;
}
// 자식클래스에서 Overloading될 경우, 부모클래스가 가지고 있지 않은 기능을 추가하면서 부모클래스가 가지고 있는 클래스 중에 이름이 같은 것과 함께 공존
// public int sum(int v1, int v2, int v3) {
// return v1 + v2 + v3;
// }
}
public class calculate {
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));
}
}
this & super
자기자신을 의미하는 this와 부모를 의미하는 super 키워드를 통해서 원하는 대상을 정확하게 지정하는 방법
class Cal {
public int sum(int v1, int v2) {
return v1 + v2;
}
public int sum(int v1, int v2, int v3) {
return this.sum(v1,v2) + v3; // this는 자기 자신을 가리킴
}
}
class Cal3 extends Cal{
public int minus(int v1, int v2) {
return v1 - v2;
}
public int sum(int v1, int v2) {
System.out.println("Cal3!!");
return super.sum(v1,v2); // 부모(super) 클래스의 sum을 호출
}
}
public class calculate {
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 Cal {
int v1,v2;
Cal(int v1, int v2) { // 생성자로 int v1, int v2 넣어줌
System.out.println("Cal init!!");
this.v1 = v1; this.v2 = v2; // 매개변수로 들어온 값을 this를 통해 자기자신의 v1, v2 에 넣어줌
}
public int sum() {return this.v1+v2;}
앞으로..
}
// 상속받은 클래스의 부모가 생성자가 있다면 자식은 반드시 부모 생성자를 실행 시키도록 강제하고 있다!
class Cal3 extends Cal{
Cal3(int v1, int v2) {
// super는 부모클래스의 생성자 // 생성자를 만들어서 부모 클래스를 반드시 호출해야된다
super(v1, v2); // Cal init!! 출력 (부모클래스 호출)
System.out.println("Cal3 init!!");
}
public int minus() {return this.v1-v2;}
}
public class calculate {
public static void main(String[] args) {
Cal c = new Cal(2,1); // 입력값 넣어줌
Cal3 c3 = new Cal3(2,1);
System.out.println(c3.sum()); // 3, c3엔 sum이 없으므로 부모 클래스에서 호출
System.out.println(c3.minus()); // 1
}
}
앞으로..
상속을 하면 기능이 급격히 늘어 클래스들간의 호환성이 떨어지게 되고 클래스를 다른 클래스로 교체하는 것이 어려워짐
이런 맥락에서 자식 클래스를 부모 클래스로써 동작하도록 규제하는 테크닉
-> Polymorphism, 다형성
클래스 또는 메소드 그리고 변수를 사용자들이 아무거나 건드리지 못하게 제한하는 기능
-> Access Modifiers, 접근제어자
더이상 상속하지 못하게, 오버라이딩 하지 못하게, 변수 수정을 못하게
-> Final
클래스를 상속해서 사용하려는 사용자에게 어떤 특정한 메소드는 꼭 구현하라고 강제하고싶을 때, 상속자가 직접 구현해야하는 기능을 구현토록 강제할 수 있음
-> Abstract
'Programming > JAVA' 카테고리의 다른 글
생활코딩 JAVA Interface (0) | 2020.07.04 |
---|---|
생활코딩 JAVA OOP (0) | 2020.06.29 |
생활코딩 JAVA - method (0) | 2020.06.27 |
생활코딩 JAVA - 제어문 (0) | 2020.06.21 |
Java 설치 오류 // Error: opening registry key 'Software\JavaSoft\Java Runtime Environment' (0) | 2020.06.03 |
댓글