[Java] 오버로딩(Overloading)과 오버라이딩(Overriding)
오늘은 Java 오버로딩(Overloading)과 오버라이딩(Overriding) 개 (개념) 이 (사용 이유) 문 (문법 및 예시) 시작하겠습니다.
시작하기에 앞서, 먼저 오버로딩과 오버라이딩의 공통점은
다형성을 지원하는 방법이다.
다형성을 지원하는 방법
다형성을 지원하는 방법
오버로딩(Overloading)
개념
같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술
조건
메소드 이름 동일해야됨
매개변수의 개수 또는 타입이 달라야됨.
매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.
(리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)
사용 이유
java내에서 제공하는 src.zip 내에 있는 java\lang\System.java을
뜯어보면
아~주 대표적인 오버로딩으로는 System.out.println() 가 있다.
오버로딩이 만약 없다면?
void println()
void printlnBoolean(boolean x)
void printlnChar(char x)
void printlnString(String x)
void printlnDouble(double)
모두 근본적으로는 같은 기능을 하는 메서드들이지만, 서로 다른 이름을 가져야하기 때문에 메서드를 작성하는 쪽에서는 이름을 짓기 어렵고, 메서드를 사용하는 쪽에서는 이름을 일일이 구분해서 기억해야 하기 때문에 서로 부담이 된다.
하지만, 오버로딩을 통해 여러 메서드들이 println이라는 하나의 이름으로 정의될 수 있다면, println이라는 이름만 기억하면 되므로 기억하기도 쉽고 이름도 짧게할 수 있어서 오류의 가능성을 많이 줄일 수 있다. 그리고 메서드의 이름만 보고도 '이 메서드들은 이름이 같으니, 같은 기능을 하겠구나'라고 쉽게 예측할 수 있다.
문법
// Cosmetics.java file
public class Cosmetics {
public void produce(int water,int oil,int essence) {
System.out.println("제조 비율 "+water+"% "+oil+"% "+essence+"%");
}
public void produce(int water,int oil,int essence,int nmw) {
System.out.println("제조 비율 "+water+"% "+oil+"% "+essence+"%"+nmw+"% ");
}
public void produce(String execp) {
System.out.println("제조 불량 "+execp);
}
public void produce(double water,double oil) {
System.out.println("제조 비율 "+water+"% "+oil+"% ");
}
}
// Innis.java file
public class Innis {
public static void main(String[] args) {
Cosmetics co = new Cosmetics();
co.produce(20, 40, 60);
co.produce(20, 40, 20 , 20);
co.produce("불량품");
co.produce(22.33,55.6678);
}
}
설명 : 같은 produce 메소드이지만 매개변수,타입이 모두 다르다.
오버 라이딩(Overriding)
개념
상위 클래스가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 메소드도 하위 클래스로 상속되어 하위 클래스에서 사용할 수 있다. 하지만, 하위 클래스에서 메소드를 재정의해서 사용할 수 있다.
한마디로 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술
조건
메소드 이름 동일해야됨
매개변수,타입 동일해야됨
리턴타입이 동일해야됨
메소드의 static 예약어를 붙이면 안됨
사용 이유
말 그대로 재정의 할 때 사용합니다.
추상 클래스를 설명할 때 예로 들었던
화장품 클래스를 다시 꺼내서 설명하겠습니다.
화장품이라는 부모클래스를 상속 받는다.
기본 제조 메소드
물 40% + 기름 40% + 에센스 20%
이니x프리 클래스 상속 화장품
@오버라이딩
제조 메소드
물 70% + 기름 10% + 에센스 10% + 천연암반수 10% (추가)
올리x영 클래스 상속 화장품
@오버라이딩
제조 메소드
물 50% + 기름 49% + 에센스 1%
[Java] 상속이란?
문법
화장품 클래스 (부모)
public class Cosmetics {
public int water;
public int oil;
public int essence;
public void produce() {
System.out.println("제조 비율"+this.water+"% "+this.oil+"% "+this.essence+"%");
}
}
이니스x리 클래스 (자식)
public class Innis extends Cosmetics {
int nmw;
@Override
public void produce() {
System.out.println("제조 비율 물 "+water+"% 기름 "+oil+"% 에센스 "+essence+"% 천연암반수 "+nmw+"% ");
}
}
구현 클래스
public class Ex {
public static void main(String[] args) {
Innis ins = new Innis();
ins.water = 20;
ins.oil = 20;
ins.essence = 20;
ins.nmw = 40;
ins.produce();
}
}
설명 : 이니스x프리 클래스가 화장품 클래스의 produce 메소드를 상속 받아 재정의 하였다.( int nmw을 추가)
+면접 단골 질문
오버로딩과 오버라이딩의 차이점
정리
1.오버로딩
같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술
코드의 통일성 , 효율성을 높일 수 있다.
2.오버라이딩
상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술
둘의 공통점은 다형성을 지원하는 방법
'java' 카테고리의 다른 글
[Java] Error(에러)와 Exception(예외) 그리고 자주 보이는 Exception (0) | 2019.11.06 |
---|---|
[Java]기본형(primitive type)과 참조형(reference type) (feat.Integer와 int 차이점) (0) | 2019.11.03 |
[Java] parseInt()와 intValue() (0) | 2019.10.29 |
[Java] java.lang.ClassCastException (0) | 2019.10.28 |
[Java] 상속 (0) | 2019.10.27 |