항해99/Java 문법 뽀개기

자바문법뽀개기(10) - 객체지향언어(상속)

숲별 2022. 9. 26. 14:08
728x90
  • 상속이란 기존의 클래스를 재사용하는 방식 중의 하나입니다.한 번 작성한 코드가 재사용이 필요하다면, 변경사항만 코드로 작성하므로 상대적으로 적은 양의 코드를 작성할 수 있게 됩니다. 이렇게 코드를 재사용하면, 코드와 클래스가 많아질수록 관리가 용이하다는 장점이 있습니다.
  • 상속을 통해 클래스간의 계층구조를 만들게 됩니다.
  • 상속의 특징
    1. 부모 클래스로에서 정의된 필드와 메소드를 물려 받습니다.
    2. 새로운 필드와 메소드를 추가할 수 있습니다.
    3. 부모 클래스스에서 물려받은 메소드를 수정할 수 있습니다.
  • 상속의 형식
  • → 상속은 extends를 이용하여 사용할 수 있습니다.
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
  • 자식(Dog) 객체는 자식(Dog) 타입으로 선언된 변수에도 할당할 수 있고, 부모(Animal) 타입으로 선언된 변수에도 할당할 수 있습니다. 단, 부모(Animal) 타입의 변수로 사용할 때는, 실제 객체를 만들(new) 때 사용한 자식(Dog) 타입에 있는 함수 (여기서는 swim())을 호출할 수 없습니다. 컴파일 에러입니다.

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

 

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

 

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

  • 오버로딩이란? 👉 동일한 이름의 메소드를 정의한다고 해서 무조건 오버로딩인 것은 아닙니다!
    • 오버로딩의 조건 → 메소드 이름이 동일해야 합니다. → 매개변수의 개수 혹은 타입이 달라야 합니다.
  • → 한 클래스 내에 동일한 이름의 메소드를 여러개 정의하는 것
  • 오버라이딩이란?→ 상속받은 메소드를 그대로 사용하기도 하지만, 필요에 의해 변경해야할 경우 오버라이딩을 합니다.
    • 오버라이딩의 조건→ 부모 클래스의 메소드와 매겨변수가 같아야 합니다.
    • → 부모 클래스의 메소드와 반환타입이 같아야 합니다.
    • → 부모 클래스의 메소드와 이름이 같아야 합니다.
  • → 부모 클래스로부터 상속받은 메소드의 내용을 변경하는 것

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

  • 오버로딩 : 기존에 없는 새로운 메소드를 정의하는 것
  • 오버라이딩 : 상속받은 메소드의 내용을 변경하는 것
  • 👉 두 가지 개념을 혼동하기 쉽지만 차이는 명백히 존재합니다.
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 = new Dog("미미");
        dog2.cry();
      //  dog2.swim();
    }
}

dog2.swim() : 실제 객체는 dog지만 타입에 Animal로 되어 있기 때문에 dog2는 이 도구에 해당하는 내용 갖고

Animal기능(cry)만 호출 가능, Dog에 있는 기능(swim)은 수행할 수 없음.

 

여러 class 상속 받을 순없어.

 

 

이름이 같은데 무조건 overloading은 아님.

method 이름이 동일, 매개 변수의 개수나 type이 달라져야 함.

=>빨간줄로 정의할 수 없다고 compile에러가 남.

이름, 매개변수의 개수, type이 모두 같음.(abc,xyz는 같은 건 신경x.) return type만 다름.

return type이 다른 경우 overloading으로 치지 않음.

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

    int add(int x, int y, int z){
        return x+y+z;
    }
    int add(int a, int b){
        return a+b;
    }
}

=>빨간줄 사라짐.

이름 같고 매개변수의 개수가 다르기 때문에 overloading 맞음

 

public class Main {
    public static void main(String[] args) {

    }

    int add(int x, int y, int z){
        return x+y+z;
    }
    long add(int a, int b, long c){
        return a+b+c;
    }
}

=>선언 가능.

개수는 같은데 type이 다름.

 

 

<overriding>

부모의 class에 있는 method를 똑같이 자식 class에 정의하는 것.

덮어버림으로 부모에 있던 원래 함수의 내용은 없던 셈 치는 것.

 

class Animal{
    String name;
    String color;

    public Animal(String name) {
        this.name = name;
    }
    @Override
    public void cry(){
        System.out.println(name + "is crying");
    }
}

class Dog extends Animal{
    public Dog(String name) {
        super(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();
    }

    int add(int x, int y, int z){
        return x+y+z;
    }
    long add(int a, int b, long c){
        return a+b+c;
    }
}

좀 더 명확하게 나타내기 위해 @Override라는 어노테이션(?)을 붙여주기도 함.

 

overloading은 기존에 없는 새로운 method를 정의하는데 같은 이름을 가지는 함수를 정의하는 것.

overriding은 부모에 있는 똑같은 함수를 자식이 구현해서 부모에 있는 함수를 없는 체 하는 것.

 

강의자료 : https://www.notion.so/80db7f3685304ab3ac749e0e9cd29b30#3225851008da40e1ab0a9da70311c852