songdev
songdev
songdev
전체 방문자
오늘
어제
  • 분류 전체보기 (78)
    • Web 개발 (6)
    • 리눅스 (5)
    • git (5)
    • Bigdata (8)
      • 하둡 Architecture 번역 (6)
      • Ambari (2)
    • 코테 (22)
      • 프로그래머스 (22)
    • 자격증 (7)
      • 정보처리기사 (5)
      • SQLD (2)
    • 스터디 (18)
      • 웹 프로그래밍 (3)
      • 개념정리 (4)
      • 예제 (6)
      • 바닐라 JS로 크롬 앱 만들기 (5)
    • 일상 (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 깃허브
  • parseInt()
  • github push
  • level1
  • github
  • 배열
  • Java
  • 향상된 버블정렬
  • 프로그래머스
  • charAt()
  • 정보처리기사
  • javascript
  • 정렬
  • SQLD
  • sort()
  • 정보처리기사 필기
  • 배열의 복사
  • copyOfRange()
  • 리눅스
  • 자바스크립트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
songdev

songdev

스터디/개념정리

다형성이란?/업캐스팅/다운캐스팅/상속/java

2020. 2. 15. 17:28
반응형

○ 다형성이란?

- '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 하는 것. 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 하였다는 것.

 

기존 클래스의 개념으로 보았을때 인스턴스는 아래와 같이 생성하고 메소드를 호출하였다.

1
2
3
4
5
6
7
8
9
public class Test {
    public static void main(String[] args) {
        Parents p = new Parents();
        Son s = new Son();
 
        p.pMethod();
        s.sMethod();
    }
}  
Colored by Color Scripter
cs

- 각각 Parents 클래스와 Son 클래스의 인스턴스를 생성하여 각각의 참조변수로 해당 클래스의 메소드를 접근한다.

 

하지만 이때, Son클래스가 Parents클래스를 상속받았을 경우에는 3번 Line 없이,

4번 Line의 'Son s = new Son();' 으로 자식클래스 기반 객체만 생성하여도 부모클래스의 인스턴스가 같이 메모리에 올라가게 된다.

1
2
3
4
5
6
7
8
9
public class Test {
    public static void main(String[] args) {
 
        Son s = new Son();
 
        s.pMethod();
        s.sMethod();
    }
}  
Colored by Color Scripter
cs

 

- 상속관계가 성립되었을 경우, 참조변수 s는 부모클래스 메소드인 pMethod()와 자식클래스 메소드인 sMethod를 모두 접근할 수 있다.

 

여기까지가 기본 상속의 개념이고, 아래부터는 다형성에 대해 알아보자.

 

-------------------------------------------------------------------------------------------------------------------

 

앞서 다형성이란 부모클래스의 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있다고 하였다.

1
2
3
4
5
6
7
8
9
10
public class Test {
    public static void main(String[] args) {
 
        Parents p = new Son();
 
        p.pMethod();
        //p.sMethod();
 
    }
}  
Colored by Color Scripter
cs

 

- Parents 타입의 참조변수 p로 Son클래스의 인스턴스를 참조하도록 하였다. (업캐스팅)

- 4번 Line을 풀어서 쓰면 아래와 같다. 

  Son s = new Son();  // 자식클래스 기반 인스턴스를 생성한다.

  Parents p;              // 부모클래스를 참조하는 참조변수 p를 선언한다.

  p = s;                   // 참조변수 s가 가리키는 곳을 참조변수 p도 가리키게 한다.

// p = (Parents)s; 와 동일한 의미다. 부모가 자식보다 큰 범위이기 때문에 (Parents)를 생략하여 자동형변환이 가능하다.

- 이 때, 참조변수 p의 타입은 Parents이기 때문에 Son클래스가 가지고있는 고유의 sMethod는 접근 불가하다.

- 이렇게 자식클래스의 참조변수 s를 부모클래스 참조변수 p로 변환하는 것을 업캐스팅(up-casting)이라고 한다.

 

★★★중요★★★

앞서 Son s = new Son(); 으로 인스턴스를 생성하였을 경우에는 pMethod()와 sMethod()에 모두 접근 가능했지만, 

Parents p = new Son(); 으로 참조변수 타입을 부모클래스로 지정할 경우에는 자식클래스의 고유멤버에는 접근할 수 없다는 것에 집중하자.

 

이는 둘다 new Son();으로 같은 타입의 인스턴스지만, 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다는것을 알수 있다.

 

그렇다면 참조변수 p로는 sMethod()로 접근을 못하는 것일까?

1
2
3
4
5
6
7
8
9
10
11
12
public class Test {
    public static void main(String[] args) {
 
        Parents p = new Son();
 
        p.pMethod();
        //p.sMethod();
 
        ((Son)p).sMethod();
 
    }
}  
Colored by Color Scripter
cs

 

9번 Line 처럼 부모클래스의 참조변수 p를 자식클래스인 Son타입으로 강제형변환한다면 sMethod()로 접근 가능하다.

이를 다운캐스팅(down-casting)이라고 한다.

 

큰 범위(부모)에서 작은 범위(자식)로는 형변환 생략이 불가하다.

// 4번 Line은 (Parents) 생략이 가능하다.

반응형

'스터디 > 개념정리' 카테고리의 다른 글

상속의 기본 개념/클래스 상속/java  (0) 2020.02.15
메소드 오버로딩과 오버라이딩/java  (0) 2020.02.15
배열과 난수/java  (0) 2020.02.11
    '스터디/개념정리' 카테고리의 다른 글
    • 상속의 기본 개념/클래스 상속/java
    • 메소드 오버로딩과 오버라이딩/java
    • 배열과 난수/java
    songdev
    songdev

    티스토리툴바