@Eeap
velog
@Eeap
전체 방문자
오늘
어제
  • 전체 (168)
    • osam (1)
    • Cloud (21)
      • Docker (2)
      • AWS (13)
    • AI & Data (7)
    • Algorithm (76)
      • Baekjoon (75)
      • Codeforces (1)
    • Language (18)
      • Java (18)
    • Back-end (17)
      • Spring (3)
      • JSP & Servlet (12)
      • Go (2)
    • 일상 (4)
    • 기타 (8)
    • git (1)
    • Infra (9)
      • Apache Kafka (5)
      • Kubernetes (4)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • flink
  • converse api
  • CLASS
  • bedrock agent
  • 심폴릭링크
  • invokemodel api
  • Python
  • 오블완
  • SageMaker
  • 인터페이스
  • bedrock api
  • AWS CodeCatalyst
  • sagemaker unified studio
  • bedrock
  • AWS CodeStar
  • 티스토리챌린지
  • knowledge bases
  • Agent
  • AWS CodeArtifact
  • java

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
@Eeap

velog

Language/Java

Java 타입 변환과 다형성

2022. 5. 27. 23:03
반응형
타입 변환

기본 타입과 마찬가지로 클래스에도 타입 변환이 존재!

프로그램 실행 도중 자동으로 타입 변환이 일어나는 것을 자동 타입 변환이라고 하고

형식은     부모타입 변수 = 자식타입;  로 나타낼 수 있다.

Sub test = new Sub();
Main test1 = test;

자동 타입 변환은 굳이 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입인 경우에도 일어날 수 있다.

 

그리고, 부모 타입으로 자동 변환된 이후에는 부모 클래스에 선언된 필드 및 메소드만 접근이 가능!

하지만 자식 클래스에서 메소드가 재정의 되었을 경우엔 자식 클래스의 메소드가 대신 호출된다

public class Main {
	public void test1() {}
	public void test2() {System.out.println("Main");}
}

public class Sub extends Main{
	public void test3() {}
	public void test2() {System.out.println("Not main");}
}


public class Test{
	public static void main(String[] args){
    	Sub test0 = new Sub();
        Main test00 = test;
        test00.test1():
        test00.test2(); // Sub의 test2 method 호출
    }

}

 

 


 

 

다형성

재정의 + 타입변환으로 객체지향의 다형성을 구현할 수 있다

 

필드의 다형성

필드 타입을 부모 타입으로 선언할 경우 자식 객체에 따라 달라질 수 있다

class Car{
 //field
 Tire frontT = new Tire();
 Tire backT= new Tire();
 public void run(){
  frontT.roll();
  backT.roll();
 }
}
Car myC = new Car();
myC.frontT = new HTire();
myC.backT = new KT();
myC.run();

 

매개 변수의 다형성

매개 변수를 부모 타입으로 선언하게 되면 메소드 호출 시 매개값으로 부모 객체 및 모든 자식 객체들을 제공할 수 있다.

이는 자식의 재정의된 메소드를 이용할 수 있음을 의미하고 매개 변수로도 다형성을 구현할 수 있음을 의미한다.

class Driver{
 public void drive(Vehicle vehicle){
  vehicle.run();
 }
}

Driver driver = new Driver();
Taxi taxi = new Taxi();
driver.drive(taxi);

 


 

강제 타입 변환

 부모 타입을 자식 타입으로 변환할 때 강제 타입 변환을 이용한다.

단 조건이 있는데 자식 타입이 부모 타입으로 자동 타입 변환된 후 다시 반대로 변환할 때 사용할 수 있다

Parent parent = new Child(); //이와 같은 자동 타입 변환된 후인 경우만 가능!
Child child = (Child) parent;

 

따라서 타입 변환을 확인하지 않고 강제 타입 변환 시도 시에는 ClassCastException 오류가 발생할 수 있는데

이는 instanceof 연산자를 통해 확인 후 안전하게 실행해서 확인하고 해결할 수 있다.

public void test(Parent parent){
 if(parent instanceof Child){
  Child child = (Child) parent;
  //만약 parent에 Child 객체가 들어오면 조건문 값은 true가 될 것이고 그렇지 않을 경우엔 false가 반환된다.
 }
}

 

반응형
저작자표시

'Language > Java' 카테고리의 다른 글

Java 인터페이스  (0) 2022.05.30
Java 추상클래스  (0) 2022.05.30
Java 상속  (0) 2022.05.22
Java 접근 제한자  (0) 2022.05.13
Java 인스턴스 멤버와 정적 멤버  (0) 2022.05.10
    'Language/Java' 카테고리의 다른 글
    • Java 인터페이스
    • Java 추상클래스
    • Java 상속
    • Java 접근 제한자
    @Eeap
    @Eeap

    티스토리툴바