[자바기초.015] 메소드 오버라이딩(Overriding)
[1] 메소드 오버라이딩(Method Overriding)
- 자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속받습니다.
- 이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수도 있습니다.
- 메소드 오버라이딩(Overriding)이란 상속받은 부모 클래스의 메소드(Method)를 재정의하여 사용하는 것을 말합니다.
◈주의사항◈
-오버라이딩(Overriding): 상속 받은 메소드를 재정의 하는 것(오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴형(return type) 이 모두 같아야 한다.)
-오버로딩(Overloading): 기존에 없는 새로운 메소드를 추가하는 것(메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 한다. 주의할 점은 '리턴 값만' 다른 것은 오버로딩을 할 수 없다는 것이다.)
구분 | 오버라이딩(Overriding) | 오버로딩(Overloading) |
적용 범위 | 상속 관계 | 같은 클래스 |
리턴형(return) | 부모 메소드와 동일해야 한다. | 달라도 된다. |
method 이름 | 부모 메소드와 동일해야 한다. | 동일해야 한다. |
매개변수(parameter) | 부모 메소드와 동일해야 한다. | 달라야 한다. |
접근 제어자 | 자식 클래스에서 오버라이딩 하는 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다. | 모든 접근제어자 사용 가능 |
[오버로딩 코드 예시]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class OverloadingMethods { public void print() { System.out.println("오버로딩1"); } String print(Integer a) { System.out.println("오버로딩2"); return a.toString(); } void print(String a) { System.out.println("오버로딩3"); System.out.println(a); } String print(Integer a, Integer b) { System.out.println("오버로딩4"); return a.toString() + b.toString(); } } | cs |
[오버라이딩 코드 예시]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Person { void cry() { System.out.println("흑흑"); } } class Child extends Person { @Override protected void cry() { System.out.println("잉잉"); } } class Senior extends Person { @Override public void cry() { System.out.println("훌쩍훌쩍"); } | cs |
@Override 라는 글자를 오버라이딩 하는 메소드 위에 적어주면, 상속관계에 있는 메소드 오버라이드에 오타나 오류가 없는지 컴파일러가 미리 체크해주는 장점이 있습니다.
1 2 3 4 5 | @Override public String greet() { return "Go Away"; } | cs |
[예제1] 아래 코드는 Greeter 클래스를 상속받은 MeanGreeter 클래스 입니다. MeanGreeter 클래스는 greet() 메소드를 오버라이딩 했습니다. 코드를 실행해 보세요.
- 메소드 오버라이드를 하려면, 메소드 이름/메소드 파라미터/리턴 타입이 모두 같아야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import java.util.*; class Greeter { public String greet() { return "Hi"; } } class MeanGreeter extends Greeter { @Override public String greet() { return "Go Away"; } } public class Main { public static void main(String[] args) { Greeter g1 = new Greeter(); System.out.println(g1.greet()); MeanGreeter g2 = new MeanGreeter(); System.out.println(g2.greet()); } } | cs |
[실행결과]
[유제1] 아래 코드의 주석 중 "[유제1]" 부분의 영어를 읽어보고 조건에 맞는 메소드를 추가하고 실행해 보세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | import java.util.*; class Greeter { public String greet() { return "Hi"; } } class MeanGreeter extends Greeter { @Override public String greet() { return "Go Away"; } } // [유제1] // Add another subclass called SpanishGreeter that extends Greeter // and override the greet() method to return Hola! instead of Hi!. // Create an object to test it out. public class Main { public static void main(String[] args) { Greeter g1 = new Greeter(); System.out.println(g1.greet()); MeanGreeter g2 = new MeanGreeter(); System.out.println(g2.greet()); } } | cs |
[실행결과]
[예제2] 오버로딩과 오버라이딩을 함께 사용한 아래의 예시 코드를 살펴보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import java.util.*; class Greeter { public String greet() { return "Hi"; } public String greet(String who) // 오버로딩(Overloading) { return "Hello " + who; } } class MeanGreeter extends Greeter { @Override public String greet() { return "Go away"; } } public class Main { public static void main(String[] args) { Greeter g1 = new Greeter(); System.out.println(g1.greet("Sam")); Greeter g2 = new MeanGreeter(); System.out.println(g2.greet("Nimish")); } } | cs |
[실행결과]
[유제2] 위 예제2 코드에서 MeanGreeter 클래스 안에 "greet(String)" 메소드를 오버라이딩으로 추가하세요. 단, 이 메소드를 "Go away" + who를 리턴해야 합니다.
[실행결과]
[유제3] Person클래스 안에 있는 getFood 메소드를 오버라이드(Override) 한 메소드를 Student 클래스 안에 코딩하려고 한다. 아래 코드의 오버라이딩 함수 이름(A, B, C)중 알맞은 것은?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | public class Person { private String name = null; public Person(String theName) { name = theName; } public String getFood() { return "Hamburger"; } } public class Student extends Person { private int id; private static int nextId = 0; public Student(String theName) { super(theName); id = nextId; nextId++; } public int getId() { return id; } public void setId(int theId) { this.id = theId; } // [유제3] A. public void getFood() B. public String getFood(int quantity) C. public String getFood() } | cs |
[유제4] Person클래스 안에 있는 getFood 메소드를 오버로드(overload)하기 위해 알맞게 코딩한 메소드 이름을 아래 A,B,C 중 고르세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | public class Person { private String name = null; public Person(String theName) { name = theName; } public String getFood() { return "Hamburger"; } // [유제 4] A. public void getFood() B. public String getFood(int quantity) C. public String getFood() } public class Student extends Person { private int id; private static int nextId = 0; public Student(String theName) { super(theName); id = nextId; nextId++; } public int getId() { return id; } public void setId(int theId) { this.id = theId; } } | cs |
[유제 정답은 아래 "더보기" 클릭]
[유제1 정답]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import java.util.*; class Greeter { public String greet() { return "Hi"; } } class MeanGreeter extends Greeter { @Override public String greet() { return "Go Away"; } } // [유제1] // Add another subclass called SpanishGreeter that extends Greeter and override the greet() method to return Hola! instead of Hi!. Create an object to test it out. class SpanishGreeter extends Greeter{ @Override public String greet() { return "Hola!"; } } public class Main { public static void main(String[] args) { Greeter g1 = new Greeter(); System.out.println(g1.greet()); MeanGreeter g2 = new MeanGreeter(); System.out.println(g2.greet()); SpanishGreeter g3 = new SpanishGreeter(); System.out.println(g3.greet()); } } | cs |
[유제2 정답]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import java.util.*; class Greeter { public String greet() { return "Hi"; } public String greet(String who) // 오버로딩(Overloading) { return "Hello " + who; } } class MeanGreeter extends Greeter { @Override public String greet() { return "Go away"; } @Override public String greet(String who) { return "Go away " + who; } } public class Main { public static void main(String[] args) { Greeter g1 = new Greeter(); System.out.println(g1.greet("Sam")); Greeter g2 = new MeanGreeter(); System.out.println(g2.greet("Nimish")); } } | cs |
[유제3 정답]
C. public String getFood()
(이유: 메소드 오버라이딩은 리턴타입과 파라미터, 메소드 이름이 부모 메소드와 같아야 한다.)
[유제4 정답]
B. public String getFood(int quantity)
(이유:메소드 오버로드는 메소드의 매개변수(parameter)를 바꾸고 나머지는 같아야 한다.)
'자바(Java) > 자바기초' 카테고리의 다른 글
[자바기초.017] 상속 계층(Inheritance Hierarchies) (0) | 2024.03.15 |
---|---|
[자바기초.017] super 키워드 (0) | 2024.03.15 |
[자바기초.014] is-a & has-a 관계 (1) | 2024.03.14 |
[자바기초.013] 상속과 생성자 (0) | 2024.03.13 |
[자바기초.012] 상속(Inheritance) (0) | 2024.03.13 |
댓글