1) 상속(inheritance)


https://t1.daumcdn.net/cfile/tistory/994CCA505B5F2D051A

상속을 보여주는 UML Class Diagram입니다. 자동차의 하위 계층으로 SUV와 SEDAN이 존재합니다. 우리도 이렇게 계층적인 구조를 만들어 볼 것입니다!

  • 상속이란 기존의 클래스를 재사용하는 방식 중의 하나입니다.한 번 작성한 코드가 재사용이 필요하다면, 변경사항만 코드로 작성하므로 상대적으로 적은 양의 코드를 작성할 수 있게 됩니다. 이렇게 코드를 재사용하면, 코드와 클래스가 많아질수록 관리가 용이하다는 장점이 있습니다.
  • 상속을 통해 클래스간의 계층구조를 만들게 됩니다.
  • 상속의 특징
    1. 부모 클래스로에서 정의된 필드와 메소드를 물려 받습니다.
    2. 새로운 필드와 메소드를 추가할 수 있습니다.
    3. 부모 클래스스에서 물려받은 메소드를 수정할 수 있습니다.

상속의 형식

→ 상속은 extends를 이용하여 사용할 수 있습니다.

class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}

  • 그림에서 Animal 는 부모 클래스, 조상 클래스라고 부릅니다. Dog, Cat 클래스는 자식 클래스 , 자손 클래스라고 부릅니다.

  • [코드스니펫] 상속 예제 - Main 함수

    public class Main {
        public static void main(String[] args) {
            
        }
    }
	class Animal {
    	String name;

    	public void cry() {
        	System.out.println(name + " is crying.");
    	}
	}

	class Dog extends Animal {

	    Dog(String name) {
	        this.name = name;
	    }

	    public void swim() {
	        System.out.println(name + " is swimming!");
	    }
	}

	public class Main {
	    public static void main(String[] args) {
	        Dog dog = new Dog("코코");
	        dog.cry();
	        dog.swim();
        
	        Animal dog2 = dog;
	        dog2.cry();
	//        dog2.swim(); // compile error
	    }
	}
  • 자식(Dog) 객체는 자식(Dog) 타입으로 선언된 변수에도 할당할 수 있고, 부모(Animal) 타입으로 선언된 변수에도 할당할 수 있습니다. 단, 부모(Animal) 타입의 변수로 사용할 때는, 실제 객체를 만들(new) 때 사용한 자식(Dog) 타입에 있는 함수 (여기서는 swim())을 호출할 수 없습니다. 컴파일 에러입니다.

👉 참고로, 상속을 받을 때 여러 클래스를 상속받을 수는 없습니다! 오직 하나의 클래스만을 상속받을 수 있습니다.

super()

  • 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하여 사용하고 싶을 때 사용하는 키워드입니다. 상속에 대해서 이해가 충분히 되었다면 아래 주소에서 추가적인 공부를 해보세요!

오버로딩(overloading) vs 오버라이딩(overriding)

오버로딩이란?

→ 한 클래스 내에 동일한 이름의 메소드를 여러개 정의하는 것

👉 동일한 이름의 메소드를 정의한다고 해서 무조건 오버로딩인 것은 아닙니다!

오버로딩의 조건

→ 메소드 이름이 동일해야 합니다.
→ 매개변수의 개수 혹은 타입이 달라야 합니다.

👉 아래는 오버로딩에 대한 예제입니다. 오버로딩인지 아닌지 생각해보며 읽으면 좀 더 쉽게 이해할 수 있습니다!

  • [코드스니펫] 오버로딩 예제 - Main 함수
    public class Main {
        public static void main(String[] args) {
    		// write your code here
    
        }
    }
int add(int x, int y, int z) {
    int result = x + y + z;
    return result;
}

long add(int a, int b, int c) {
    long result = a + b + c;
    return result;
}
// 반환타입은 다르지만 매개변수의 자료형과 개수는 같기에 오버로딩이 아닙니다.
int add(int x, int y, int z) {
    int result = x + y + z;
    return result;
}

long add(int a, int b, long c) {
    long result = a + b + c;
    return result;
}

int add(int a, int b) {
    int result = a + b;
    return result;
}
// 오버로딩의 조건에 부합하는 예제입니다.

오버라이딩이란?

→ 부모 클래스로부터 상속받은 메소드의 내용을 변경하는 것
→ 상속받은 메소드를 그대로 사용하기도 하지만, 필요에 의해 변경해야할 경우 오버라이딩을 합니다.

오버라이딩의 조건

→ 부모 클래스의 메소드와 이름이 같아야 합니다.
→ 부모 클래스의 메소드와 매겨변수가 같아야 합니다.
→ 부모 클래스의 메소드와 반환타입이 같아야 합니다.

👉 상속에서 Dog클래스, Animal 클래스로 설명을 했던 부분 기억하시나요? 그 예제를 활용하여 오버라이딩을 하겠습니다.

class Animal {
    String name;
    String color;

    public void cry() {
        System.out.println(name + " is crying.");
    }
}

class Dog extends Animal {

    Dog(String name) {
        this.name = name;
    }

    public void cry() {
        System.out.println(name + " is barking!");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog("코코");
        dog.cry();
    }
}

오버로딩 vs 오버라이딩 (비교)

👉 두 가지 개념을 혼동하기 쉽지만 차이는 명백히 존재합니다.

오버로딩 : 기존에 없는 새로운 메소드를 정의하는 것
오버라이딩 : 상속받은 메소드의 내용을 변경하는 것

profile
항해중인 우당탕탕 코린이

0개의 댓글