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

 

앞으로 2개의 포스팅을 통해 자바의 상속에 대해 알아보도록 하겠습니다!

 

목차


    0. 상속의 기본

    ProjectInherience라는 프로젝트 폴더를 만들고, 그 안에 InheritanceApp을 만들어줍니다.

    그리고 Cal이라는 간단한 계산기 클래스를 만들어주겠습니다.

    sum이라는 덧셈 기능을 하는 메소드를 만들었습니다.

     

     

    Cal을 직접 변경할 수 없는 상황이 되었다고 가정합시다.

    그런데 우리는 덧셈 메소드의 기능을 바꾸고 싶어요.

    그렇다면 우리는 어떻게 해야할까요?

    새로운 클래스를 만들어서 기존 기능을 그대로 복사하고 추가하고 싶은 기능을 더 넣어줄 수 있을 것입니다.

     

     

    하지만 이 방법의 단점은 sum이라는 메소드가 두 번 선언되었다는 것입니다.

    그만큼 메모리도 더 많이 필요하고, 어떤 메소드가 같은 기능을 하고 어떤 메소드가 다른 기능을 하는지 정확하게 파악하기가 어려워집니다.

    지금은 코드가 몇 줄 되지 않기 때문에 두 sum이 같은 코드라는 것을 쉽게 파악할 수 있지만 메소드가 1억 개 있다고 생각해보세요.

    sum 2개가 같은 코드라는 것을 파악하는 것은 불가능에 가까울 것입니다.

     

    이럴 때 필요한 것이 바로 상속입니다.

    Cal3 클래스를 만듭니다.

    그리고 extends Cal을 뒤에 붙여서 Cal 클래스를 상속합니다.

    이렇게 되면 Cal3라는 클래스는 Cal 클래스의 내용을 따로 복사하지 않고도 그대로 사용할 수 있게 됩니다.

     

    실제로 main함수 내에서 Cal3 형태의 c3이라는 이름의 인스턴스를 만들어서 sum() 메소드를 사용해봅시다.

    그러면 정상적으로 사용할 수 있습니다!

     

     

    상속어떤 클래스가 가지고 있는 변수와 메소드를 다른 클래스가 갖도록 하면서

    재사용성을 높이고 유지보수의 편의성을 높이고 가독성을 높이고 코드 양을 줄일 수 있게 됩니다.


    1. 기능의 개선과 발전

    하지만 위에서 만든 Cal3는 아무 쓸모 없는 코드입니다.

    단순히 Cal과 같은 변수와 메소드를 가지고 있기 때문이죠.

    (Cal이 있는데 같은 일을 하는 Cal3이 존재할 이유는 없죠!)

     

    우리의 관심사는 "자식 클래스가 부모 클래스가 가지고 있지 않은 새로운 기능을 추가할 것인가" 또는 "부모 클래스가 가지고 있는 기능을 덮어쓰기 할 것인가"가 됩니다.

     

    상속을 받았는데 부모 클래스에 없는 내용은 당연히 자식 클래스에서 새롭게 정의해야겠죠?

    minus 메소드를 정의해줍니다.

     

    그런데 부모 클래스의 sum 메소드를 수정하고 싶다면, 자식 클래스에서 다시 선언하면서 덮어쓸 수 있습니다.

    이것을 원래 메소드에 올라탄다고 해서 오버라이딩(Overriding) 이라고 부릅니다.

     

    class Cal{
    	public int sum(int v1, int v2) {
    		return v1+v2;
    	}
    }
    
    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)
    		System.out.println("Cal3!!");
    		return 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));
    		
    		Cal3 c3 = new Cal3();
    		System.out.println(c3.sum(2, 1)); // "Cal3!!" 3
    		System.out.println(c3.minus(2, 1)); // 1
    	}
    
    }

     


    2. 오버라이딩과 오버로딩

    오버라이딩과 오버로딩은 상당히 헷갈릴 수 있는 개념입니다.

    표현부터 굉장히 비슷하죠?

    이게 혼자만 헷갈리면 상관이 없는데 다른 사람과 이야기할 때는 헷갈리면 서로 의사소통이 안될 수가 있겠죠?

    그렇기 떄문에 한번쯤은 꼭 다루고 넘어가야 하는 주제입니다.

     

    오버라이딩은 위에서 했던 것처럼 덮어씌우는 것입니다.

     

    하지만 오버로딩은 상속과는 큰 관계가 없습니다.

    같은 이름의 메소드이지만 다른 매개변수를 받을 수도 있습니다.

    sum이라는 메소드는 원래 매개변수를 2개 받았지만, 3개 받도록 만들 수 있습니다.

    이름은 sum으로 같은 메소드이지만, 내용이 다른 것이죠.

    이렇게 만들면 서로 겹치지 않고 사용할 수 있게 됩니다.

    main함수 내에서 사용할 때 매개변수를 몇 개 입력했는지 컴파일러가 인식해서 다른 메소드가 동작하는 것이죠.

     

    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 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)
    		System.out.println("Cal3!!");
    		return 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
    	}
    
    }

     


    오늘은 상속의 기본적인 내용, 그리고 오버로딩과 오버라이딩의 차이에 대해서 알아봤습니다.

    다음 포스팅에서는 좀 더 발전된 상속법에 대해서 알아보도록 하겠습니다!!

     

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

     

     

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