태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

[안드로이드를 위한 자바] 오버로딩(Overloading), 오버라이딩(Overriding)의 이해

2009.05.20 23:11


학교에서 처음 수업시간에 자바라는 언어를 반학기 정도(?) 접한 이후 "이놈 괜찮은데?" 하는 생각이 들어 따로 자바를 공부하면서 이것저것 해보고, SCJP 딴다고 한참 자바공부를 할 때가 있었는데~ 세월이 세월인지라, 그리고 하도(!) 써먹지를 않아서 기억이 가물가물~ 하네요.

  그래도 다행이도 안드로이드라는 놈을 접하게 되면서 자연히 자바 공부도 다시 시작하게 되었고, 예전의 기억들도 조금씩(?)은 제 자리를 찾아오고 있습니다 ^^;

안드로이드를 공부하다보니, 의외로 자바에 대한 기초 지식 (조금 더 나아가서는 중급 이상의 지식)이 없으면 안드로이드 자체를 이해하기가 어려워지더군요. 그래서, 앞으로 조금씩 안드로이드를 공부하기 위해 필요한 자바 기초 지식에 대해 한두개씩 정리해나가 보려고 합니다.

영광스러운(?) 첫 강의를 장식할 주제는 바로 오버로딩(Overloading)오버라이딩(Overriding)입니다.
처음 오버로딩과 오버라이딩이라는 용어를 접했을 때, 말도 비슷비슷하고~ 얼핏 보기에 하는 일도 비슷비슷한 것 같아서 이게 뭐여~ 하는 생각이 많이 들었습니다. ^^; 하지만, 자세히 들어가보면 오버로딩과 오버라이딩은 완전히 다른 개념이지요~
그럼, 하나씩 살펴보도록 하겠습니다.


  • 오버로딩
    오버로딩은 한 클래스 내에서 같은 이름의 메소드를 여러개 정의하는 것을 의미합니다.
    예를 들면, 더하기를 해주는 메소드 add()에는 정수형 변수를 처리해주는 int add(int a, int b) 가 있을 수도 있고, 실수형 변수를 처리해주는 double add(double a, double b) 가 있을 수도 있습니다.
    이 두 메소드의 이름은 모두 add()로 동일하며, add()메소드를 호출시에는 변수의 인자형에 따라 적절히 int add() 메소드가 호출될 수도, double add()가 호출될 수도 있지요.
    class Calc{
       int add(int a, int b); // 정수형 변수를 처리하는 메소드입니다.
       double add(double a, double b); // 실수형 변수를 처리하는 메소드입니다.
       // 위 두 개의 메소드는 오버로딩된 상태입니다.
    }
    

    오버로딩에는 몇 가지 조건이 있습니다. 

    1. 오버로딩한 메소드들은 같은 클래스 내에 존재해야 하며, 같은 이름을 가져야 합니다.
    2. 오버로딩한 메소드들은 형(type)이 서로 다르거나 매개변수의 개수가 달라야 합니다.

    따라서, int add(int a, int b, int c) 와 int add(int a, int b) 메소드는 서로 매개변수의 개수가 다르기에 오버로딩이 가능하지만 int add(int a, int b)와 int add(int one, int two) 는 매개변수의 개수도 같고, 인자형도 같기에 오버로딩이 불가능합니다.

 


  • 오버라이딩
    오버라이딩은 상속 관계에 있는 두 클래스 중, 하위 클래스에서 상위 클래스의 메소드를 재정의하는 것을 의미합니다.
    오버라이딩이야말로 안드로이드 어플리케이션 개발에 있어서 가장 자주 쓰이는 기술이 아닐까 싶네요. 하다못해 액티비티 하나라도 띄우려면 onCreate()메소드를 오버라이딩 해야하니까요~
    @Override // Activity 클래스의 onCreate()메소드를 재정의합니다.
    public void onCreate(Bundle savedInstanceState){
       super.onCreate(savedInstanceState); // 본래의 onCreate()메소드를 호출합니다.
       // 이 아래로는 사용자가 원하는 기능을 구현하는 부분입니다.
       setContentView(R.layout.main);
       TextView myText = new TextView(this);
       myText.setText("Hello, Android!");
    }
    

    위에서 super.onCreate() 메소드를 호출함으로써, 상위 클래스에서 본래 수행하던 기능을 수행할 수 있습니다.
    그 이후로는 사용자가 필요로 하는 기능들을 추가해주면 됩니다.
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

커니 프로그래밍 이야기 , , , , , , , , ,

  1. Blog Icon
    therexist

    특징을 꼽으라 하면 말하기 애매한데 정리를 잘 해주셨네요.
    더 정리를 하여 오버라이딩의 특징을 정리하자면
    1. 오버라이딩한 메소드들은 형(type)이 같고, 매개변수의 개수가 슈퍼클래스와 같아야 합니다.
    2. return 타입도 슈퍼클래스와 같아야 합니다.
    3. 접근제한자가 같거나 더 넓어야 한다.
    가 되겠네요.
    글 잘 보고있습니다.

  2. 앗~ 내용에 추가하려던 것들인데, 빼먹었었네요(..)
    감사합니다 :)

  3. Blog Icon
    씨라토

    좋은 내용 감사합니다 ^^

  4. Blog Icon
    ㅇㅋ

    잘보았습니다. 그런데
    같은 이름의 클래스를 여러개 정의하는 것을 의미합니다 -> 같은 이름의 메소드를 여러개 정의하는 것을 의미합니다
    이렇게 바꾸어야 할 거 같네요~

  5. 앗.. 수정하였습니다:)

  6. Blog Icon

    비밀댓글입니다

  7. 명쾌한 해석이었습니다... ^^
    자바 뉴비로 부터... ㅠㅠ

  8. 오버라이드인 경우 꼭 super.onCreate(); 라인 밑에다가 자신이 해야할 일들을 작성해야 하는 이유가 있나요?
    작성된 소스들을 보거나 실제로 해봐도 그전이나 그후에 해도 작동에 차이를 안보이는 듯했습니다.
    또한 이클립스에서 오버라이드를 하면 TODO주석이 super라인 전에 달립니다.
    먼저 부모 메소드의 일을 진행하고 내일을 하는 것과 내일을 하고 부모일을 진행하는 것 어떤 차이가 있는지요?
    쓰다보니 먼가 따지듯이 적은 것 같지만 정말 궁금해서 댓글 남겨봅니다.

  9. 결론부터 말씀드리자면 상황에 따라 다 다릅니다.
    구현에 따라 부모 메서드를 먼저 호출하지 않으면 제대로 동작하지 않는 것도 있을 것이고, 어떤 경우에는 상황에 따라 자식 메서드와 부모 메서드 둘 중 하나만을 호출하도록 할 수도 있습니다.

    간단히 예를 들자면

    if(condition){ // 어떤 상황에선
    // 자식 메서드의 구현으로 처리하지만
    }else{ // 그 밖의 상황은
    super.method(); // 부모 메서드의 방식 사용
    }

    이렇게 구현될 수도 있겠죠.

    액티비티의 Lifecycle 메서드를 오버라이드 할 때, 일반적으로는 순서를 바꿔도 별 상관이 없지만 액티비티 상태 저장/복귀가 일어나는 경우 순서를 바꾸면 오동작할 가능성이 있습니다. 때문에 개인적으로 부모 메서드 호출을 가장 먼저 하는 것을 권장합니다.

  10. 답변 정말 감사합니다^^

  11. Blog Icon
    Jaballet

    책보다 이해가 쉽고 명확한 설명 감사합니다..