안녕하세요! 쏘코입니다.

 

이번 포스팅에서는 this와 super의 개념, 그리고 생성자의 상속에 대해 알아보도록 하겠습니다!

 

목차


    0. this & super

    결론을 먼저 말씀드리면 this자기 자, super부모를 나타냅니다.

     

    이전 포스팅의 Cal3의 sum을 개선해봅시다.

     

    기존 Cal3

     

    우리는 "Cal3!!"만 추가로 출력되도록 하고 싶습니다.

    그러면 System.out.println("Cal3!!"); 을 작성하고 그 뒤로는 Cal의 sum메소드를 그대로 가져오면 되겠죠?

     

    지금은 간단하지만, Cal의 sum이 엄청나게 복잡하다면 그 내용들을 전부 Cal3에 복사하기에는 무리가 따를 수도 있습니다.

    그걸 어느 세월에 다 치고 있나요..

    이럴 때 부모 클래스의 나머지 요소들을 그대로 사용한다는 의미로 super.sum(v1, v2); 를 retrun값으로 넣어줍니다.

    이 말은 "Cal3!!"을 출력하고 나서 반환하는 리턴값은 부모 클래스의 Cal의 sum을 그대로 사용한다는 이야기가 됩니다.

    super부모 클래스를 의미하는 것과 같겠죠?

     

     

    이번엔 오버로딩한 sum을 수정해보겠습니다.

    3개의 매개변수를 더하는 sum의 경우 2개의 매개변수를 더하는 sum에다가 v3를 추가로 더해주면 됩니다.

    만약 2개의 매개변수를 더하는 첫 번째 sum을 사용하고 싶다면

    자신 클래스를 의미하는 this를 붙여서 this.sum(v1, v2)에다가 v3를 더해준 값을 리턴값으로 넣어주면 되겠죠?!

     

    class Cal{
    	public int sum(int v1, int v2) {
    		return v1+v2;
    	}
    	public int sum(int v1, int v2, int v3) { // 오버로딩 (Overloading)
    		return this.sum(v1, v2)+v3;
    	}
    }
    
    class Cal2{
    	public int sum(int v1, int v2) {
    		return v1+v2;
    	}
    	public int minus(int v1, int v2) {
    		return v1-v2;
    	}
    }
    
    class Cal3 extends Cal{ // Cal 클래스를 확장한다
    	public int sum(int v1, int v2) { // 덮어쓰기 (Overriding) - v1: 2, v2: 1
    		System.out.println("Cal3!!");
    		return super.sum(v1, v2);
    	}
    	public int minus(int v1, int v2) { // 추가하기
    		return v1-v2;
    	}
    }
    
    public class InheritanceApp {
    
    	public static void main(String[] args) {
    		
    		Cal c = new Cal();
    		System.out.println(c.sum(2, 1)); // 3
    		System.out.println(c.sum(2, 1, 1)); // 4
    		
    		Cal3 c3 = new Cal3();
    		System.out.println(c3.sum(2, 1)); // "Cal3!!" 3
    		System.out.println(c3.minus(2, 1)); // 1
    	}
    
    }

     


    1. 상속과 생성자

    InheritanceApp.java의 내용을 싹 다 지워줍니다.

    저는 편의상 InheritanceApp2라는 클래스를 새로 만들도록 하겠습니다. (여러분도 새로 만드셔도 괜찮습니다!)

    대신 새로 만드시는 경우 기존의 Cal, Cal3의 이름은 바꿔주셔야 합니다.

     

    이번엔 생성자를 이용하기 위해서 인스턴스를 만들어보도록 하겠습니다.

    2와 1이라는 매개변수를 가진 Cal 클래스의 인스턴스 c를 만들어줍니다.

    그리고 Cal에 int형 변수 v1, v2를 만들고 생성자로 받아온 2개의 값을 각각 v1과 v2에 넣어줍니다.

     

     

    그런데 Cal3가 난리를 치네요.

    오류가 뭔지 확인해보니 기본 생성자가 없다고 합니다.

     

     

    이 오류는 만약 Cal3이 Cal을 계승한 경우

    자바가 Cal(부모 클래스)의 생성자를 Cal3(자식 클래스)가 불러오도록 강제하고 있기 때문입니다.

    자식 클래스의 생성자에서 부모 클래스의 생성자를 불러오면 오류가 사라집니다!

     

    c를 생성할 때 "Cal init!!"가 한번 출력되고,

    c3를 생성할 때 super(v1, v2)에 의해서 "Cal init!!"가 출력되고, "Cal3 init!!"가 추가로 출력되겠죠?!

     

     

    생성자를 상속하는 방법을 배웠으니, 지금까지 배운 내용을 종합해서 기존에 있던 기능들을 전부 복구해놓는 것으로 마무리하도록 하겠습니다.

     

    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); // 부모 클래스의 생성자 - 반드시 호출해야 한다!
    		System.out.println("Cal3 init!!"); // 추가하고 싶은 작업
    	}
    	public int minus() {return this.v1-v2;}
    }
    
    public class InheritanceApp2 {
    
    	public static void main(String[] args) {
    		
    		Cal c = new Cal(2,1);
    		Cal3 c3 = new Cal3(2,1);
    		System.out.println(c3.sum()); // 3
    		System.out.println(c3.minus()); // 1
    
    	}
    
    }

     


    여기까지 공부하셨다면 자바의 기본은 모두 배우신 것이라고 볼 수 있습니다.

     

    여기서 더 공부하신다면!!

     

    자식 클래스를 부모 클래스로서 동작하게 하는 다형성(Polymorphism),

    이전 포스팅에서 간단하게 넘어갔던 접근 권한을 다루는 접근 제어자(Access Modifiers),

    더이상 오버라이딩 하지 못하게 하거나 변수를 수정할 수 없게 만드는 Final 명령어,

    반대로 클래스를 상속해서 사용하려는 사용자에게 특정 메소드는 꼭 구현하도록 강요하는 Abstract 명령어,

    이전 포스팅에서도 종종 보였던 예외사항을 처리하는 예외 처리

     

    와 같은 것들을 공부하시면 될 것 같습니다.

     

    그렇다면 다른 주제로 다시 돌아오도록 하겠습니다!

    오늘도 읽어주셔서 감사합니다 :)

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기