이전에는 클래스를 사용하여 새로운 유형을 만들었고 상속을 사용하여 클래스 생성 프로세스를 용이하게 했습니다. 이번 강의에서는 유형에 대해 알아보고 다형성의 개념을 소개하겠습니다.
유형 검사
Java의 모든 변수와 참조는 유형 선언을 전달한 후에만 사용할 수 있습니다. 우리는 이전에 객체 데이터, 클래스 데이터, 메소드 매개변수, 메소드 반환 값, 메소드 내부의 자동 변수 모두 해당 유형을 선언해야 한다는 점을 살펴보았습니다. Java는 유형을 확인하는 강력한 유형의 언어입니다. 잘못된 유형을 사용하면 오류가 발생합니다.
유형이 일치하지 않습니다. 귀여움이 유효하지 않습니다.
예를 들어 아래 Test 클래스에서는 Cup 클래스 객체를 aPerson 클래스 참조에 할당합니다.
public class Test{ public static void main(String[] args) { Human aPerson; aPerson = new Cup(); }}class Human{ /** * 생성자 */ public Human(int h) { this.height = h; } /** * 접근자 */ public int getHeight() { return this.height; } /** * mutator */ public void GrowthHeight(int h) { this.height = this.height + h } private; int height;}class Cup { public void addWater(int w) { this.water = this.water + w; } public void drinkWater(int w) { this.water = this.water - w } private int water = 0 ;}
javac는 다음을 반환합니다:
발견됨: 컵필수: 인간 aPerson = 새 컵() ^1 오류
기본 유형 변환
Java는 기본 유형의 변수에 대해 유형 변환을 수행할 수 있습니다. 기본 유형에 따라 길이와 보관 범위가 다릅니다. float에서 int로 변환하는 것처럼 고정밀도 유형에서 저정밀도 유형으로 변환하면 정보가 손실될 수 있습니다. 이러한 변환을 축소 변환이라고 합니다. 이 경우 다음과 같이 유형 변환을 명시적으로 선언해야 합니다.
public class Test{ public static void main(String[] args) { int a; a = (int) 1.23; // 축소 변환 System.out.println(a) }}
정밀도가 낮은 유형에서 고정밀도 유형으로 변환하면 정보 손실에 대한 우려가 없습니다. 이러한 변환을 확장 변환이라고 합니다. 명시적으로 유형 변환을 요구할 필요는 없으며 Java는 이를 자동으로 수행할 수 있습니다.
public class Test{ public static void main(String[] args) { int a = 3; b = a; // 확장 변환 System.out.println(a);
기본 유형 변환
업캐스트 및 다형성
Java에서는 참조를 유형 캐스팅할 수도 있지만 제한 사항이 있습니다.
파생 클래스 참조를 기본 클래스 참조로 변환할 수 있는데, 이를 업캐스트 또는 완화 변환이라고 합니다. 다음 BrokenCup 클래스는 Cup 클래스에서 상속되며 Cup 클래스의 원래 addWater() 및 drinkWater() 메서드를 재정의합니다.
public class Test{ public static void main(String[] args) { Cup aCup; BrokenCup aBrokenCup = new BrokenCup(); // 업캐스트 aCup.addWater(10); void addWater(int w) { this.water = this.water + w; } public void drinkWater(int w) { this.water = this.water - w; } private int water = 0;} class BrokenCup 확장 Cup{ public void addWater(int w) { System.out.println("똥, 깨진 컵") } public void drinkWater(int w) { System.out. println("om...num..., 안에 물이 없습니다");
프로그램 실행 결과:
젠장, 깨진 컵
위에서 볼 수 있듯이 명시적인 지침 없이 파생 클래스 참조 aBrokenCup을 기본 클래스 참조 aCup에 할당합니다. 유형 변환은 Java에 의해 자동으로 수행됩니다.
그런 다음 aCup(Cup 유형으로 선언)의 addWater() 메서드를 호출했습니다. aCup은 Cup 유형의 참조이지만 실제로는 BrokenCup의 addWater() 메서드를 호출합니다! 즉, 업캐스트를 통해 참조 유형을 기본 클래스로 느슨하게 하더라도 Java는 여전히 객체 자체의 유형을 올바르게 식별하고 올바른 메서드를 호출할 수 있습니다. Java는 현재 상황을 기반으로 객체의 실제 유형을 식별할 수 있습니다. 이를 다형성이라고 합니다. 다형성은 객체지향의 중요한 측면입니다.
다형성은 Java가 지원하는 메커니즘이자 중요한 객체 지향 개념이기도 합니다. 이는 하위 클래스 객체가 실제로 상위 클래스 객체인지에 대한 분류학적 질문을 제기합니다. 예를 들어, 새도 동물이고, 자동차도 교통수단이어야 합니다. Java는 파생 클래스 객체가 기본 클래스 객체로 사용될 수 있음을 알려주고 Java는 이 상황을 올바르게 처리합니다.
예를 들어 다음과 같은 상속 관계가 있습니다.
우리는 컵으로 물을 마신다고 말할 수 있습니다. 실제로 식수의 작용에 대한 구체적인 의미는 파생클래스에서 크게 달라질 것이다. 예를 들어, 빨대를 통해 마시는 물과 깨진 컵으로 마시는 물은 매우 다릅니다. 비록 우리 모두 추상적으로 "마시는 물"에 대해 이야기하고 있지만요. 물론 파생된 각 클래스에 대해 별도로 프로그래밍하고 다양한 drinkWater 메서드를 호출할 수 있습니다. 그러나 프로그래머는 컵이 파생된 컵의 종류에 관계없이 컵을 프로그래밍하고 Cup의 drinkWater() 메서드를 호출할 수 있습니다. 위 프로그램에서 볼 수 있듯이 Java는 해당하는 올바른 메서드를 호출합니다.
보다 의미 있는 예를 살펴보면 Human 클래스에 drink() 메서드를 추가합니다. 이 메서드는 cup 개체와 정수를 매개 변수로 받습니다. 정수는 마실 물의 양을 나타냅니다.
public class Test{ public static void main(String[] args) { Human guest = new Human(); BrokenCup hisCup = new BrokenCup(); class Human { void drink(컵 aCup) , int w) { aCup.drinkWater(w) }}
프로그램 실행 결과:
젠장, 안에 물이 없어
Human 클래스의 drink() 정의에서 첫 번째 매개변수는 Cup 유형의 참조여야 합니다. 하지만 실제 애플리케이션(Test 클래스)에서는 Cup의 BrokenCup 파생 클래스 객체를 사용한다. 이는 실제로 hisCup을 Cup 클래스로 업캐스트하고 drink() 메소드에 전달합니다. 이 메서드에서는 drinkWater() 메서드를 호출했습니다. Java는 이 개체가 실제로 BrokenCup 개체임을 발견하여 실제로 BrokenCup의 해당 메서드를 호출했습니다.
우울한
기본 클래스 참조를 파생 클래스 참조로 다운캐스트할 수 있지만 기본 클래스 참조가 가리키는 개체는 이미 다운캐스트할 파생 클래스 개체입니다. 예를 들어, 위의 hisCup은 위쪽으로 Cup 클래스 참조로 변환된 다음 아래쪽으로 BrokenCup 클래스 참조로 변환될 수 있습니다.
객체 유형
Java에서는 실제로 모든 클래스에 Object 클래스라는 공통 상속 조상이 있습니다. Object 클래스는 toString()과 같은 몇 가지 메서드를 제공합니다. 우리는 자체 클래스 정의에서 이러한 메서드를 재정의할 수 있습니다.
개체: 조상
Object 개체를 작동하는 프로그램을 작성하고 업캐스트를 통해 모든 개체를 프로그램에 전달할 수 있습니다.
나중에 Object 클래스에 대해 자세히 살펴보겠습니다.
(다형성의 구현은 RTTI 지원에 의존합니다. 나중에 더 자세히 설명하겠습니다.)
요약
기본 유형 변환
다형성
우울한
물체