Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- g++ 업데이트
- semanage
- gcc 업데이트
- selinux port 등록
- snmp test
- subporcess path
- python popen
- centos pyhon 설치
- grafana dashboard
- 정규식 컴파일
- InfluxDB
- c3 축 없애기
- influxdb 설치
- 1697
- CentOS7
- regex_search
- 백준
- python subprocess
- c3 축 가리기
- 정규식 문자열 출력
- linux시간으로 변경
- 정규식 활용
- snmp
- c3 second
- telegraf
- c++ 정규식
- c3 step graph
- gcc regex
- c3 초
- python os
Archives
- Today
- Total
리셋 되지 말자
다형성: 사용편의성 본문
객체 지향에서 다향성이라고 하면 오버라이딩(overriding)과 오버로딩(overloading) 이라고 할 수 있다.
-> 상위 클래스와 하위 클래스 사이에서도 다형성을 이야기할 수 있고, 인터페이스와 그것의 구현 클래스 사이에서도 다형성을 이야기할 수 있지만 가장 기본은 오버라이딩과 오버 로딩이라고 할 수 있다.
(참고 : 오버로딩이 다형성인지 아닌지에 대해서는 이견이 있다.)
오버 라이딩과 오버 로딩
- 오버 라이딩 : 상위 클래스의 메서드를 '재정의'
- 오버 로딩 : 상위 클래스의 메서드를 인자 리스트를 다르게 하여 '중복정의'
- Animal
package polymorphism01;
public class Animal {
public String name;
public void showName() {
System.out.printf("안녕 나는 %s야. 반가워\n", name);
}
}
- Penguin
package polymorphism01;
public class Penguin extends Animal{
public static String habitat;
public void showHabitat() {
System.out.printf("%s는 %s에 살아\n", name, habitat);
}
//오버라이딩-재정의: 상위 클래스의 메서드와 같은 메서드 이름, 같은 인자 리스트
public void showName() {
System.out.println("어머 내 이름은 알아서 뭐하게요?");
}
//오버로딩-중복정의: 같은 메서드 이름, 다른 인자 리스트
public void showName(String yourName) {
System.out.printf("%s 안녕, 나는 %s라고 해\n", yourName, name);
}
}
- Main
package polymorphism01;
public class Main {
public static void main(String[] args) {
Penguin pororo = new Penguin();
pororo.name="뽀로로";
pororo.habitat= "남극";
pororo.showName();
pororo.showName("초보람보");
pororo.showHabitat();
Animal pingu = new Penguin();
pingu.name="핑구";
pingu.showName();
}
}
- 실행 결과
-> pororo 객체 참조 변수에서 showName()을 호출해도, 하위 클래스에서 오버로딩된 함수가 실행된다. 아래의 T메모리 구조에서 부가 설명함.
다형성과 T 메모리
- main() 함수에서 pororo 객체 참조 변수에 Penguin() 인스턴스가 생성된 모습
-> showName()이 오버로딩되었고, showName(userName)이 오버라이딩 된 모습
- pororo.showName() 부분을 실행하면 Animal 객체에 있는 showName() 메서드는 Penguin 객체에 있는 showName() 메서드에 의해 재정의 되었기 때문에 Penguin 객체에서 재정의한 showName() 메서드가 호출되어 Penguin 객체의 showName()메서드가 실행된다.
- pororo.showName("초보람보")를 실행하면 오버로딩된 Penguin 객체에 있는 showName(youName)이 실행된다.
- pingu 객체 참조변수가 Penguin() 인스턴스를 가리킬 때의 T 메모리
-> 여기서 중요한 점은 pingu 객체 참조 변수의 타입이 Animal이라는 것이다. 그럼에도 아래 그림에서 보면 Animal 객체의 showName()이 Penguin 객체의 showName()에 의해 가려져 있다. 그래서 pingu.showName()을 실행하여도 Penguin 객체에 오버라이딩된 showName()이 실행된다.
- 결론 : 상위 클래스 타입의 객체 참조 변수를 사용해도 하위 클래스에서 오버라이딩(재정의)한 메서드가 호출된다.
다형성이 지원되지 않는 언어
-
add(int, int)함수를 구현한다고 할 때, 정수끼리만 더하지 않을 경우 addDouble(double, double), addIntDouble(int, double) 과 같이 더하는 숫자의 type에 따라 무수히 많은 메서드를 정의해야한다. 하지만 오버로딩으로 인해 간단히 add라는 함수 하나만 정의하여 사용할 수 있다.
-
오버라이딩의 경우에는 하위 클래스가 재정의한 메서드를 알아서 호출해 줌으로써 형변환이나 instanceof 연산자를 써서 하위 클래스가 무엇인지 신경 쓰지 않아도 된다. 상위 클래스 타입의 객체 참조 변수에서 하위 클래스가 오버라이딩한 메서드를 자동으로 호출해 줌으로써 깔끔한 코드를 유지할 수 있게 된다.(오버라이딩은 이해가 잘 안간다.)
-
오버라이딩 예시
-
동물
package overriding;
public class 동물 {
public void 울어보세요() {
}
}
- 강아지
package overriding;
public class 강아지 extends 동물 {
public void 울어보세요() {
System.out.println("멍 멍");
}
}
- 고양이
package overriding;
public class 고양이 extends 동물{
public void 울어보세요() {
System.out.println("야옹 야옹");
}
}
- 송아지
package overriding;
public class 송아지 extends 동물{
public void 울어보세요() {
System.out.println("음머 음머");
}
}
- 쥐
package overriding;
public class 쥐 extends 동물{
public void 울어보세요() {
System.out.println("찍 찍 찍");
}
}
- Main
package overriding;
public class Main {
public static void main(String[] args) {
동물 동물들[] = new 동물[4];
동물들[0]=new 강아지();
동물들[1]=new 고양이();
동물들[2]=new 송아지();
동물들[3]=new 쥐();
for(int i=0; i<동물들.length; i++) {
동물들[i].울어보세요();
}
}
}
- 실행 결과
-> 상위 클래스의 '울어보세요()'메서드를 오버라이딩 하여 각 하위 클래스마다 다르게 동작시킬 수 있다.
Comments