-
자바 100제 Part.3 / 24 ~ 28개발자 수업/인터넷 강의 2021. 9. 22. 22:13
1. 자식 클래스로 생성하는 객체를 부모의 타입으로 받아서 객체를 생성하면 사용범위가 어떻게 되는지
class Person { String str1 = "난 부모 클래스"; void method1(){System.out.println("에이에이에이");} void ppp(){System.out.println("ppp");} } class Student extends Person{ String str2 = "난 자식 클래스"; void method1(){System.out.println("오버라이딩 AAA");} void sss(){System.out.println("sss");} void x(){ method1(); super.method1(); } } public class Java100_oop_Polymorphism3{ public static void main(String[] args){ // 객체 생성 -> 부모 + 자식 클래스의 모든 자원을 다 쓸 수 있음 Student s1 = new Student(); System.out.println(s1.str1); System.out.println(s1.str2); s1.method(); // 오버라이딩 AAA s1.sss(); // sss s1.ppp(); // ppp // !! 자식 클래스에서 오버라이딩된 부모 클래스의 원본 메서드를 호출하고 싶다면? -> super 사용 s1.x(); // 오버라이딩 AAA와 에이에이에이가 출력됨 // 객체 생성 -> 범위는 부모의 자원만을 쓸 수 있음 Person s2 = new Student(); System.out.println(s2.str1); System.out.println(s2.str2); // Err -> 자식의 자원은 쓸 수 없음 s2.ppp(); // ppp s2.method1(); // 오버라이딩 AAA -> 오버라이딩 한 건 자식의 메서드로 실행 // !! 자식의 메서드를 바로 호출하고 싶다면? -> 캐스트 필요 ((Student) s2).sss(); // sss // 객체 생성 Person aaa = new Person(); aaa.method1(); // 에이에이에이 aaa.sss(); // Err } }
2. 추상 클래스와 상속을 사용하여 다형성 예제를 만들기
abstract class Car{ abstract void run(); } class Ambulance extends Car{ void run(){System.out.println("앰블런스 지나가요");} } class Cultivator extends Car{ void run(){System.out.println("경운기 지나가요");} } class SportsCar extend Car{ void run(){System.out.println("스포츠카 지나가요");} } public class Java100_oop_Polymorphism5{ public static void main(String[] args){ // 객체 생성 Car c1 = new Ambulance(); Car c2 = new Cultivator(); Car c3 = new SportsCar(); // run() 메서드 호출 c1.run(); // 앰블런스 지나가요 c2.run(); // 경운기 지나가요 c3.run(); // 스포츠카 지나가요 } }
3. 다형성을 활용한 객체 생성 시 배열과 반복문을 사용하여 객체를 생성 (향상된 for문)
abstract class Car{ abstract void run(); } class Ambulance extends Car{ void run(){System.out.println("앰블런스 지나가요");} } class Cultivator extends Car{ void run(){System.out.println("경운기 지나가요");} } class SportsCar extend Car{ void run(){System.out.println("스포츠카 지나가요");} } public class Java100_oop_Polymorphism6{ public static void main(String[] args){ // [1] 배열 길이가 3인 Car 객체 배열 선언 Car[] cars = new Car[3]; System.out.println(cars[0]); // 각 배열에는 아직 null 값만 존재 cars = new Car[]{new Ambulance(), new Cultivator(), new SportsCar()}; // cars 배열 초기화 // [2] (다른 방법) 자식 클래스로 객체 생성 -> 부모 타입으로 -> 생성된 객체들로 배열 초기화 -> 다형성 덕분 Cars[] cars = {new Ambulance(), new Cultivator(), new SportsCar()}; // [3] 반복문 돌면서 각 객체의 run() 메서드 호출 for(int i=0; i<cars.length; i++){ System.out.println(cars[i]); // 각 객체가 생성된 메모리 공간의 주소 값 출력 cars[i].run(); } // [4] 향상된 for문 for(Car obj:cars){ obj.run(); } } }
4. 다형성을 사용하면 배열이나 매개변수 활용에 좋은 이유를 코드로 설명
class Person{} class Batman extends Person{} class Human{} class Superman extends Human{} public class Java100_oop__Polymorphism7{ public static void main(String[] args){ // 배열에서 다형성을 사용할 수 없다면 // 배열 -> 동일한 타입의 데이터를 하나로 묶어서 관리하는 자료구조 -> 다형성이 없다면 -> 각 객체별로 관리를 해야 한다 Person[] persons = new Person[10]; // 이건 Person 전용 Persons[0] = new Person(); Persons[1] = new Person(); Batman[] batmans = new Batman[10]; // 이건 Batman 전용 batmans[0] = new Batman(); batmans[1] = new Batman(); // 배열에서 다형성을 사용할 수 있어서 Human[] humans = new Human[10]; humans[0] = new Human(); humans[1] = new Superman(); // 매개변수의 다형성 // 프로그래밍 언어에서 함수나 메서드를 호출할 때는 그에 맞는 적절한 파라미터를 보내줘야 함 // System.out.println() 메서드의 경우 어떤 타입, 객체를 매개변수로 받더라도 에러 없이 해당 객체의 값을 출력 // 그것이 가능한 이유 -> 다형성을 활용하고 있기 때문에 // 실제 메서드의 API를 보면 -> public void println(Object x)로 되어있기에 어떤 객체 타입이 전달되더라도 에러 없이 출력 가능 // 결론적으로 Object는 가장 최상위 조상이므로 어떤 객체를 보내도 그보다 상위 타입이 됨 System.out.println(new Person()); System.out.println(new Batman()); System.out.println(new Human()); System.out.println(new Superman()); } }
'개발자 수업 > 인터넷 강의' 카테고리의 다른 글
자바 100제 Part.4 / 8 ~ 13 (0) 2021.09.27 자바 100제 Part.4 / 1 ~ 7 (0) 2021.09.23 자바 100제 Part.3 / 14 ~ 23 (0) 2021.09.18 자바 100제 Part.3 / 5 ~ 13 (0) 2021.09.17 자바 100제 Part.3 / 1 ~ 4 (0) 2021.09.17