상속이란? : 부모클래스의 필드와 메서드를 받게된다는것
상속 코드
class 자식클래스 extends 부모클래스
Overriding vs Overloading
Overriding : 부모 클래스의 기능을 재정의
Overloading : 클래스에 같은 이름의 메서드를 복수로 탑재
Overriding예제
public static void main(String[] args) {
Cal3 c3 = new Cal3();
System.out.println(c3.sum(2,1));
}
class Cal{
public int sum(int v1, int v2){
return v1+v2;
}}
class Cal3 extends Cal{
public int sum(int v1, int v2){
System.out.println("Cal3!!");
return v1+v2;
}}
Cal3 클래스는 Cal클래스의 자식클래스이다(상속)
부모클래스와 자식 클래스에 sum이라는 메소드가 중복되어 있지만 Overriding때문에 자식클래스에 있는 sum이 실행된다
출력값 : Cal3!!
3
Overloading예제
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)); }
class Cal{
public int sum(int v1, int v2){
return v1+v2;
}
// Overloading
public int sum(int v1, int v2, int v3){
return v1+v2+v3;
}
}
Cal클래스에는 sum메소드가 2개가 존재한다.
하지만 받는 파라미터 개수가 다른데 이때 주는 파라미터 개수에 따라 c.sum(2,1)은 public int sum(int v1, int v2)
c.sum(2,1,1)은 public int sum(int v1, int v2, int v3) 메서드가 실행되어 결과값이 다르게 나온다
이처럼 클래스에 같은 이름의 메서드가 존재하는 것을 오버로딩이라고 한다
this vs super
this : 자기 자신의 인스턴스
super : 자신의 부모
this예제
public static void main(String[] args) {
Cal c = new Cal();
System.out.println(c.sum(2,1,1)); }
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; //this 사용 //1
}
}
this는 자기 자신의 인스턴스를 의미한다
즉 //1에서 this.sum은 위에있는 sum메서드를 의미하여 위에 메서드가 실행된다!!
super예제
public static void main(String[] args) {
Cal3 c3 = new Cal3();
System.out.println(c3.sum(2,1));
}
class Cal{
public int sum(int v1, int v2){
return v1+v2;
}}
class Cal3 extends Cal{
public int sum(int v1, int v2){
System.out.println("Cal3!!");
return super.sum(v1,v2); //1
}
}
Cal3는 Cal의 부모클래스이다.
//1 과 같이 super.sum(v1,v2)를 해주면 부모클래스의 sum으로 계산이되며
super가 없으면 자기자신(Cal3.sum())을 호출한다!!! (무한재귀)
상속의 생성자
만약에 부모 클래스에 생성자가 있다면 자식 클래스에도 해당 부모 클래스의 생성자를 나타내야한다
그렇지 않으면 there is no default constructor available in 오류가 뜬다
예제
class Cal {
int v1,v2;
Cal(int v1, int v2){ //생성자
System.out.println("Cal init");
this.v1 = v1;
this.v2 = v2;
}
}
Cal이라는 부모클래스에 생성자를 만들었다
// 부모에 생성자가 있으면 자식은 부모의 생성자를 써야한다
class Cal3 extends Cal{
Cal3(int v1,int v2) {
super(v1,v2); // 부모클래스의 Cal(int v1,intv2)를 의미한다
System.out.println("Cal3 init");
}
}
부모클래스에 생성자가 있다면 자식클래스에도 부모클래스의 생성자를 사용해야한다
super(v1,v2)
public class inferitance {
public static void main(String[] args) {
Cal c = new Cal(2,1);
Cal3 c3 = new Cal3(2,1);
}
}
그런다음 다음을 출력해보면
우선
new Cal(2,1)에서 Cal의 생성자를 호출해 Cal init이 호출되고
new Cal3(2,1)에서 Cal3의 생성자를 호출하는데 자식클래스는 부모클래스의 생성자를 호출하니까
Cal init이 호출되고 Cal3 init이 호출된다
깃허브
https://github.com/developer-hyun/JAVA
'IT 관련 > JAVA' 카테고리의 다른 글
Java의 변수 (0) | 2022.04.17 |
---|---|
자바(JAVA)란? (0) | 2022.04.08 |
자바 객체지향 프로그래밍(클래스,인스턴스,static,생성자와this) (0) | 2022.03.29 |
자바의 static이란? (0) | 2022.03.25 |
자바 public ,protected , default, private (0) | 2022.03.25 |