안녕하세요? Java 잘하고 싶은 Ulegi 입니다ㅋㅋ
Java 코드를 보다보면 @Override가 붙은 코드를 많이 보셨죠?
그 밑에는 계속 똑같은 이름의 메소드가 여러개 붙어있구요.
도무지 무슨 의미인지도 모르겠구요...
오늘은 오버로딩(overloading) 과 오버라이딩 (overriding)에 대해 적어보았습니다!
오버로딩 이란?
JAVA 한 클래스 내에서 이미 정의된 클래스와 같은 이름의 메소드를 정의 하는 것을 의미합니다.
(대신! 매개변수의 개수 혹은 타입이 달라야 가능)
+리턴 값이나 접근제어자 (public, private 등) 만 다른 것으로는 오버로딩 불가합니다.
class TestClass {
public void Test() {
System.out.println("테스트1");
}
String Test(Integer test1) {
System.out.println("테스트2");
return test1.toString();
}
String Test(Integer test2, Integer test3) {
System.out.println("테스트3");
return test2.toString() + test3.toString();
}
}
/*
클래스 TestClass 속의 Test는 모두 오버로드된 메소드들
+ 모두 매개변수의 개수와 타입이 다르기에 가능
+ 리턴타입 / 접근제어자 는 없거나 같아도 상관이 없습니다.
*/
오버로딩은 왜 쓰는 걸까?
- 같은 역할을 하는 메소드들을 매번 정의할 필요없이 하나로 정의할 수 있습니다.
- 정말 같은 기능을 하는 메소드인데 매개변수가 다르다고 method1, method2 를 정의하는 것보다 오버로딩하는 것이 효율적
- 메소드의 이름이 절약됩니다.
오버라이딩 이란?
부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것을 의미합니다.
+오버로딩과 다르게 매개변수, 리턴 값이 모두 동일해야 정의 가능합니다.
class Animal {
void cry() {
System.out.println("동물 울음소리");
}
}
class Cat extends Animal {
@Override
protected void cry() {
System.out.println("Meow");
}
}
class Dog extends Animal {
@Override
public void cry() {
System.out.println("Bark");
}
}
/*
+ 부모 클래스 : Animal (Cat, Dog가 extends로 Animal을 상속)
+ 자식 클래스 : Cat, Dog
+ 자식 클래스의 Cry 메소드 : 오버라이드 된 메소드
*/
위의 예제를 보면
- Animal 이라는 클래스를 생성하고 그 안에 Cry라는 메소드를 정의했습니다.
- 하지만! 작성자는 Cat과 Dog는 우는 소리가 다르다고 생각하여 Cry 메소드를 활용하여 울음소리를 다르게 들려주고 싶었습니다.
- 그래서 각자의 클래스를 생성하고 Animal(부모) 클래스의 Cry 메소드를 각자의 클래스에서 재정의 했습니다.
=> 이것을 오버라이딩 이라고 합니다!
오버라이딩은 왜 쓰는걸까?
- 오버라이딩을 사용하면 부모 클래스로부터 상속 받은 메소드의 로직을 필요에 따라 변경할 수 있습니다.
- 만약 오버라이딩을 하지 않으면 부모 클래스의 메소드와 아주 미세한 로직만 차이나는데도 새로운 메소드를 선언하여 사용하여야 하므로 비효율적입니다.
@override 는 무엇일까?
- @Deprecated, @Override 등 @뒤에 키워드가 붙은 코드는 어노테이션이라 불리는 "검증기능을 가진 주석" 이라고 합니다.
- 마찬가지로 여기서 @Override 는 두가지 기능을 합니다.
- 많은 메소드 중 어떠한 메소드가 부모 클래스로부터 오버라이딩이 되었는지 쉽게 파악
- 오버라이딩이 잘 이루어졌는지 검증하는 기능
- 매개변수를 부모클래스와 다르게 지정 / 부모클래스와 다른 메소드명 등 일때, 컴파일 오류 발생
- @Override 가 없어도 잘 작동합니다.
'개발 > JAVA' 카테고리의 다른 글
캡슐화 (Encapsulation) (0) | 2023.03.06 |
---|---|
클래스, 인스턴스, 생성자 비교 & 정리 (0) | 2023.02.10 |
.java 파일 .class 파일 차이 (2) | 2023.02.09 |
댓글