ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 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

    댓글