오버로딩
오버로딩은 이 전 게시물인 클래스(생성자) 파트에서 설명을 했었다.
한개의 클래스 내에서 동일한 메서드명 2개를 선언할 수 없지만,
메서드명이 같아도 파라미터나 타입이 다르다면 한 클래스 내에서도 동일한 메서드 2개를 선언할 수 있다. 가 골자였다.
즉,
class ClassB {
ClassB() {
System.out.print('A');
}
void prn() {
System.out.print('B');
}
void prn(int x) {
System.out.print(x)
}
}
// void prn이라는 메서드 명은 같지만
// 받는 파라미터가 다르다.
// 따라서 호출 시 prn(int 5)로 한다면
// print(5)가 호출되고
// prn();으로 호출했다면
// print('B')가 호출된다.
// 즉, 메서드명이 같아도 메서드의 타입이나 파라미터가 다르다면 동일한 이름으로 선언이 가능하고
// 이를 오버로딩이라고 한다.
설명이 잘 된 것 같다.
오버라이딩
그럼 오버라이딩은 또 뭔가?
오버로딩이 그랬듯이 오버라이딩도 크게 어려운 개념은 아니다.
오버라이딩은 부모 클래스가 가지고 있는 메서드를 자식 클래스에서 재정의 하는 것이다.
무슨 말인지 헷갈릴 수 있겠다.
아래 코드를 보자.
아래 코드의 출처는 TCPSchool 이다.
class Parent{
void display() {
System.out.println("부모 클래스의 display() 메소드.");
}
}
// Parent 클래스가 선언되어있다.
// display 메서드를 가지고 있으며, 이 메서드가 실행되면
// "부모 클래스의 display() 메소드." 가 출력된다.
class Child extends Parent {
void display() {
System.out.println("자식 클래스의 display() 메소드.");
}
void display(String str) {
System.out.println(str);
}
}
// Child 클래스가 선언되었는데 이 친구는 Parent가 extends되서 생성된,
// 즉 자식 클래스이다. Parent의 내용을 상속받으면서 추가적인 것들을 선언할 수 있다.
public class inheritance06{
public static void main(String[] args) {
Child ch = new Child();
ch.display();
ch.display("오버로딩된 display 메소드.");
}
}
// 실행 클래스의 실행 메서드이다.
먼저 실행 클래스의 메인 메서드부터 보자.
해당 메서드 안에서
Child 클래스의 ch 인스턴스가 Child() 생성자로 인해 생성(초기화)되었다.
따라서 ch 인스턴스는 Child 클래스가 가지고 있던 display()라는 메서드를 가지게 된다.
하지만 자세히 보면
Child의 부모 클래스인 parent 클래스도 똑같이 display()라는 메서드를 가지고 있다.
이를 실행시키면 어떻게 될까?
Child가 Parent를 상속받은 것은 맞지만
동일한 메서드명은 자식 클래스에서 재정의되어
child의 display()로 덮어씌워지게 된다.
이를 오버라이딩이라고 부른다.
(오버로딩된 함수도 볼 수 있는데, 이는 display()의 파라미터를 바꿔 오버로딩화 한 것이다.)
따라서 위의 코드를 실행하면
아래와 같은 결과를 얻을 수 있다.
마지막으로 아래 문제를 풀어보자.
이 문제는 시나공에 나와있는 문제인데
아주아주 예제로 좋은 듯 하다.
일단 시나공 책이 좋은듯.
class ClassA {
ClassA() {
System.out.print('A');
this.prn();
}
void prn() {
System.out.print('B');
}
}
// ClassA가 선언되었다.
// this.prn()에서 this는 자기가 속한 지역, 즉 자기 인스턴스 내부의 prn을 사용한다는 것이다.
// 여기서는 void prn() { -.print('B')};가 되겠다.
class ClassB extends ClassA {
ClassB() {
super();
System.out.print('D');
}
void prn() {
System.out.print('E');
}
void prn(int x) {
System.out.print(x);
}
}
// ClassB가 ClassA를 상속받아 생성되었다.
// ClassB의 생성자의 실행문 중 super()는 본인의 부모클래스, 즉 ClassA를 가져다 쓰겠다는 것이다.
// ClassA의 호출이 끝나면 아래 print('D')가 출력이 될 것이다.
public class Test {
public static void main(String[] args) {
int x = 7;
ClassB cal = new ClassB();
cal.prn(x);
}
}
// 실행 클래스이다.
// 지역변수로 int x = 7이 있고
// 생성자를 통해 ClassB의 cal 인스턴스가 생성되었으며
// cal.prn(x)가 선언되어있다. (여기서는 정수 7이 인수로 가게 될 것이다.)
먼저, 클래스에 클래스명과 동일한 생성자가 정의되어 있다면 그 생성자가 실행이 된다.
즉 ClassB = new ClassB();가 선언이 되자마자
ClassB 클래스 내부의 ClassB()가 시작된다는 것이다.
따라서 ClassB가 실행되는데
이 때 super() 이 있는데,
super()는 부모 클래스의 생성자를 시작시킨다.
부모 생성자는 ClassA() 이므로
ClassA()가 실행되어
A 가 처음에 호출된다.
그 다음, this.prn을 볼 수가 있는데,
자식 클래스인 ClassB에 prn이 없었다면 Class의 prn이 실행되었겠지만
ClassB에 prn이 있으므로,
prn은 ClassB에서 재정의(오버라이딩)되어
E를 호출한다.
ClassA()가 전부 호출되었음은
super()가 끝났음을 의미한다.
따라서 그 다음에 호출되어야 할
D가 호출된다.
이후 cal.prn(x)의 경우
오버로딩으로 인해
7이 호출된다.
'했던것들 > 정보처리기사' 카테고리의 다른 글
(개정) 정보처리기사 실기 요약 정리 (0) | 2022.07.31 |
---|---|
정보처리기사/JAVA/클래스(생성자) (0) | 2022.07.19 |
정보처리기사/JAVA/제어문 (0) | 2022.07.19 |
정보처리기사/JAVA/데이터입출력 (0) | 2022.07.18 |
[요점정리] 2022년 정보처리기사 필기 4과목. 프로그래밍 언어 활용 (0) | 2022.04.21 |