✅한국의 코리안을 위한 짧은 쇼츠 요약 서머리
오버로딩(Overloading)은 이름은 같으나, 시그니처(파라미터 수,타입)에는 다른 메소드를 중복으로 선언하는 것을 의미하고, 오버라이딩(Overriding)은 부모 클래스의 메소드의 동작 방법을 변경(재정의)하여 우선적으로 사용하는 것이다.
✔오버로딩(Overloading)
: 이름은 같으나, 시그니처(파라미터 수,타입)에는 다른 메소드를 중복으로 선언하는 것
오버로딩(Overloading)이라는 사전적 뜻은 '과적하다'라는 뜻이다. C에서는 함수명이 고유해야하는데, 이는 즉슨 하나의 함수가 하나의 기능만을 구현해야 한다는 것이다. 그러나 자바에서는 하나의 메소드 이름으로 여러 기능을 구현하기에 위와 같은 이름을 붙여준 것으로 보인다.
오버로딩의 정의는 자바의 한 클래스 내에 사용하려는 이름과 동명의 메소드가 있더라도 매개변수의 개수/ 타입이 다르면, 동명을 사용해서 메소드를 정의할 수 있다.
오버로딩의 특징
1) 메소드명이 같아야 한다
2) 리턴형이 같거나 달라도 된다
3) 파라미터 개수가 달라야 한다
4) 파라미터 개수가 같다면 데이터 타입이 달라야 한다
* 리턴 타입은 시그니처에 포함되지 않기 때문에 주의. 컴파일 에러 발생
오버로딩의 예시
1) 매개변수의 개수가 다를 때
두 메소드의 매개변수의 수가 0개,1개 (String test)로 다른 경우
//오버로딩 조건 : 매개변수가 다를때
public int overloadTest(){
return 0;
}
public int overTest(String test){
return 1;
}
2) 매개변수의 타입이 다른 경우
두 메소드의 매개변수 타입이 String, int로 다르다.
//오버로딩 조건 : 매개변수의 타입이 다른경우
public int overloadTest(String test){
return 1;
}
public int overloadTest(int test){
return 1;
}
이처럼 한 개의 클래스 내에서 오버로딩의 조건에 따라 같은 이름의 메소드를 정의할 수 있다.
비슷한 기능을 가진 메소드들의 이름을 지을때, 각 메소드별로 이름을 구별하지 않고, 하나의 이름으로 통일성 있게 정의할 수 있다는 장점을 가지고 있다. 즉, 비슷한 기능을 하는 메소드라면 하나의 이름을 정의하여 각각의 기능들을 이름을 외우지 않고 쉽게 사용할 수 있게 해준다.
위에서 언급했듯이 매개변수의 개수와 타입을 다르게 지정하면 동일한 이름의 메소드로 가능하나 리턴 값만 다르게 지정해서는 오버로딩을 할 수 없다.
또한 각 메소드의 접근제어자를 public,default, protected, private으로 다르게 지정해줘도 상관없다.
'리턴 값'만 다르게 한다고 오버로딩이 안되는 것처럼 접근제어자만 다르게 한다고 오버로딩을 할 수도 없다.
결론은 오버로딩은 매개변수의 차이로만 구현할 수 있으며, 매개변수가 다르다면 리턴 값은 다르게 지정할 수 있다.
✔오버라이딩(Overriding)
: 부모 클래스의 메소드의 동작 방법을 변경(재정의)하여 우선적으로 사용하는 것
=> 상속받은 메소드를 그대로 사용가능하나, 필요에 따라 메소드를 재정의해야 하는 경우에 부모로부터 상속받은 메소드를 재정의하여 사용하는 것을 오버라이딩이라고 한다.
오버라이딩의 특징
1) 오버라이드 하고자 하는 메소드가 상위 클래스에 존재해야한다
2) 매개변수가 같아야한다
3) 리턴타입이 같아야한다
4) 상위 메소드와 같거나 내용이 추가되어야한다
오버라이딩 예시
public class Parent{
public void overridingTest(){
System.out.println("부모 메소드의 내용");
}
}
class Child extends Parent{
@Override
public void overringTest(){
System.out.println("상속받은 부모 메소드를 수정해 자식 메소드 내용으로 사용한다");
}
}
Child클래스가 부모클래스인 Parent의 overridingTest()메소드를 상속받아 변형해 사용한다.
오버라이딩은 메소드의 선언부는 부모 메소드와 일치하나, 메소드의 내용만 재정의해 사용하는 것을 의미하는 것이다.
쉽게쉽게 오버로딩은 같은 이름의 메소드를 생성해 사용!
오버라이딩은 부모로부터 메소드를 상속받아 내용만 수정하여 사용
조금 더 알아보자!
🤔1. 오버라이딩을 하는 방법이 무엇이 있을까?
1. 기본형태
부모 클래스로 상속을 받은 것을 자식(파생)클래스의 메소드로 덮어서 사용한다.
class car
{
public void horn()
{
System.out.print("자동차는 삑삑");
}
}
class ELECcar extends car
{
public void horn()
{
System.out.print("전기자동차는 뿌웅")
}
}
2. new 키워드 사용
1번과 다른 점은 오버라이딩을 하기 위해서 "자식(파생)클래스의 메소드를 명시적으로 표시"하여 적어주기를 요청하는 것이다.
class ELECcar extends car
{
public new void horn()
{
System.out.print("전기자동차는 뿌웅뿌웅");
}
}
3. virtual,override 키워드 사용
new에서는 자식 메소드에만 표시해주었으나, virtual과 override키워드를 사용할 때는 부모와 자식 모두에게 명시적으로 표시해주어야한다.
class car
{
public virtual void horn()
{
System.out.print("자동차는 삑삑")
}
}
class ELECcar extends car
{
public override void horn()
{
System.out.print("전기자동차는 뿌웅뿌웅");
}
}
위와 같이 virtual 키워드를 삽입해준다.
이처럼 명시해주어 기반 클래스가 무엇인지를 알려준다.
위의 키워드를 사용했을때 다형성에 있어 강점이 있다는 것을 인지하자.
자식 클래스의 메소드에도 override가 명시적으로 쓰여 있는데
virtual을 사용하면, 자식(파생)클래스에서 오버라이딩할 메소드 작성시 자동완성기능이 있다.
🤔2.그렇다면 오버라이딩을 하면 부모 클래스의 메소드를 쓸 수 없을까?
base를 통해서 부모 클래스의 메소드를 사용할 수 있다.
class ELECcar extends car
{
public new void horn()
{
System.out.print("전기자동차는 테슬테슬");
base.horn();
}
}
위 예제 코드에서처럼 base.horn()을 통해 부모 메소드에서의 horn을 사용할 수 있다.
즉, 위와 같이 실행시에는 자식메소드에서 변경된 내용과 부모 메소드에서의 내용이 같이 출력된다.
🤔3. 내가 만든 클래스를 나만 쓰고 싶다면?
Sealed 키워드를 사용하면 된다.
Sealed 키워드는 내가 만든 클래스를 다른 곳에 상속하지 못하게 하는 키워드이다.
sealed class car
{
public void horn()
{
System.out.println("자동차는 삑삑");
}
}
class ELECcar extends car
{
public new void horn()
{
System.out.println("전기자동차는 테슬테슬");
base.horn();
}
}
위와 같이 코드 작성시 output값은 "전기자동차는 테슬테슬"이 나온 뒤에 "자동차는 삑삑"이 나온다.
참고 자료 :
https://nobacking.tistory.com/56
https://www.opentutorials.org/course/1223/6090
https://brunch.co.kr/@kimkm4726/2
'책벌레와 벌레 그 사이 어딘가 > 개념쌓기' 카테고리의 다른 글
[개념쌓기] N+1 문제 (0) | 2023.01.02 |
---|---|
[개념쌓기] EAGER & LAZY (0) | 2023.01.02 |
[개념쌓기] RDBMS & NoSQL (0) | 2022.12.30 |
[개념쌓기] WAS & WS (0) | 2022.12.28 |
[개념쌓기] RESTful하다 (0) | 2022.12.25 |
댓글