https://t1.daumcdn.net/cfile/tistory/994CCA505B5F2D051A
→ 상속을 보여주는 UML Class Diagram입니다. 자동차의 하위 계층으로 SUV와 SEDAN이 존재합니다. 우리도 이렇게 계층적인 구조를 만들어 볼 것입니다!
→ 상속은 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
}
}
👉 참고로, 상속을 받을 때 여러 클래스를 상속받을 수는 없습니다! 오직 하나의 클래스만을 상속받을 수 있습니다.
부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하여 사용하고 싶을 때 사용하는 키워드입니다. 상속에 대해서 이해가 충분히 되었다면 아래 주소에서 추가적인 공부를 해보세요!
→ 한 클래스 내에 동일한 이름의 메소드를 여러개 정의하는 것
👉 동일한 이름의 메소드를 정의한다고 해서 무조건 오버로딩인 것은 아닙니다!
→ 메소드 이름이 동일해야 합니다.
→ 매개변수의 개수 혹은 타입이 달라야 합니다.
👉 아래는 오버로딩에 대한 예제입니다. 오버로딩인지 아닌지 생각해보며 읽으면 좀 더 쉽게 이해할 수 있습니다!
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();
}
}
👉 두 가지 개념을 혼동하기 쉽지만 차이는 명백히 존재합니다.
오버로딩 : 기존에 없는 새로운 메소드를 정의하는 것
오버라이딩 : 상속받은 메소드의 내용을 변경하는 것