옝옹
냠
옝옹
전체 방문자
오늘
어제
  • 분류 전체보기 (84)
    • [LG유플러스]유레카 SW (5)
    • React (20)
    • JS (17)
    • TypeScript (5)
    • CSS & HTML (1)
    • 알고리즘 (11)
    • JAVA (20)
    • GIT (1)
    • 자격증 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • java.util패키지
  • useRef
  • 백준
  • map() 함수
  • JavaScript
  • match()
  • 자바스크립트
  • switch문
  • 코드스플리팅
  • 정적멤버
  • 변수선언
  • indexOf()
  • reverse() 메서드
  • 화살표함수
  • map
  • fillter
  • 노마드코더
  • do-while문
  • 함수선언
  • useEffect
  • break문
  • TypeScript
  • 타입스크립트
  • 인스턴스멤버
  • 접근제한자
  • 템플릿리터럴
  • 혼자공부하는자바
  • 자바
  • continue문
  • 자바스트립트
  • 혼자 공부하는 자바
  • sort() 메서드
  • toFixed
  • useMemo
  • Node.js
  • 기본api클래스
  • ==
  • useCallback
  • 타입변환
  • 리액트
  • template literal
  • reduce
  • useState
  • While문
  • join() 메서드
  • join()
  • java
  • java.lang패키지
  • 리액트를다루는기술
  • js

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
옝옹

냠

타입 변환과 다형성
JAVA

타입 변환과 다형성

2022. 10. 31. 16:09

다형성

  • 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행 결과가 나오도록 하는 성질이다.
  • 예를 들어 자동차가 타이어를 사용하는 방법은 동일하지만 어떤 타이어를 장착하느냐에 따라 주행 성능이 달라진다.
  • 다형성을 구현하려면 메소드 재정의와 타입 변환이 필요

자동 타입 변환

  • 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것
  • (ex) 부모타입 변수 = 자식타입;
  • 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
Cat cat = new Cat();
Animal animal = cat;
// Animal animal = new Cat();도 가능
  • Cat 클래스로부터 Cat 객체를 생성하고 이것을 Animal 변수에 대입하면 자동 타입 변환이 일어난다.
  • 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.
  • 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다
  • 메소드가 자식 클래스에서 재정의되었다면 자식 클래스의 메소드가 대신 호출된다.☆☆☆

  • Child 객체는 method3() 메소드를 가지고 있지만, Parent 타입으로 변환된 이후에는 method3()을 호출할수 없다.
  • method2() 메소드는 부모와 자식 모두에게 있다. 재정의된 메소드는 타입 변환 이후에도 자식 메소드가 호출된다.

필드의 다형성

  • 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다.
class Car {
    //필드
    Tire frontLeftTire = new Tire();
    Tire frontRightTire = new Tire();
    Tire backLeftTire = new Tire();
    Tire backRightTire = new Tire();
    //메소드
    void run() { … }
}
  • Car 클래스로부터 Car 객체를 생성하면 4개의 Tire 필드에 각각 하나씩 Tire 객체가 들어가게 된다.
  • frontRightTire와 backLeftTire를 HankookTire와 KumhoTire로 교체할 경우 ↓
Car myCar = new Car();
myCar.frontRightTire = new HankookTire();
myCar.backLeftTire = new KumhoTireQ;
myCar.run();
void run() {
    frontLeftTire. roU();
    frontRightTire.roll();
    backLeftTire.roll();
    backRightTire.roll();
}
  • Car 객체에 run() 메소드가 있고, run() 메소드는 각 Tire 객체의 roll() 메소드를 다음과 같이 호출

→ 이와 같이 자동 타입 변환을 이용해서 Tire 필드값을 교체함으로써 Car의 run() 메소드를 수정하지 않아도 다양한 roll() 메소드의 실행결과를 얻게 된다. 이것이 바로 필드의 다형성이다.

매개 변수의 다형성

  • 메소드를 호출할 때에는 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석이지만, 매개값을 다양화하기 위해 매개 변수에 자식 객체를 지정할 수도 있다

  • drive() 메소드는 Vehicle 타입을 매개 변수로 선언했지만, Vehicle을 상속받는 Bus 객체가 매개값으로 사용되면 자동 타입 변환이 발생합니다.
  • Vehicle vehicle = bus; // 자동 타입 변환
  • 자식 객체가 부모의 메소드를 재정의했다면 메소드 내부에서 재정의된 메소드를 호출함으로써 메소드의 실행결과는 다양해진다.

강제 타입 변환

  • 부모 타입을 자식 타입으로 변환하는 것
  • 모든 부모 타입을 자식 타입으로 강제 변환할 수 있는 것은 아님
  • 자식타입 변수 = (자식타입) 부모타입; //부모 타입을 자식 타입으로 변환
Parent parent = new ChildQ; //자동 타입 변환
Child child = (Child) parent; //강제 타입 변환

객체 타입 확인

instanceof 연산자 

  • 어떤 객체가 어떤 클래스의 인스턴스인지 확인하기 위해 사용
  • 좌항에는 객체가 오고 우항에는 타입이 오는데, 좌항의 객체가 우항의 인스턴스이면, 즉 우항의 타입으로 객체가 생성되었다면 true를 리턴하고 그렇지 않으면 false를 리턴
boolean result = 좌항(객체) instanceof 우항(타입)
  •  주로 매개값의 타입을 조사할 때 사용
  • 메소드 내에서 강제 타입 변환이 필요할 경우 반드시 매개값이 어떤 객체인지 instanceof 연산자로 확인하고 안전하게 강제 타입 변 환을 해야함

확인 문제

1. 클래스 타입 변환에 대한 설명입니다. 맞는 것에 O표, 틀린 것에 X표 하세요. 

① 자식 객체는 부모 타입으로 자동 타입 변환된다. ( O )
② 부모 객체는 항상 자식 타입으로 강제 타입 변환된다. ( X ) 

③ 자동 타입 변환을 이용해서 필드와 매개 변수의 다형성을 구현한다. ( O )

④ 강제 타입 변환 전에 instanceof 연산자로 변환 가능한지 검사하는 것이 좋다. ( O )

 

2. Tire 클래스를 상속받아 SnowTire 클래스를 디음과 같이 작성했습니다. SnowTireExample 클래스를 실행했을 때 출력 결과는 무엇일까요?

스노우 타이어가 굴러갑니다.
스노우 타이어가 굴러갑니다.

 

3. A, B, C, D, E, F 클래스가 다음과 같이 상속 관계에 있을 때 다음 빈 칸에 들어올 수 없는 코드는?

② (B) new A()

 

4. Controller 클래스의 setService() 메소드를 호출하려고 합니다. setService() 메소드의 매개값으로 올 수 있는 것에 O표, 올 수 없는 것에 X표 하세요. 

① new Service () ( X )
② new MemberService () ( O )
③ new Aservice () ( O )
④ new Bservice () ( O )
⑤ new BoardService () ( X )
⑥ new Dservice () ( X )

.

5. Service 클래스들이 다음과 같이 선언되어 있습니다. 4번의 Controller의 객체를 생성하고 setService() 메소드를 호출한 뒤, service.login() 메소드를호출하면 어떤 내용이 줄력되는지 빈 칸에 기술해보세요.

public class Service {
    public void login() {
        	System, out. println("로그인");
        }
    }
    public class MemberService extends Service {
        public void login() {
        	System.out.println("멤버 로그인");
        }
    }
    
    public class AService extends MemberService {
        public void login() {
        	System.out.println("A 로그인");
    	}
	}
    
	Controller controller = new ControllerQ;

	controller.setService(new MemberService());
	controller.service.login(); //출력 결과: 멤버 로그인

	controller.setService(new AService());
	controller.service.login(); //출력 결과: A 로그인

 

저작자표시 비영리 변경금지 (새창열림)

'JAVA' 카테고리의 다른 글

인터페이스  (1) 2022.11.09
추상 클래스  (0) 2022.10.31
상속  (0) 2022.10.31
패키지와 접근 제한자  (0) 2022.10.13
인스턴스 멤버와 정적 멤버  (0) 2022.10.13
    'JAVA' 카테고리의 다른 글
    • 인터페이스
    • 추상 클래스
    • 상속
    • 패키지와 접근 제한자
    옝옹
    옝옹

    티스토리툴바