Java

overloading

계산기 예제로 돌아가보자. 우리의 계산기는 2개의 값(left, right)에 대한 연산(sum, avg) 만을 수행 할 수 있다. 그런데 만약 3개의 값을 대상으로 연산을 해야 한다면 어떻게 해야할까? 우선 아래와 같이 입력값을 3개 받아야 할 것이다. 

c1.setOprands(10, 20, 30);

이를 위해서 기존의 setOprands 메소드를 아래와 같은 모습을 수정한다면 2개의 입력값을 받을 수 없게 될 것이다.

public void setOprands(int left, int right, int third){
    this.left = left;
    this.right = right;
    this.third = third;
}

이런 경우 아래와 같이 메소드의 이름을 변경하면 될 것이다.

c1.setOprands2(10, 20);
c1.setOprands3(10, 20, 30);

이것도 좋은 방법이지만 매개변수의 수에 따라서 메소드의 이름이 달라지는 것은 왠지 깔끔한 방법이 아닌 것 같다. 그럼 어떻게 해야 좋을까? 코드를 보자.

package org.opentutorials.javatutorials.overloading.example1;

class Calculator{
    int left, right;
    int third = 0;
     
    public void setOprands(int left, int right){
        System.out.println("setOprands(int left, int right)");
        this.left = left;
        this.right = right;
    }
    
    public void setOprands(int left, int right, int third){
        System.out.println("setOprands(int left, int right, int third)");
    	this.left = left;
        this.right = right;
        this.third = third;
    }
    
    public void sum(){
        System.out.println(this.left+this.right+this.third);
    }
     
    public void avg(){
        System.out.println((this.left+this.right+this.third)/3);
    }
}
 
public class CalculatorDemo {
     
    public static void main(String[] args) {
         
        Calculator c1 = new Calculator();
        c1.setOprands(10, 20);
        c1.sum();       
        c1.avg();
        c1.setOprands(10, 20, 30);
        c1.sum();       
        c1.avg();
        
    }
 
}

아래는 기본 예제와의 차이점이다.

실행 결과는 아래와 같다.

setOprands(int left, int right)
30
15
setOprands(int left, int right, int third)
60
30

아래 코드를 보자.

c1.setOprands(10,20); 

이 코드의 실행 결과는 화면에 아래와 같은 메시지를 출력한다.

setOprands(int left, int right)

다음 코드를 보자.

c1.setOprands(10, 20, 30);

실행 결과는 아래와 같다.

setOprands(int left, int right, int third)

이를 통해서 알 수 있는 것은 매개변수의 숫자에 따라서 같은 이름의, 서로 다른 메소드를 호출하고 있다는 것을 알 수 있다.

이름은 같지만 시그니처는 다른 메소드를 중복으로 선언 할 수 있는 방법을 메소드 오버로딩(overloading)이라고 한다.

오버로딩의 규칙

결론적으로 말하면 메소드 오버로딩은 매개변수를 사용한다. 즉 매개변수가 다르면 이름이 같아도 서로 다른 메소드가 되는 것이다. 반면에 매개변수는 같지만 리턴타입이 다르면 오류가 발생한다. 아래의 코드를 보자.

package org.opentutorials.javatutorials.overloading.example1;
public class OverloadingDemo {
    void A (){System.out.println("void A()");}
	void A (int arg1){System.out.println("void A (int arg1)");}
	void A (String arg1){System.out.println("void A (String arg1)");}
	//int A (){System.out.println("void A()");}
	public static void main(String[] args) {
		OverloadingDemo od = new OverloadingDemo();
		od.A();
		od.A(1);
		od.A("coding everybody");
	}
}

3행과 4행의 메소드 A는 매개변수의 숫자가 다르다. 4행과 5행의 메소드 A는 인자의 숫자는 같지만 매개변수의 데이터 타입이 다르다. 이런 경우는 오버로딩이 가능하다. 메소드를 호출 할 때 전달되는 인자의 데이터 타입에 따라서 어떤 메소드를 호출할지를 자바가 판단 할 수 있기 때문이다. 하지만 메소드의 반환값은 메소드를 호출하는 시점에서 전달되지 않는 정보이기 때문에 오버로딩의 대상이 될 수 없다.

상속과 오버로딩

상속의 관계에서도 오버로딩을 사용할 수 있을까? 물론이다. 

package org.opentutorials.javatutorials.overloading.example1;
public class OverloadingDemo2 extends OverloadingDemo{
    void A (String arg1, String arg2){System.out.println("sub class : void A (String arg1, String arg2)");}
	void A (){System.out.println("sub class : void A ()");}
	public static void main(String[] args) {
		OverloadingDemo2 od = new OverloadingDemo2();
		od.A();
		od.A(1);
		od.A("coding everybody");
		od.A("coding everybody", "coding everybody");
		
	}
}

실행 결과는 아래와 같다.

sub class : void A ()
void A (int arg1)
void A (String arg1)
sub class : void A (String arg1, String arg2)

클래스 OverloadingDemo2는 OverloadingDemo을 상속 받고 있다. OverloadingDemo2의 3행에서 정의된 메소드 A는 문자열을 데이터타입으로 하는 두개의 매개변수를 가지고 있다. 이러한 형태의 변수는 부모 클래스에서는 정의되어 있지 않기 때문에 메소드 오버로딩이 되는 것이다. 반면에 4행에서 정의된 메소드 A는 매개변수가 없다. 그리고 부모 클래스에는 이미 매개변수가 없는 메소드 A가 존재한다. 이 둘은 매개변수의 형태가 같기 때문에 오버로딩이 아니라 오버라이딩에 해당한다.

overriding VS overloading

오버라이딩과 오버로딩은 용어가 참으로 헷갈린다. 당연하다. 중요한 것은 오버라이딩이 무엇이고 오버로딩이 무엇인가를 구분하는 것은 아니다. riding(올라탄다)을 이용해서 부모 클래스의 메소드의 동작방법을 변경하고, loading을 이용해서 같은 이름, 다른 매개변수의 메소드들을 여러개 만들 수 있다는 사실을 아는 것이 중요하다. 다만 학습이나 협업의 과정에서 개념을 주고 받을 때는 용어가 중요해진다. 필자의 생각에 이 개념들이 헷갈리는 이유는 over라는 공통분모 때문이다. over를 제외하고 알아두면 덜 헷갈리지 않을까 싶다. (참고로 overriding는 재정의라는 사전적인 의미가 있습니다.)

보충수업

위의 예제는 overloading을 설명하기 위한 예제일뿐 현실적이지 않다. 더 많은 값을 대상으로 연산을 해야 한다면 어떻게 해야할까? 아래와 같이 코드를 변경해보자.

package org.opentutorials.javatutorials.overloading.example1;

class Calculator{
    int[] oprands;
    
    public void setOprands(int[] oprands){
        this.oprands = oprands;
    }
    
    public void sum(){
        int total = 0;
        for(int value : this.oprands){
        	total += value;
        }
    	System.out.println(total);
    }
     
    public void avg(){
    	int total = 0;
        for(int value : this.oprands){
        	total += value;
        }
    	System.out.println(total/this.oprands.length);
    }
}
public class CalculatorDemo {
    public static void main(String[] args) {
    	Calculator c1 = new Calculator();
        c1.setOprands(new int[]{10,20});
        c1.sum();       
        c1.avg();
        c1.setOprands(new int[]{10,20,30});
        c1.sum();       
        c1.avg();   
    }
}

차이점은 아래와 같다.

위의 코드는 인자로 배열을 사용하고 있다. 이렇게하면 하나의 인자로 여러개의 값을 받을 수 있다.

댓글

댓글 본문
작성자
비밀번호
  1. ㅋㅌㅍㅊ
    보충수업에 나와있는 내용으로 오버라이딩이 안되요
    class Calculator{
    int[] oprands;
    int total;

    public void setOprands(int[] oprands){
    this.oprands = oprands;
    }

    public void sum(){
    int total = 0;
    for(int value : this.oprands){
    total += value;
    }
    System.out.println(total);
    }

    public void avg(){
    int total = 0;
    for(int value : this.oprands){
    total += value;
    }
    System.out.println(total/this.oprands.length);
    }
    }
    class CalculatorParent extends Calculator{
    public void sum() {
    System.out.println("입니다");
    }
    }
    public class dadsd {
    public static void main(String[] args) {
    Calculator c1 = new Calculator();
    c1.setOprands(new int[]{10,20});
    c1.sum();
    c1.avg();
    c1.setOprands(new int[]{10,20,30});
    c1.sum();
    c1.avg();
    }
    }
  2. LuiGee
    sum과 avg 메소드를 보시면 third값을 포함해서 계산하도록 바뀌었습니다. setOprands 메소드가 매개변수를 2개를 받든 3개를 받든 계산이 제대로 되기 위해서 일부러 third의 값을 0으로 지정하신 것으로 생각합니다.

    그런데 이 질문에 대답하기 위해 검색하고 코드를 분석하다보니 몇 가지를 알게 되었습니다.

    1. 사실 말씀하신 대로 int left, right, third;로 선언하셔도 똑같이 작동합니다. Java에서는 int에 별다른 값을 지정해주지 않으면 일단 0이라는 값을 부여하기 때문입니다.

    2. 예제에서는 setOprands(10, 20)을 먼저 사용하고 setOprands(10, 20, 30)을 그 다음에 사용합니다. 이 경우에는 문제 없이 작동하지만 이 둘의 순서를 바꾸면 문제가 발생합니다. 바로 setOprands(10, 20)을 해도 여전히 값이 setOprands(10, 20, 30)을 했을 때와 똑같다는 것입니다. (int left, right, third; 선언도 마찬가지입니다.)

    이 이유는 third 값에 setOprands(10,20,30)을 통해 30이 할당되고 초기화가 되지 않기 때문입니다. 즉 원래 의도였던 third의 초기화가 생각대로 작동하지 않는 것 같습니다. 이를 위해

    public void setOprands(int left, int right) {
    System.out.println("setOprands(int left, int right)");
    this.left = left;
    this.right = right;
    this.third = 0;
    }

    이렇게 third에 0을 할당하도록 코드를 추가해주면 순서를 바꿔도 문제 없이 값을 출력합니다. 매개변수를 두개만 받으면 매번 third값을 0으로 수정해주는 것이죠.

    혹시나 더 깊게 담긴 의도를 모르고 하는 말일 수 있겠지만 이고잉님이 오버로딩 개념을 설명하기 위해 비현실적이고 인위적인 케이스를 보여주시려다가 미처 체크 못하고 넘어가신 부분일 수 있지 않을까 생각합니다.
    대화보기
    • 웅이
      위 첫번째 강의 예제소스코드를 보면
      class Calculator{
      int left, right;
      int third = 0;
      3,4,5 라인에 이런 코드가 있습니다.
      입력값을 10,20,30 으로 입력하듯이
      위 라인에서도 int left, right, third 이렇게 선언 할 수 있을 것 같은데,
      두 방법이 차이가 있는것인가요?
      그리고 setOprands의 입력값을 받을 매개변수를 선언하는것을 넘어
      int left, right와는 다르게 0이라는 값을 할당 하는 이유는 뭔가요?
      나중에 다른값을 입력값으로 받으면 그냥 덮어쓰기가 되는부분이라 상관없는건가요?
    • ShinHi
      public class CalculatorDemo {

      public static void main(String[] args) {

      Calculator c1 = new Calculator();
      c1.setOprands(10, 20);
      c1.sum();
      c1.avg();
      //System.out.println(good);
      c1.setOprands(10, 20, 0);
      c1.sum();
      c1.avg();

      }

      }

      여기서 혹시

      public class CalculatorDemo {

      public static void main(String[] args) {

      Calculator c1 = new Calculator();
      c1.setOprands(10, 20);
      c1.sum();
      c1.avg();
      //System.out.println(good);
      c1.setOprands(10, 20, 0);
      c1.sum();
      c1.avg();
      c1.setOprands(30, 40);
      c1.sum();
      c1.avg();

      }

      }

      처럼

      c1.setOprands(30, 40);
      c1.sum();
      c1.avg();

      이 코드가 한 번 더 필요할 경우 String good의 변수값이

      "three" 에서 "" 값으로 변환되는 코드가 없기 때문에

      public void setOprands(int left, int right){
      System.out.println("setOprands(int left, int right)");
      this.left = left;
      this.right = right;
      this.good="";
      }

      같은 방법으로 코드를 작성하면 더 나은 방법이 아닐까 생각해봤습니다.
      대화보기
      • chang26
        //강의의 예제에서는 평균값을 구하는 부분에서 허점이 있다. 그래서 조건문을 이용해서 해결!!

        package org.opentutorials.javatutorials.overloading;

        class Calculator{
        int left, right;
        int third = 0;
        String good ="";

        public void setOprands(int left, int right){
        System.out.println("setOprands(int left, int right)");
        this.left = left;
        this.right = right;
        }

        public void setOprands(int left, int right, int third){
        System.out.println("setOprands(int left, int right, int third)");
        this.left = left;
        this.right = right;
        this.third = third;
        good = "three";
        }

        public void sum(){
        System.out.println(this.left+this.right+this.third);
        }

        public void avg(){
        if(good.equals("")) {
        System.out.println((this.left+this.right+this.third)/2);
        }else if(good.equals("three")) {
        System.out.println((this.left+this.right+this.third)/3);
        }
        }
        }

        public class CalculatorDemo {

        public static void main(String[] args) {

        Calculator c1 = new Calculator();
        c1.setOprands(10, 20);
        c1.sum();
        c1.avg();
        //System.out.println(good);
        c1.setOprands(10, 20, 0);
        c1.sum();
        c1.avg();

        }

        }

        이렇게 하면 원하시는 결과를 얻으실수 있습니다. 다른분들도 참고해주세요

        setOprands(int left, int right)
        30
        15
        setOprands(int left, int right, int third)
        30
        10
        대화보기
        • hi개발자
          18.10.10 공부완료
        • for each문과 연산자 논리연산자 복습추천드립니다
          조건문이 만족할때까지 좌항에 우항을더하는부분입니다
          대화보기
          • 잘 보시면 int [] oprands; 는 class Calculator 직속입니다
            대화보기
            • 학생01
              마지막 보충수업부분 정말 새롭네요. 강의내용잘 보고있습니다.
            • 전민희
              보충수업은 따로 동영상 수업이 없나요? ㅠㅠ 혼자 하려니 너무 힘드네요
            • 보충수업을 안보긴했는데 글에서 어느부분을 모르시겠다는 건지 모르겠네요 혹시 for-each문을 모르시는건가요 교육자님이 설명해주셨는데
              대화보기
              • 아뇨
                대화보기
                • 변수는 어때요
                  3이 상수이기 때문에 재사용할 수 없는 것이니까 3 대신 변수를 넣으면 어떨까요?
                  생성자 내부에 변수를 매개변수 개수만큼의 값으로 초기화 해주면 적당할 것 같습니다.
                  대화보기
                  • 질문드려요
                    굳이 setoprands 에 this.를 해줘야 하나요?
                  • jsm5272
                    마지막 보충수업에서
                    public void sum(){
                    int total = 0;
                    for(int value : this.oprands){
                    total += value;
                    }
                    System.out.println(total);
                    }

                    이게 어떻게 동작해서

                    public class CalculatorDemo {
                    public static void main(String[] args) {
                    Calculator c1 = new Calculator();
                    c1.setOprands(new int[]{10,20});
                    c1.sum();

                    이거에 해당되는 값이 30되는지 영상이나 글로 설명좀 부탁드리겠습니다.
                    total +=value; 이게 total = total + value 값인거는 검색을 통해 찾았는데
                    어떤식으로해서 동작하는지 자세하게 좀 알고싶습니다.
                  • 자바배우고싶어요
                    자바를 알려주셔서 감사합니다.
                    오버로딩 공부를 하면서 의문점이 생겼습니다.

                    매개변수를 하나를 추가하여 sum()함수 재사용성을 위해

                    public void sum()
                    {
                    System.out.println(left + right + third);
                    }

                    하는 것은 맞지만 avg()함수의 경우
                    public void avg()
                    {
                    System.out.println((left + right + third) / 3);
                    }

                    만일 값을 두개를 넣고 평균을 구하게 되면 3개의 평균값이 나오게 됩니다.
                    avg() 메소드를 오버로딩으로 매개변수를 구별하기 위해
                    public void avg(int left, int right)
                    public void avg(int left, int right, int third)
                    이렇게 오버로딩을 해도 될까요?
                  • 이태호
                    7/7
                    오버로딩이란 같은 매소드 이름과
                    다른 파라미터의 수 또는 파라미터의 다른 데이터 타입
                  • 멀캠A_Son
                    완료
                  • 싹둑
                    실행결과가
                    setOprands(int left, int right)
                    30
                    15
                    가 아니라
                    setOprands(int left, int right)
                    30
                    10
                    입니다
                  • 하루
                    ..? 뭐하시는 분이지..

                    마지막에 설명하실 때에, 영어단어 강의를 하신게 아니라
                    많은 혼동을 경험하게 되는 입문자, 초보자 분들을 배려하여
                    쉽게 외울 수 있는 방법을 알려주신 것 이죠. 하나하나 그렇게 영어단어 따져가면서 공부하시는 건
                    그쪽의 방법이고, 영어단어를 알아도 햇갈리는 분들이 많다는 판단하에 본인만의 소중한 노하우 또는
                    어떻게 하면 강의를 듣는 사람들이 쉽게 기억할까 라고 힘들게 생각하시고 꿀팁의 느낌으로 강의해주신
                    느낌이 강한데.. 프로 불편러도 아니고 어떻게 일상생활 하시는지 모르겠네요.

                    저 영어강사 에요.

                    중학교 아이들한테 be동사가 없는 의문문을 강의할 때,
                    일반동사가 도와주세요~ Do와주세요~ 해서 Do = 두가 앞으로 오는거다
                    라고 강의하는데. 그럼 발음 틀렸으니까 제 강의는 잘못된 강의에요?

                    공격적인 글에는 공격적인 반론밖에 받을 수 없는 점 알고계시구요.

                    힘들게 강의해주시고, 알기쉽게 강의해주시는 선생님이자 개발 선배님인 이고잉님에게
                    입문자로써 진심으로 감사의 말씀 전하며 마무리 할게요.
                    대화보기
                    • 아니 over라는뜻을 가진 단어랑 ride의 뜻을가진 단어를 합쳐서 만든단어인데
                      위에 + 타다 의 의미로 쓰이는 단어죠
                      대화보기
                      • 공동공구
                        <잘못된 인터넷 예절>
                        영어를 잘 못하시는 것 같아요
                        override랑 overload에서 over는 뗐다 붙였다 하는 접미사가 아닙니다.
                        override에서 over가 떨어지면 무슨 ride가 되어서 올라탄다라는 뜻이 되는거라고 설명하셨는데
                        전혀 아니고요

                        <수정>
                        제가 아는 바에 의하면 override와 overload는 over가 분리될 수 있는 접두사가 아닙니다.
                        (중략)
                        혹시라도 이 수업을 보는 다른 분들이 혼동을 느끼실 수도 있어 노파심에 댓글 남깁니다.
                        ------------------------------------------------
                        일단 제기하신 이의는 내용도 전혀 틀리고 제3자 입장에서도 기분이 나빠지는 공격적인 댓글이네요.
                        누군가가 글쓴분에게 프로그래밍을 잘 모르시는 것 같아요;; 라고 시작한다면 글쓴분은 어떤 기분일까요?
                        글쓴 분께서는 심지어 접두사인 Over를 접미사라고도 쓰셨네요.
                        본인의 댓글이 오히려 다른 사람들의 혼란을 일으키는 듯 합니다.
                        (over+ride로 생겨난 단어가 맞는데 이 건 다른 분이 잘 설명해주셔서 스킵합니다.)
                        무엇보다도 인터넷 할 때 예절을 좀 지키셨음 좋겠네요.
                        대화보기
                        • 5월 3일 오버로딩 밑에 예제는 다시 한번 더 체크해보자!
                        • 감사합니다~ 잘 봤습니다~
                        • wn9457
                          인성을 뭐라할만큼 삐뚤어진글은 아닌거같은데
                          대화보기
                          • popinbompin
                          • youyou
                            감사합니다^^
                          • dptmdlwm
                            이고이닝 언제쯤 이강의 오류가 잡히나요?
                          • Seokhee Han
                            가르쳐주는 분한데 댓글 태도가 이게 뭡니까?
                          • Seokhee Han
                            overriding : 부모 클래스 메소드의 형식은 그대로 인데 { } 내용이 다름.
                            overloading : 부모 클래스 메소드의 형식 중 매개변수가 다름.
                          • Seokhee Han
                            2번 동영상에 overloading, overriding 을 반대로 말하신거 같습니다.
                          • 1234
                            영어단어 따지지말고 자바 공부나해라ㅋㅋㅋㅋㅋㅋ 꼭 못하는 사람들이 그런거에 집착하더라
                          • 개발자가 되고싶은 고등학생
                            riding(올라탄다) : 부모 클래스의 메소드의 동작방법을 변경하고
                            loading : 같은 이름, 다른 매개변수의 메소드들을 여러개 만들 수 있다
                          • 한발개발세발
                            오버라이딩 : 클래스 상속
                            오버로딩 : 같은 이름, 다른 매게변수일 때 상속
                          • Younghun Liam Youn
                            댓글에서 풍기는 어투의 수준이... 인성을 가늠하게 하네요.
                            대화보기
                            • zugi
                              완료.!
                            • 메소드의 리턴타입만으로 컴파일러가 어떤 메소드를 호출할 지 정보가 충분하지 않기 때문에 오버로딩 대상이 안 되는게 맞죠. 정확한 설계를 위해서는 컴파일러가 구분할 수 있어야 하고 그렇게 해야 코드의 정확도가 높아지죠. 그건 어차피 IDE가 처리해 줄테니..

                              리턴타입은 메소드 시그니처가 아닙니다.
                              결국 리턴타입은 메소드를 구분할 수 있는 시그니처가 아니라는 뜻이에요.
                              컴파일러가 메소드 시그니처가 아닌 리턴타입만으로 메소드를 구분할 수 없어요.

                              메소드 시그니처가 같다는 말은 메소드의 이름과 파라미터(개수와 타입)가 같다는 걸 의미하죠.
                              메소드 이름이 같지만 시그니처가 다르다는 말은 결국 파라미터가 다른 거지 리턴타입과는 상관 없습니다.
                              당연히 이름이 서로 다른 메소드는 메소드 시그니처가 다른 것이죠.
                              오버로딩이라는 개념은 메소드 명이 같은 메소드에 대해 적용하는 것입니다.
                              그렇다면 메소드 명은 동일하지만 리턴타입과 파라미터가 다른 두 메소드에 대해 오버로딩이 적용가능할까요.
                              파라미터가 다르기 때문에 즉 메소드 시그니처가 다르기 때문에 오버로딩이 적용가능합니다.
                              https://ideone.com/2TjUBH

                              오버로딩 적용 대상이라는 것을 구분하기 위해 중요한 건 리턴타입이 아니라 메소드 시그니처입니다.

                              결론은
                              오버로딩은 시그니처가 다른 메소드에 대해서만 적용 대상입니다.
                              리턴 타입만 다르고 이름, 파라미터가 같은 메소드는 메소드 시그니처가 같기 때문에 오버로딩 대상이 아닙니다.
                              오버로딩의 조건이 리턴타입이 같아야 된다는 뜻이 아니고
                              리턴타입만 다른 메소드는 오버로딩의 적용 대상이 아니라는 뜻입니다.


                              'The compiler does not consider return type when differentiating methods, so you cannot declare two methods with the same signature even if they have a different return type.'

                              https://docs.oracle.com......4.2
                              https://docs.oracle.com......tml

                              오버로딩에 대해 무작정 아는 것 보다 메소드 시그니처가 뭔지 아는게 중요하겠네요.
                              대화보기
                              • 무슨 영어 단어 강의도 아니고 웃기네요
                                단어라는게 기존 의미가 파생되서 새로운 의미가 만들어지는게 많은데
                                over랑 ride랑 뗐다 붙였다 하는 게 아니라는건 어디서 확신하시나요?

                                검색 몇번만 해도 over + ride로 의미가 생성되었고
                                ride라는 단어의 의미와 형태가 override 단어 생성의 일부라는걸 알 수 있는데요;
                                https://en.wiktionary.org......ide

                                Etymology 찾아보는게 뭐어렵다고...

                                딱봐도 첫 번째 의미인 올라타다라는 의미랑 객체지향 프로그래밍에서의 오버라이딩이라는 의미가 상관성 있어 보이는데 오역이라느니 뜻에 대해 잘 모른다고 한다는 이상한 의견이 웃기네요.

                                누가 누구보고 잘 모른다고하는건지 참
                                대화보기
                                • 박경호
                                  좋은강의 잘들었습니다
                                • egoing
                                  앗 그렇군요. 정정해주셔서 감사합니다. 더 정확한 표현을 사용할 수 있도록 노력하겠습니다. 본문에 재정의라는 사전적인 의미도 추가했습니다. :)
                                  대화보기
                                  • 밑에 댓글들 대충 훑어보니까 특히 riding 탄다 <- 는 식의 해석이 엄청난 악영향을 미치고 있길래;;;;;;;;;
                                    대화보기
                                    • 영어를 잘 못하시는 것 같아요
                                      override랑 overload에서 over는 뗐다 붙였다 하는 접미사가 아닙니다.
                                      override에서 over가 떨어지면 무슨 ride가 되어서 올라탄다라는 뜻이 되는거라고 설명하셨는데
                                      전혀 아니고요
                                      macmillan같은 영영사전을 찾아보시면 override의 두번째 뜻으로
                                      재정의한다는 내용의 영영사전 풀이가 적혀있습니다.
                                      영어 단어는 한개의 단어가 여러가지 뜻을 갖고 있는 경우가 90%이상인데
                                      각각의 뜻이 서로 비슷한 경우도 있지만 서로 전.혀. 다른 뜻인 경우가 더 많습니다;
                                      뜻에 대해서 잘 모르시면서 저렇게 혼동되게 설명하시는 점은.. 지양되어야 하지 않을까요?
                                      가뜩이나 영어를 오역하는 바람에 한국어로 된 개발 언어 공부에 엄청난 어려움을 느끼는 분들이 많은 것을 감안하면
                                      영향력있으시고 유명한 생활코딩의 강사분께서 이런 잘못된 설명을 하시면..;
                                      다른 개념들은 초보자들에게 도움이 되게 설명해주시니까 감사한 마음이 더 크지만 혹시 이 댓글을 보게될 다른 분들이 오역이었다는 것을 알았으면 좋겠단 마음에 남기고 갑니다.
                                    • C언어만마스터
                                      제가 이해한 개념

                                      오버라이딩 : 부모 클래스의 메소드를 수정하여 사용할 필요가 있을때 사용하는것
                                      오버로딩 : 메소드의 이름이 같더라도 파라미터가 다르다면 다른 메소드로 인식하는것
                                      댓글들을 살펴보니 오버로딩에서 리턴타입이 달라도 오버로딩이 가능하다는것 같음.

                                      뭔가 틀린게 있다면 알려주세요. 자바열공!
                                    • ktg9114
                                      저 또한 보람차게님과 같은 생각이네요~~ ^^
                                      대화보기
                                      • 빛나는여름
                                        역시 개념이 어려워질수록 이상과 현실의 괴리가 중도포기를 불러오는 것 같네요 ㅋㅋㅋ
                                        언어소개는 조회수가 14만인데 이번 강의는 1.4만입니다.
                                        대화보기
                                        • yoon88
                                          완료/다시보기 어려움...
                                        • sealwind
                                          sum()과 avg()의 중복을 없애려면 이렇게 수정하면 어떤가요?

                                          public int sum() {
                                          int total = 0;
                                          for(int value : this.operands) {
                                          total += value;
                                          }
                                          return total;
                                          }
                                          public int avg() {
                                          return this.sum()/this.operands.length;
                                          }

                                          출력부분에 System.out.println 을 추가하구요~
                                        • 미림_likelion
                                          수강 완료했습니다. 감사합니다.
                                        • 이준열
                                          정리해주신 개념이 많이 도움됬어요 감사합니다!
                                          대화보기
                                          • 서영기
                                            안녕하세요, 생활코딩 강사님.
                                            오버로딩 두 번째 동영상 강좌에서 오버로딩과 오버라이딩의 개념의 차이를 설명하시려다가 조금의 혼동이 오신 거 같습니다.

                                            오버로딩의 조건을 설명하실 때 나온 오버로딩 시, 리턴값 타입 일치 여부는 상관없는 걸로 알고 있습니다. 위의 동영상 첫 번째 예제에서 에러가 나는데 그 에러 메시지는 "Duplicate method A() in type"으로 A()라는 메써드의 리턴타입이 아니라, 같은 메써드 타입을 중복 사용했기 때문이라고 알려주고 있습니다. 즉, 오버로딩은 이름이 같은 메써드의 서로 다른 타입의 매개변수를 덮어쓰기 위함인데, 매개변수 형식(시그니쳐)이 동일하면 오버로딩이 되지 않기 때문입니다. 위의 예제에서 A() 메써드 앞의 리턴값 타입 int를 void로 수정해도 빨간 줄은 계속 그여져 있고 실행값은 6행의 A() 메써드의 코딩내용이 그대로 출력됩니다. 컴파일 전에 에러가 표시되었는데도 불구하고 출력되는 까닭을 모르겠는데, 이것에 대한 답변 부탁드립니다.

                                            저는 오버라이딩과 오버로딩의 개념을 이렇게 잡았습니다. 오버라이딩은 메써드끼리의 메써드 내의 코딩 내용을 덮어쓰기를 위한 기능이며, 오버로딩은 메써드에 전달하는 매개변수의 형식(시그니쳐)를 덮어쓰기 위한 기능으로 구분했습니다. 그래서 이전의 메써드를 갈아 타는데(riding)는 메써드의 규정된 형식(매개변수 시그니쳐, 리턴 타입)이 모두 동일해야 이후의 새로 생성할 메써드 내의 코딩으로 덮어쓸 수 있으며, 매써드의 형식을 새롭게 부르기(loading) 위해서는 리턴 타입과 메써드 내의 코딩 내용과는 관계없이 단지 그 형식(매개변수와 인자)의 종류, 순서 그리고 개수가 달라야 하기 때문입니다.

                                            지금까지 오버로딩에 대해서 이 동영상을 보고 개념을 잡는 사람들은 전부 강사님의 말대로 개념을 잡을 수 있기 때문에 아래 댓글의 근거를 통해서도 확인을 해주시고 빠른 시일 내에 수정되었으면 합니다. 감사합니다.
                                          버전 관리
                                          egoing
                                          현재 버전
                                          선택 버전
                                          graphittie 자세히 보기