오버로딩과 오버라이딩

Munang·2021년 11월 29일
0

자바의 정석

목록 보기
6/6

오버로딩

  • 오버로딩: 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 지칭한다.
    과적하다. 많이 싣다. 즉, 원래 메소드 이름 하나에 하나의 기능 만을 구현해야 하는데 여러기능을 구현하기 때문에 붙여진 이름이다.
  • 조건
    → 메서드 이름이 같아야 한다.
    → 매개변수의 개수 또는 타입이 달라야 한다.
    → 반환타입은 무관
void println()
void printlnBoolean(boolean x)
void printlnChar(char x)
void printlnString(String x)
void printlnDouble(double)
  • 장점
    • 근본적으로 같은 기능을 하지만, 서로 다른 매개변수를 사용하는 경우
    • 근본적으로 같은 기능을 하지만, 서로 다른 이름을 가져야 하는 경우
    • 메서드의 이름을 짓는데 고민을 덜어준다.

가변인자와 오버로딩

variable arguments : 기존의 메서드의 매개변수의 개수는 고정적이었지만, JDK1.5부터 동적으로 지정해 줄 수 있게 되었다. 이 기능을 가변인자(variable arguments)라고 한다.

선언법
: "타입... 변수명"과 같은 형식으로 선언한다.

EX) public PrintStream printf(String format, Object... args)

variable arguments말고도 매개변수가 더 있다면, variable arguments를 매개변수 중에 가장 마지막에 선언해야한다. 그렇지 않을 경우 컴파일 에러가 발생한다.

variable arguments의 기능

String concatenate(String s1, String s2) { ... }
String concatenate(String s1, String s2, String s3) { ... }
String concatenate(String s1, String s2, String s3, String s4) { ... }

이런 경우, 가변인자를 써서 다음과 같이 간단하게 바꿀 수 있다.
다음과 같은 메서드를 호출할 때는, 인자의 개수를 가변적으로 할 수 있으며 심지어 인자가 아예 없어도 되고, 배열이 인자가 될 수도 있다.

String concatenate(String... s) { ... }

concatenate();
concatenate("a");
concatenate("a", "b");
concatenate(new String[]{"a", "b"});

가변인자는 내부적으로 배열을 이용하는 것인데, 따라서 가변인자가 선언된 메서드를 호출할 때마다 새로운 배열이 생성된다.
가변인자를 선언하지 않고, 매개변수의 타입을 배열로 하는것을 보면....

String concatenate(String[] s { ... }

concatenate(); 				// 컴파일 에러 
concatenate(null);			// 인자로 null
concatenate(new String[0]);	// 인자로 배열을 지정. 

매개 변수 타입을 배열로 하면, 반드시 인자를 지정해줘야한다. 따라서 인자를 생략하면 컴파일 에러가 발생한다.
C언어와 다르게 자바에서는 길이가 0인 배열을 생성하는 것이 가능하다.

오버로딩의 주의점
가변인자가 있는 메서드를 오버로딩...
메서드를 호출했을 때, 구별되지 못하는 경우가 발생하기 쉽다. 따라서 가변인자를 사용한 메서드의 오버로딩을 피하는 것이 가장 좋다.

String concatenate(String ... str)

가변인자는 내부적으로 배열을 사용하는 것이다. 그래서 가변인자가 선언된 메서드를 호출할 때마다 배열이 새로 생성된다. 가변인자는 편리하지만, 배열을 호출해야 함으로 필요한 경우에만 가변인자를 사용하자.

→ 매개변수는 스택에 쌓이는데, 가변인자는 배열이어서 힙에 쌓이는거아님? 이럼 어떻게 되는거지?


오버라이딩

오버로딩: 조상클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩

상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다. 이럴 때 조상의 메서드를 오버라이딩한다.

  • 내용만을 새로 작성하므로 조건이 있다.
    • 이름이 같아야 한다.
    • 매개변수가 가아야 한다.
    • 반환타입이 같아야 한다.
  • 접근제어자, 예외는 제한된 조건 하에서 변경 가능
    • 접근 제어자는 조상 클래스의 메서드보다 좁은 볌위로 변경할 수 없다.
    • 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
    • 인스턴스메서드를 static메서드로 혹은 그 반대로 변경할 수 없다.

Q) 조상 클래스에서 정의된 static메서드를 자손 클래스에서 똑같은 이름의 static메서드로 정의하는게 가능할까? 그리고 이게 오버라이딩일까?

0개의 댓글