songdev
songdev
songdev
전체 방문자
오늘
어제
  • 분류 전체보기 (78)
    • Web 개발 (6)
    • 리눅스 (5)
    • git (5)
    • Bigdata (8)
      • 하둡 Architecture 번역 (6)
      • Ambari (2)
    • 코테 (22)
      • 프로그래머스 (22)
    • 자격증 (7)
      • 정보처리기사 (5)
      • SQLD (2)
    • 스터디 (18)
      • 웹 프로그래밍 (3)
      • 개념정리 (4)
      • 예제 (6)
      • 바닐라 JS로 크롬 앱 만들기 (5)
    • 일상 (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • level1
  • 자바스크립트
  • github push
  • SQLD
  • parseInt()
  • 리눅스
  • 향상된 버블정렬
  • Java
  • charAt()
  • 정보처리기사 필기
  • copyOfRange()
  • 프로그래머스
  • 배열의 복사
  • javascript
  • 정보처리기사
  • 배열
  • 정렬
  • github
  • sort()
  • 깃허브

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
songdev

songdev

스터디/개념정리

메소드 오버로딩과 오버라이딩/java

2020. 2. 15. 06:43
반응형

○ 메소드 오버로딩 (중복정의)

- 정의 : 메소드가 처리하는 기능은 같고, 메소드 괄호 속에 오는 인수(인자, 매개변수, 파라미터)의 개수가 다르거나 자료형(Data Type)이 다른 경우 메소드의 이름을 동일한 이름으로 부여하여 메소드를 정의할 수 있도록 문법적으로 허용한다.

 

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
43
44
45
46
public class Test098 {
    public static void main(String[] args) {
 
        drawLine();        // 같은 클래스 안에 있으므로 클래스명 생략 가능
        //--==>> ====================
        // 매개변수가 없는 메소드를 찾아간다
 
        drawLine('+');
        //--==>> ++++++++++++++++++++
        // char 한 개를 매개변수로 받는 메소드를 찾아간다
 
        drawLine('>');
        //--==>> >>>>>>>>>>>>>>>>>>>>
        // char 한 개를 매개변수로 받는 메소드를 찾아간다
 
        drawLine('/', 50);
        //--==>> //////////////////////////////////////////////////
        // char 한 개, int 한 개를 매개변수로 받는 메소드를 찾아간다
        
        drawLine('+', 30);
        //--==>> ++++++++++++++++++++++++++++++
        // char 한 개, int 한 개를 매개변수로 받는 메소드를 찾아간다
        
    }
 
    // 선을 그리는 메소드 정의
    public static void drawLine() {
        System.out.println("====================");
    }
 
    // 선의 형태를 바꾸어 그리는 메소드 정의
    public static void drawLine(char c) {
        for (int i=0;i<20;i++) {
            System.out.print(c);
        }
        System.out.println();
    }
 
    // 선의 형태와 길이를 바꾸어 그리는 메소드 정의
    public static void drawLine(char c, int n) {
        for (int i=0;i<n;i++) {
            System.out.print(c);
        }
        System.out.println();
    }
}
Colored by Color Scripter
cs

 

[특징]

- 원래 하나의 클래스 안에 동일한 이름을 가진 메소드를 정의할 수는 없다. 메소드는 '메소드명'으로 식별하기 때문.

- 그렇다고 같은 기능을 가지고 있는데 drawLine1(), drawLine2(), drawLine3()...으로 정의한다면 사용자는 몇 번의 drawLine이 원하는 기능을 가지고 있는지 모두 알아야 한다.

- 따라서 같은 기능을 가진 메소드의 이름은 같게 하여 효율성을 높이되, 매개변수의 개수와 타입을 다르게 주어서 구분하기로 한다.

 

 

○ 메소드 오버라이딩 (재정의)

- 정의 : 메소드 이름, 리턴타입, 파라미터 수나 타입이 완전히 일치해야 성공하며, 반드시 상속 관계가 있어야 한다.

 

[특징]

- 재정의된 하위 클래스의 메소드 접근제어지시자는 상위 클래스의 메소드 접근제어지시자보다 범위가 크거나 같아야 한다. (ex. 상위 클래스가 'protected'인 경우, 하위 클래스가 이 메소드를 오버라이딩 하려면 'protected' 또는 'public' 이어야 한다)

- 'static', 'final', 'private' 메소드는 오버라이딩 할 수 없다.

   static : 상속의 개념이 아니라 탄생시점 때문에 오버라이딩 불가. 클래스가 로딩되는 시점에 이미 메모리를 할당받았기 때문에 고쳐쓸 수 없다.

   final : '나 이거 오버라이딩 안시켜줄거야'라는 의미로 쓴다. 최종적으로 완료시켜놓은 메소드니까 재정의하지말라는 의미로 쓰인다.

   private : 상속을 안시켜줄거라고 지정해 놓은 접근제어자다. 아예 상속 받지 않게 해놓았기 때문에 오버라이딩은 더더욱 불가하다.

- Exception의 추가가 불가능하다.

  즉, 상위 클래스의 메소드가 가지고 있는 기존 예외 사항에 새로운 Exception을 추가하는 것은 불가능하다는 것이다. 상위 클래스의 Exception을 그대로 받아서 오버라이딩 해야 한다.

 

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
class SuperTest109 {
    private int a = 5;
    protected int b = 10;
    public int c = 20;
 
    public void write() {
        System.out.println("Super write() 메소드 : " + a + " : " + b + " : " + c);
    }
}
 
// 자식 클래스(하위 클래스, sub class)
class SubTest109 extends SuperTest109 {
    protected int b = 100;
        
    @Override
    public void write() {
        //System.out.println("Sub write() 메소드 : " + a + " : " + b + " : " + c);
        //-- 슈퍼클래스에서 선언된 변수 a 에는 접근할 수 없다.
        //   → private 변수이기 때문에...
 
        System.out.println("Sub write() 메소드 : " + b + " : " + c);
    }
}
 
// main() 메소드를 포함하는 외부의 다른 클래스
public class Test109 {
    public static void main(String[] args) {
 
        // 하위 클래스(SubTest109) 인스턴스 생성
        SubTest109 ob = new SubTest109();
 
        ob.write();
        //--==>> Sub write() 메소드 : 100 : 20
 
        System.out.println("---------------------------- 구분선");
 
        ((SuperTest109)ob).write();
        //--==>>Sub write() 메소드 : 100 : 20
        //  부모클래스로 형변환을 하더라도 오버라이딩이 되었으니까 Sub write가 나옴
    }
}  
Colored by Color Scripter
cs

- 부모 클래스인 SuperTest는 변수 a, b, c를 가지고 있으며, 자식클래스인 Test109는 b를 가지고 있다.

- 15번 Line : 어노테이션(Annotation)

- 16번 Line : 부모 클래스인 6번 Line과 완전히 일치하기 때문에 오버라이딩이 성공한다.

- 17번 Line : 단, a는 부모 클래스에서 private으로 선언되었기 때문에 접근할 수 없다.

- 32번 Line : 메소드 호출 시, 오버라이딩 성공하여 21번 Line의 출력문이 출력된다.

                 이 때, b는 가까운 자식 클래스의 변수이며, c는 부모 클래스에 public으로 선언된 변수다.

- 37번 Line : [주의] 자식클래스로 생성한 객체 ob를 (SuperTest109)ob 로 부모클래스로 형변환하였다.

                 하지만 이미 오버라이딩 되었기 때문에 32번 Line 결과와 동일하게 자식클래스로 출력된다.

  

 

@어노테이션(Annotation) : 

- 사용자의 편의를 위해 작성된다. 

- 메타데이터(기능적으로 영향을 미치지 않는 데이터)로 JDK 1.5 버전 부터 사용 가능하다.

- @Override를 쓰는 순간 상속받았다는 사실과 해당 메소드가 오버라이딩 되었다는 것을 명시할 수 있다.

- @Override를 쓰지 않아도 오류는 발생하지 않지만 오버라이딩 한 메소드는 붙이는 것을 원칙으로 한다.

- 어노테이션은 컴파일 대상으로 class파일 안에 남아있다. (//주석은 남아있지 않는다)

<정리>

[공통점]

메소드명을 같게 한다. 

 

[차이점]

오버로딩     : 파라미터의 개수나 타입을 다르게 설정한다.

오버라이딩 : 모든 모양이 똑같아야 한다. 리턴타입, 파라미터 수나 타입이 완전히 일치해야 한다. 

                        반드시 상속관계가 있어야 한다.

반응형

'스터디 > 개념정리' 카테고리의 다른 글

다형성이란?/업캐스팅/다운캐스팅/상속/java  (0) 2020.02.15
상속의 기본 개념/클래스 상속/java  (0) 2020.02.15
배열과 난수/java  (0) 2020.02.11
    '스터디/개념정리' 카테고리의 다른 글
    • 다형성이란?/업캐스팅/다운캐스팅/상속/java
    • 상속의 기본 개념/클래스 상속/java
    • 배열과 난수/java
    songdev
    songdev

    티스토리툴바