- 상속이란 기존의 클래스를 재사용하는 방식 중의 하나입니다.한 번 작성한 코드가 재사용이 필요하다면, 변경사항만 코드로 작성하므로 상대적으로 적은 양의 코드를 작성할 수 있게 됩니다. 이렇게 코드를 재사용하면, 코드와 클래스가 많아질수록 관리가 용이하다는 장점이 있습니다.
- 상속을 통해 클래스간의 계층구조를 만들게 됩니다.
- 상속의 특징
- 부모 클래스로에서 정의된 필드와 메소드를 물려 받습니다.
- 새로운 필드와 메소드를 추가할 수 있습니다.
- 부모 클래스스에서 물려받은 메소드를 수정할 수 있습니다.
- 상속의 형식
- → 상속은 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
'항해99 > Java 문법 뽀개기' 카테고리의 다른 글
자바문법뽀개기(12) - 객체지향언어(추상클래스, 인터페이스) (0) | 2022.09.26 |
---|---|
자바문법뽀개기(11) - 객체지향언어(접근제어자) (2) | 2022.09.26 |
자바문법뽀개기(9) - 객체지향언어(생성자) (0) | 2022.09.26 |
자바문법뽀개기(8) - 객체지향언어(클래스, 인스턴스, 메소드) (0) | 2022.09.26 |
자바문법뽀개기(7) - 반복문 (1) | 2022.09.26 |