▶오버로드(Overload)
-. 원칙적으로 하나의 클래스 안에서는 동일한 이름의 메서드가 두개 이상 존재할 수 없지만, 이를 가능하게 하는 예외적인 처리 기법이다.
▶오버라이드(Override)
-. 부모클래스가 가지고 있는 기능을 자식클래스가 재정의하는 것. 상속받은 메소드를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경도 가능하다.
▶오버로드의 조건
-. 메서드 간의 파라미터의 데이터 타입이 서로 다를 경우
-. 파라미터의 갯수가 서로 다른 경우
데이터 형이 동일하고 변수의 이름이 다른 경우는 동일한 파라미터로 인식된다.
-. 데이터형의 전달 순서가 서로 다르기 때문에 오버로드 성립 가능
-. 리턴형이 다른건 오버로드의 성립에 아무런 영향을 주지 않는다.
리턴은 데이터를 호출했을 때 넘겨받는 결과값이다. 오버로드에서 중요한 것은 메서드를 호출해서 자바가 구분할 수 있느냐가 중요한 것이다.
* 오프로드는 접근 제어자도 자유롭게 지정해줘도 되는데 접근 제어자만 다르게 한다고 오버로드이 가능하지는 않다. 즉, 오버로드는 매개변수의 차이로만 구현되는 것이다. 매개변수가 다르다면 리턴 값은 다르게 지정 가능하다.
▶오버라이드의 조건
오버라이드은 부모 클래스의 메소드를 재정의하는 것이므로, 자식 클래스에서는 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 한다.
▶오버로드 사용방법
[메소드를 활용한 오버로드 사용법]
*Charactor 클래스
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
|
public class Charactor {
private String job;
private int age;
public void setProperty( String job){
this.job = job;
}
public void setProperty(int age){
this.age = age;
}
public void setProperty(String job, int age){
this.job = job;
this.age = age;
}
public void setproperty(int age, String job){
this.age = age;
this.job = job;
}
public String toStirng(){
return "Charactor [ job = " + job + "], age = [" + age + "]";
}
}
|
cs |
*Main 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Main01 {
public static void main(String[] args) {
Charactor c = new Charactor();
System.out.println(c.toStirng());
c.setProperty(19);
System.out.println(c.toStirng());
c.setProperty("회사원");
System.out.println(c. toStirng());
c.setProperty("자영업", 20);
System.out.println(c. toStirng());
}
}
|
cs |
Main클래스와 Charactor 보면 setProperty라는 동일한 메서드명이 여러개 있는 것을 확인 할 수 있다. 이는 setProperty라는 동일한 이름을 가지고 있지만 서로 다른 파라미터를 가지고있기 때문에 자바에서는 다른 객체로 인식을 하여 충돌이 나지 않는다.

또한, main메소드에서 setProperty를 출력하면 println처럼 자동으로 setProperty가 각각의 유형에 맞게 자바에 저장이 되는데 이 기능 덕분에 개발자는 property라는 본인이 불러오고싶은 대주제의 이름만 알고있으면 굳이 Charactor 클래스에 찾아가서 어떤 기능이 있는지 확인하는 번거로움이 줄어들었다.
[생성자를 활용한 오버로드 사용법]
*Member Class와 Main함수

-. 생성자는 리턴타입이 명시되지 않는 특수한 형태의 메서드이다. 즉, 리턴타입이 없는 메서드의 한 종류임으로 overload가 가능하다.
-. 생성자를 오버로드 할 경우, 생성자는 객체를 생성할 때 생성자를 어떻게 설정할지 정해기에 해당 클래스에 대해 '객체를 생성하는 방법'을 다양하게 준비할 수 있게 된다.
-. charactor은 메서드로 값을 세팅하였고 member는 생성자로 값을 세팅하였다. member는 생성자를 오버로드 해주었기 때문에 메인함수를 보면 객체를 생성하는 형태가 다양해진 점을 확인할 수 있다.
-. 기본생성자는 선택적인 부분이다. 지금은 생성자를 다양하게 생성예시를 보여주기위해 기본생성자도 만든 것이다. ()인 것은 기본생성자가 존재할때만 실행시켜준다.
[this 키워드를 활용한 오버로드 사용법]
https://songg5453.tistory.com/47
자바(java)_this와 this()
▶this란? -. 자기 자신을 의미하는 키워드 -. 클래스 안에서 this를 사용하여 "자기자신"을 표현한다. -. 이 this 키워드를 통해 클래스, 메서드 및 생성자에서 자기자신의 데이터를 업데이트하거나
songg5453.tistory.com
▶오버라이드 사용방법
Unit에는 이름이 담겨져있고 Army,Navy,AirForce에는 각각 개별의 속성이 담겨져있는 클래스 다이어그램이다. 여기서 주목해야할 부분은 attack()이다. 모두 공격이라는 속성은 공통되어있지만 육군,해군,공군의 공격방법은 모두 개인 고유의 방법이 따로 있음으로 이를 Unit이라는 공통분모로 묶을 수 없다. 같은 주제를 가지고 있지만 다른 동작을 수행해야하기때문이다. 이런 이유로 공통분모로 캡슐화하지 못 할 때 오버라이드 기능을 활용한다.
-. 부모는 Hello, 자식은 English, Korean 이라는 상속 코드가 있다. English는 Hello를 상속만 받고 Korean은 Hello를 상속을 받았고 부모클래스의 say()라는 메소드를 재구현을 한 상황이다.
-. 그래서 main 에서 say를 메소드별로 각각 출력을 하면 e.say()는 "Hello", k.say()는 "안녕하세요"라는 내용이 출력이 된다. 자식클래스(korean)가 부모(hello)와 같은 이름(say())의 메서드를 정의하고 있기 때문에 자식객체에게는 부모클래스가 정의하고 있는 메서드의 속성이 가려지게되는 것 이다.
-. 여기서 korean이 say()를 재할당(오버라이드)가 아닌 내용을 부모클래스의 "Hello"에 "안녕하세요
를추가하고싶다면 super키워드를 사용한다.
▶오버로드 사용이유
-. 사용자의 편의를 위해 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.
printIn()이라는 예시를 들어보자. 자바를 개발할 때 누군가가 출력하는 메서드 println()이라고 하는 메서드에 파라미터값을 다양하게 사용할 수 있도록 만들어두었다. 이는 println이라고 하는 메서드 명 하나에 다양한 파라미터를 수행할 수 있도록 오버로드를 해놓은 것이다. 사용하는 입장에서 어떤 데이터값을 출력하던지 간에 println()을 외우고 있으면 편하게 개발이 가능하다.
즉, 오버로드는 하나의 메서드를 호출할 수 있는 모든 경우의 수를 미리 준비하여 놓음으로서, 메서드를 만드는 측은 번거로울 수 있지만 메서드를 호출하는 측은 데이터 타입을 신경쓰지 않고 편리하게 사용할 수 있게 하기 위함이다.
-. 메소드의 이름을 절약할 수 있다.
만약 오버로드가 되어있지않고 printIn을 매개변수의 종류에 따라 다르게 지정한다면 우리는 println()구문을 입력할 때 마다 printStr, printInt 이런식으로 수많은 메소드의 이름을 정해줘야한다. 메소드나 변수의 이름등은 겹치지 않는 것이 좋기에 이름을 작성하는데 들어가는 고민과 시간을 절약하게해준다.
▶오버라이드 사용이유
자식 클래스가 부모 클래스의 메소드를 상속받아도 다른 기능을 수행하고자 하는 경우가 반드시 생긴다. 그럴 경우 사용을 하게 된다.
'국비필기노트 > Java' 카테고리의 다른 글
자바(java)_Getter & Setter (0) | 2022.03.22 |
---|---|
자바(java)_객체형변환, 객체 배열, instanceof (0) | 2022.03.21 |
객체지향 프로그래밍(인스턴스, 자바빈즈, 클래스의 분리, 상속) (0) | 2022.03.17 |
java_메서드,클래스,생성자 선언 방법 정리 (0) | 2022.03.15 |
자바(java)_생성자,super (0) | 2022.03.15 |