다라다라V
article thumbnail
Published 2022. 10. 30. 00:21
[JAVA] 10. 상속과 다형성 코딩언어/JAVA
728x90
반응형

📌 상속과 다형성

실제 일상에서도 비슷한 일을 하는 여러 형태의 도구가 있다.

실제 일상에서도 비슷한 일을 하는 여러 형태의 도구가 있습니다. 이들을 활용하여 필요한 곳에 모아서 사용하거나, 같은 기능을 하는 것끼리 모아서 보관을 편히 할 수도 있습니다. 자바에서도 상속받은 객체들끼리 모아서 배열로 만들거나 매개변수로 사용할 수 있습니다. 오늘은 객체 지향언어의 특징인 다형성을 배워봅시다.

다양한 형태가 존재하는 다형성이라는 객체 지향 언어의 특징을 배워봅시다. 이러한 다형성의 활용 방법을 배워보며 업캐스팅과 다운 캐스팅의 용어도 배워봅니다. 또한 각 객체가 명시된 클래스로부터 생성되었는지를 확인하는 instanceof 연산자도 배워봅시다.

📌 I. 상속과 다형성

📚 1. 다형성 (Polymorphism)

 

  • 다양한 형태가 존한다는 의미
  • 프로그래밍을 유연하게 만들어주는 메커니즘
  • 실행 때 조건문으로 객체를 식별할 필요 없이, 구분하지 않고 같은 코드를 사용하도록 함
  • 프로그래밍을 단순하고도 직관적으로 만들어주는 효과

📚 02. 참조 변수에 객체를 할당하는 기본적인 방법

 

  • 기본적으로 참조 변수의 자료형할당 하고자 하는 객체의 자료형일치해야합니다.
 UnivStudent s;
 s = new UnivStudent();
 UnivStudent s = new UnivStudent();

 


📚 03. 업 캐스팅

 

  • 참조 변수의 타입과 참조 변수에 할당하는 객체의 타입이 다르도록 할 수 있음
  • super  클래스형 참조 변수로 sub 클래스 객체를 가리키는데 사용 가능
  • 자동 형변환이 일어남
  • sub 클래스 객체의 성질은 그대로 유지됨
  • Object 클래스는 모든 클래스의 super 클래스이므로 모든 객체를 가리키는데 사용할 수 있음
Person p = new UnivStudent();
Person p = (Person) (new UnivStudent());

📚 04. 업 캐스팅의 예

Person p = new UnivStudent();

 

  • 자식 객체를 부모 타입의 참조 변수로 가리킴
  • age, name 멤버 변수나 WhatYourName(). HowOldAreYou() 메서드는 부모 객체에도 있었으므로 참조 변수 p로 접근
  • 자식 객체에서 새로 상속된 major 멤버 변수나, WhoAreYou() 메서드는 참조 변수 p로 접근 불가
  • 컴파일러가 찾아갈 수 없음

📚 05. 다운 캐스팅

  • 기본적으로는 sub 클래스형 참조 변수는 super 클래스 객체를 가리킬 수 없음
  • 명시적 형변환으로 컴파일 오류는 피할 수 있더라도 실행 시간에 오류 발생
UnivStudent s = new Person(); //오류

 

  • 업 캐스팅 된 참조 변수명시적 형변환을 통해 다운 캐스팅하는 것은 가능
Person p = new UnivStudent();
UnivStudent s = (UnivStudent) p; //정상

📚 06. 다운 캐스팅의 예

(1) 잘못된 다운 캐스팅의 예

UnivStudent s = new Person();
UnivStudent s = (UnivStudent) new Person();

  • 여전히 실행 때 오류 발생 가능성 존재

 

(2) 유효한 다운 캐스팅의 예

Person p = new UnivStudent();
UnivStudent s = (UnivStudent) p;

 

 


📌 II. 다형성의 활용 

📚 01. 다형성의 활용

대학생과 고등학생을 하나의 묶음으로 만들어야할 때 공통적인  Person으로 묶을 수 있을 것입니다.

 

(1) 객체 배열로의 활용

Person[] pList = new Person[2];
pList[0] = new Person();
pList[1] = new UnivStudent();

 

  • super 클래스형의 객체 배열은 다양한 종류의 sub 클래스의 객체를 포함할 수 있음

 

(2) 매개 변수로의 활용

void fn(Person p);

 

  • super 클래스형의 캐개변수는 다양한 종류의 sub 클래스 객체를 넘겨 받을 수 있음

📚 02. 업 캐스팅된 참조변수의 성질 (1)

  • sub 클래스의 멤버 중 super 클래스로부터 상속 받은 멤버에만 직접 접근이 가능
  • sub 클래스에서 추가된 멤버에는 접근 불가
  • 컴파일시 참조 변수의 자료형을 가지고 메서드의 올바른 사용 여부를 확인하기 때문
p.WhatYourName(); 	//정상
p.WhoAreYou(); 		//컴파일 오류

 

  • 오버라이딩 된 멤버에 접근시 접근시 자동으로 sub 클래스에서 정의한 멤버로 접근됨
  • JVM이 메서드 호출시 참조 변수의 자료형이 아니라 실제 객체의 자료형을 중심으로 동작하기 때문

📚 03. 업 캐스팅된 참조변수의 성질 (2)

 

  • 상속 받지 않은 멤버에 접근하기 위해선 반드시 다운 캐스팅 후 조작
 UnviStudent s = (UnviStudent) p; 
 s.WhoAreYou();
((UnviStudent) p).WhoAreYou();

 

  • 반드시 객체의 실제 자료형으로만 다운 캐스팅이 가능
  • 자식에게 새로 추가된 멤버가 있는 경우 다운 캐스팅이 필요한 것

📚 04. instanceof 연산자

 

참조변수 instanceof <class명>
  • 다운 캐스팅시 사용
  • 참조 변수가 참조하고 있는 객체가 명시한 클래스로부터 생성되었는지를 검사
  • boolean 결과값을 반환

 

if (pList[i] instanceof Univ())

 

  • super 클래스의  배열/매개변수를  통해  접근되는 객체의  실제  자료형을  확인  가능
  • sub 클래스에서  추가된  멤버  접근시에만  확인  필요

 

반응형

'코딩언어 > JAVA' 카테고리의 다른 글

[JAVA] 12. 예외처리  (0) 2022.11.04
[JAVA] 11 추상 클래스와 인터페이스  (0) 2022.11.03
[JAVA] 09. 클래스 상속  (0) 2022.10.24
[JAVA] 08. 배열  (0) 2022.10.22
[JAVA] 07-2 자바 기본 API  (0) 2022.10.20
profile

다라다라V

@DaraDaraV

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!