본문 바로가기
자바(Java)/자바기초

[자바기초.015] 오버라이딩(Overriding)

by 긱펀 2024. 3. 15.
반응형

[자바기초.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)를 바꾸고 나머지는 같아야 한다.) 

 


 

728x90
반응형

댓글