안녕하세요.
열정열정열정 개발자입니다.
처음 Java를 배울 때, 오버로딩 오버라이딩 개념 조차도 어려웠을 때가 있는데요,
이해하고 나서도 가끔 헷갈릴 때가 많더라구요!
그래서 정리해봤습니다.
오버로딩 (Java)
오버로딩은 리턴타입, 함수명은 같지만 파라미터가 다른 메소드를 의미합니다.
파라미터의 갯수나 타입이 다르면 오버로딩이 성립하는 것입니다.
오버로딩의 예)
public class JiminF {
public static void main(String[] args) {
Over.me();
Over.me(1);
Over.me(1, 2);
}
}
public class Over {
static void me(){
System.out.println("인자없음");
}
static void me(int a) {
System.out.println("인자 1 : " + a);
}
static void me(int a, int b) {
System.out.println("인자 1 : " + a + ", 인자 2 : " + b);
}
}
//실행결과
인자없음
인자 1 : 1
인자 1 : 1, 인자 2 : 2
위의 코드와 같이 me라는메서드이름과 리턴 타입은 같지만 파라미터에 갯수에 따라서 오버라이딩이 성립하는 것을 볼 수 있습니다.
인자가 없는 me메소드에서는 "인자없음"이라고 출력이 되었고
1이라는 인자가 있는 me메소드는 인자값인 1이 출력되었습니다.
또, 1과 2의 인자 값을 넣어준 me메소드는 1과 2가 출력이 되었습니다.
이렇게, 메소드는 같지만 파라미터가 다른 메소드를 오버로딩 이라고합니다.
오버라이딩 (Java)
오버라이딩은 오버로딩과 이름은 비슷하지만 다른 개념의 친구입니다.
오버라이딩은 한마디로 재정의라고 할 수 있습니다.
오버라이딩은 클래스의 상속에서 사용할 수 있습니다.
상속받은 자식 클래스에서 부모 클래스를 사용하고 싶은데, 고쳐 사용하고 싶을 때! 재정의 해서 메소드를 고쳐 쓰는 것입니다.
오버라이딩 예제 코드)
public class JiminF {
public static void main(String[] args) {
Over ob = new Over2();
ob.me();
}
}
public class Over{
void me() {
System.out.println("error");
}
}
public class Over2 extends Over{
void me() {
System.out.println("오버라이딩 (재정의)");
}
}
//실행결과
오버라이딩 (재정의)
Over와 Over를 상속받은 Over2 클래스를 정의하여 me 메소드를 재정의 하였고,
Over2 클래스를 생성하여 me메소드를 호출하였을 때, 재정의 된 메소드가 정상적으로 호출되는 것을 확인하였습니다.
위의 예제를 작성하다가 제가 실수했던 부분이 있는데,
public class JiminF {
public static void main(String[] args) {
Over ob = new Over2();
ob.me();
}
}
public class Over{
static void me() {
System.out.println("error");
}
}
public class Over2 extends Over{
static void me() {
System.out.println("오버라이딩 (재정의)");
}
}
이렇게 me 메소드에 static을 붙히고 Over ob = new Over2() 객체를 생성하여 호출하게 되면,
error가 뜹니다.
그 이유는 me 메소드에 붙은 static 때문입니다.
static을 붙이게 되면 정적 메소드가 되어 이미 메모리에 올라가있기 때문에 재정의가 되지 않는 것입니다.
이럴 땐, 객체를 생성할 때 Over2 ob = new Over2(); 로 생성하여 Over2의 메소드를 사용하는 방법이 있고
메소드의 static을 없애면 정상적으로 재정의가 됩니다.
본 게시물은 개인 공부용 포스트이기 때문에, 틀린 내용이 있을 수 있습니다.
'IT > 개발공부' 카테고리의 다른 글
Spring Boot 프로젝트 생성 연습하기 (eclipse, java17, maven) (0) | 2023.06.27 |
---|---|
Postman에 대해 알아보자 (Postman이 무엇인가, Postman 설치, 사용법) (0) | 2023.06.26 |
C++ 함수 (함수 정의, 호출, 인수 전달, inline 함수) (0) | 2023.06.20 |
Spring 처음부터 공부해보기 - 1 (프로젝트 생성, Bean, 어노테이션, Spring Container, Loose Coupling) (0) | 2023.06.15 |
C++ 언어 기초 (2) (흐름제어, 구조체, 클래스, 배열, 포인터, 메모리 할당, 참조) (0) | 2023.06.15 |