일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 게시판
- toString
- http://jeonghwan-kim.github.io/dev/2019/06/25/react-ts.html
- 출처 : https://webdir.tistory.com/506
- object
- 출처 : https://joshua1988.github.io/web-development/javascript/promise-for-beginners/
- https://velog.io/@velopert/create-typescript-react-component
- Today
- Total
Back Ground
오버라이딩/오버로딩 본문
오버라이딩(Overriding) - 재 정의 -
상속관계에 있을 때 부모로 부터 상속받은 기능
즉, 메서드가 기능적으로 불필요한 경우에 자식클래스가 다시 정의하는 것을 말한다.
■ 오버라이딩의 규칙
자식클래스에서 오버라이딩하는 메서드는 부모클래스의 메서드와 - 이름이 같아야 함 - 매개변수가 같아야 함 - 리턴타입이 같아야 함 |
접근제한자는 부모클래스와 같거나 더 넓게 지정해야 함 * 접근제한자의 넓은개념부터의 순서 : public > protected > default(생략한 경우) > private |
1 2 3 4 5 6 7 | package day21; public class AndroidPhone extends CellPhone{ public void call() { //부모의 메서드를 재정의한 메서드 System.out.println("영상통화 합니다."); } } |
[예제 - AndroidPhone.java]
1 2 3 4 5 6 | package day21; public class AndroidPhone extends CellPhone{ public void call() { //부모의 메서드를 재정의한 메서드 System.out.println("영상통화 합니다."); } } |
위와 같이 정의가 되어 있고, 아래와 같은 코드로 자식클래스를 생성하면 자식클래스의 오버라이딩 개념으로 부모의 메서드가 숨겨진다.
[예제 - Ex01Main.java]
1 2 3 4 5 6 7 | package day21; public class Ex01Main { public static void main(String[] args) { AndroidPhone aPhone = new AndroidPhone(); System.out.print("상태 ? "); aPhone.call(); } } |
다음은 메모리 상에서 생성된 객체들의 내용을 추상적으로 나타낸 그림이다.
[결과1]
결과를 확인해 보면 "당연한 결과!가 아닌가? "하는 생각에 "여기서 뭐가 중요하지?" 또는 "숨김을 어떻게 확인하지?"와 같은 궁금증이 생길 것이다.
그렇다면 Ex01Main클래스를 다음과 같이 변경하여 메모리의 상태를 추상적으로 생각하고 실행해 보자!
[예제 - Ex01Main.java]
위와 같이 수정을 했다면 실행 시 메모리 상에 생성되는 객체들의 모양은 어떻게 될까?
변수 aPhone의 주소가 test()메서드를 호출하면서 전달하여 지역변수 p에게 전달했다. 하지만 전달한 인자는 AndroidPhone이고, 받는 지역변수 p는 CellPhone형이지만 전달되어 오는 AndroidPhone의 인스턴스 내에 CellPhone이 있으므로 허용된다. 단 지역변수 p의 2차주소가 CellPhone으로 상향조정되고 사용범위가 Object와 CellPhone으로 제한되지만 앞서 aPhone 인스턴스가 생성될 때 CellPhone의 call()메서드가 숨겨지고, AndroidPhone의 call()메서드가 활성화되었으므로 지역변수 p를 통해 call()메서드를 호출하면 2차주소가 CellPhone을 가리키고 있어도 이미 숨겨진 상태이고 AndroidPhone의 call()이 오버라이딩되어 활성화 되었 있기 때문에 AndroidPhone의 call()이 수행된다.
[결과2]
오버로딩(Overloading) -중복 정의-
이름이 같으면 메서드가 호출될 때 어떤 메서드가 호출되어야 하는지?가 모호해 지므로 다음과 같은 조건이 따른다.
■ 오버로딩의 규칙
특정 클래스 내에서 이름이 같은 메서드를 여러 개 중복 정의한 것 - 이름이 같아야 함 - 매개변수가 달라야 함(매개변수의 수, 배치(순서)등) |
- 리턴타입과 접근제한자는 신경안씀(다르거나 또는 같아도 됨) |
[예제]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package day21; public class OverloadTest { public void test() { System.out.println("TEST"); } public String test(int i) { return "TEST:"+i; } void test(String i) { System.out.println("TEST:"+i); } protected boolean test(float n) { return false; } public void test(String n,int i) { System.out.println("TEST:"+n); } public void test(int i,String n) { System.out.println("TEST:"+n); } } |
출처:http://asfirstalways.tistory.com/162
'JAVA' 카테고리의 다른 글
ModelAndView (0) | 2017.06.01 |
---|---|
JVM 메모리 구조 (1) | 2017.03.09 |
JAVA - 배열[] (0) | 2017.02.15 |
GSON - java 객체(object)를 JSON 표현식으로 변환하는 API (0) | 2016.12.20 |
toString이란? (1) | 2016.07.10 |