Back-end/JAVA,Spring

오버로딩 overloading VS 오버라이딩 overriding

cheersHena 2018. 6. 2. 22:25
반응형
오버로딩 overloading (different parameters)
메서드의 이름이 같지만 매개변수가 다른 메서드.
한 클래스 내에 이미 사용하려는 이름과 같은 이름의 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의하는 것

오버로딩의 조건
-메서드 이름이 같아야 한다.
-매개변수의 개수 or 매개변수의 타입이 달라야 한다.

오버로딩의 예시.
1.다른 매체를 입력받아 같은 방식의 출금을 한다.
   ->   카드를 입력받아 출금을 한다. : 카드출금()
          통장을 입력받아 출금을 한다. : 통장출금()
          메신저를 통해서 출금을 한다. : 메신저출금()
  = 출금(카드), 출금(통장), 출금(메신저)

2. 출력시 자주사용하는 Arrays.toString ,println 등등도 오버로딩사용. 다른 타입을 통일하게 출력.

3. 오버로딩이 아닌 예시.
   int add (int a, int b)
   int add (int x, int y) 의 경우 오버로딩으로 취급되지 않음
 -> 매개변수의 이름은 다르지만 타입은 똑같으므로 오버로딩이 아니다. 매개변수 이름과는 상관이 없음

   int add (int a, int b)
   long add(int a, int b) 오버로딩으로 취급되지 않음 ->반환타입만 다른 경우도 상관이 없음.
* 같은 메서드 이름에서 반환타입은 같던 다르던 상관 없다. 
매개변수의 타입 or 개수가 달라야함.

오버로딩의 장점
메서드의 기능은 같은데 다른 변수를 받아 일을 할 경우 이름을 각자 정의하여 처리하는 것보다 하나로 합쳐 처리하는 것이 가능하다.


오버라이딩 overriding (like customizing)
조상클래스로부터 상속받은 메서드의 내용을 변경하는것.
자손클래의 자신에게 맞게 변경해야하는 경우 조상의 메서드를 오버라이딩 하는것.
즉, 구현부를 변경.
* override 사전적 의미: ~위에 덮어쓰다.(=overwrite)

오버라이딩의 조건
- 선언부가 같다 
즉, 메서드명, 매개변수, 반환타입은 같다.
but, 
- 구현부는 다르다. : 마음대로 알아서 변경가능. 

정리.
오버로딩               vs        오버라이딩 
: 매개변수를 뭘 줄지모르니                                 : 내용 알아서 구현해서 쓰라.
  다 만들어 놓았다.! 




생성자 Constructor


객체 생성시 호출되는 인스턴스 초기화 메서드.

인스턴스 변수 초기화 작업에 사용되며 인스턴스 생성시 실행되어야 할 작업 위해 사용됨.

생성자 구조: 

메서드와 유사하지만 리턴값이 없음! 메서는 리턴값이 없는경우 반환타입에 void를 써야하지만 생성자는 void를 사용하지도 않는다. 

생성자 조건 

1. 클래스의 이름과 같아야한다. 생성자 이름 = 클래스 이름 

2. 리턴값이 없음.

*연산자 new가 인스턴스 생성함. 

생성자는 인스턴스를 생성하는건 아니다. 단순히 인스턴스 변수를 초기화시키는 특수메서드이다.

e.g) Card c = new Card;

객체를 생성할 때 값을 초기화하기 위해 사용한다.
ex) 차량을 만들때 색상 옵션을 지정 할테니 이렇게 달라 요구

class 차량 {
    String color = "빨강";
    int tireInch = 15;
    차량(){  }            //기본 생성자, 매개변수가 없는 생성자
    차량(String c){   // 매개변수가 있는 생성자
       color = c;
     }
     차량(String c, int inch){
        color = c;
        tireInch = inch;
      }
     차량(int inch){
       tireInch = inch;
      }
}
차량 내차 = new 차량("파랑",19);
차량 아버지차 = new 차량(17);
차량 동생차 = new 차량();

매개변수가 있는 생성자를 만들기 위해서는 기본 생성자도 만들어 주어야 한다.
모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다.
하나도 정의되지 않았을 경우에는 컴파일러가 기본생성자를 추가한다.

참조변수 this

인스턴스(객체) 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.
모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

class 차량 {
    String color = "빨강";
차량(String color){   
       this.color = color; //자기 자신의 클래스의 color에 지역변수 color의 값을 넣어줌
     }
}
this.color는 인스턴스변수이고 color는 생성자의 매개변수로 정의된 지역변수로 서로 구별이 가능하다.
color=color로 선언시 둘다 지역변수로 취급.

class 차량
    String color; (= "빨강";)
    int tireInch; (= 15;)

 차량(){ 
   color = "빨강";
   tireInch = 15;
   }   

기본 연산자에 지정하는 것은 class에 직접 지정하는 것과 같은 옵션이 된다.
단 기본 연산자에 지정한 쪽이 더 우선된다. 기본연산자에서는 입력받지않는게 좋음.

변수의 초기화 p.300

경우에 따라서 필수적이기도 하고 선택적이기도 하지만, 가능하면 선언과 동시에 적절한 값으로 초기화 하는 것이 바람직하다.
멤버변수는 초기화를 하지 않아도 자동적으로 기본값으로 초기화 해주나 지역변수는 사용하기 전에 반드시 초기화 해야한다.

멤버변수의 초기화 방법 ->
1.명시적 초기화: 선언과 동시에 초기화.
ex) 기본형 변수 초기화: int door = 4; //직접적인 값 대입.
     참조형 변수 초기화:  Engine e = new Engine();  // 주소값 대입.
2.생성자 
3.초기화 블럭(잘 사용하지 않음)

class 차량{
  String color;
  int tireInch;
}
인스턴스 변수에는 기본값을 입력하나 null에는 주소가 존재하지 않으므로 기본 생성자이외의 생성자에서 값을 변경하는 것이 불가능하다.



반응형