ABOUT ME

Today
Yesterday
Total
  • [JAVA]java 오버로딩(overloading)과 java 오버라이딩(overriding)/java 다형성/java 다운캐스팅(downcasting)
    Languages/Java 2021. 2. 28. 20:15
    반응형

     

    오버로딩과 오버라이딩

     

     

    오버로딩(Overloading) : 같은 이름의 메소드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술이다

                                   (쉽게 말해 이름이 똑같은 메서드가 여러개있는것. )

    오버라이딩(Overriding) : 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의 해서 상요한다.

                                    (쉽게 말해 부모클래스것을 덮어서 썼다.)

     

     

     

    오버라이딩

    (+덧 붙이는 설명 : 동물이란 부모클래스안에 개라는 자식클래스를 만들고

                             eat()이 dog클래스의 객체에 대하여 호출되면 dog클래스 안의 eat이 호출

                             즉 dog의 eat()이 Animal의 eat()을 오버라이딩 한다)

     

    부모클래스(Animal)

    package inheitance;
    
    public class Animal {
    	{
    		System.out.println("동물이 먹고 있습니다");
    	}
    
    }
    

     

    자식클래스(Dog)

     

    package inheitance;
    
    public class Dog extends Animal {
    	public void eat() {
    		System.out.println("강아지가 먹고 있습니다.");
    	}
    	
    
    }
    

     

    테스트 구현(DogTest)

     

    package inheitance;
    
    public class DogTest {
    
    	public static void main(String[] args) {
    		Dog dog = new Dog();
    		dog.eat();
    
    	}
    }
    

     

     

    실행결과

     

     

     

     

     

    가상 매서드

     

    프로그램에서 어떤 객체의 변수나 메서드의 참조는 그 타입에 따라 이루어진다
    가상 메서드의 경우는 타입과 상관없이 실제 생성된 인스턴스의 메서드가 호출되는 원리

     

     

    다형성

     

     

    하나의 코드가 여러가지 자료형으로 구현되어 실행되는 것
    정보은닉 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나
    객체지향 프로그래밍 유연성,재활용성,유지보수성에 기본이 되는 특징이다

     

     

    다형성 구현하기

     

    하나의 클래스를 상속 받은 여러 클래스가 있는 경우
    각 클래스마다 같은 이름의 서로 다른 매서드를 재정의 한다
    상위 클래스 타입으로 선언된 하나의 변수가 여러 인스턴스에 대입되어
    다양한 구현이 실행될 수 있다

     


    다형성 활용하기

     

    일반 고객과 vip고객의 중간 등급의 고객을 생성
    5명의 고객을 arrayList에 생성하여 저장한 다음
    각 고객이 물건을 샀을 때의 가격과 보너스 포인트를계산한다

     

     

     

    다형성 코딩실습

     

    (+덧붙이는 설명 : 동물이란 클래스안에 사람,호랑이,새등이 상속되어 구현

                            한 클래스 안에 동물테스트를 같이 구현하여 실행값을 알아본다

                            이 때 한 클래스 안에 다형성이 실행되었다. )

    package inheitance;
    
    class Animal{
    	public void move() {
    		System.out.println("동물이 움직입니다");
    	}
    }
    
    
    class Human extends Animal{
    	public void move() {
    		System.out.println("사람이 두발로 걷습니다");
    	}
    }
    
    class Tiger extends Animal{
    	public void move() {
    		System.out.println("호랑이가 네발로 뜁니다");
    	}
    }
    
    class Eagle extends Animal{
    	public void move() {
    		System.out.println("독수리가 하늘을 날읍니다");
    	}
    }
    
    public class AnimalTest {
    	
    	public static void main(String[] args) {
    		
    		AnimalTest test = new AnimalTest();
    		
    		test.moveAnimal(new Human());
    		test.moveAnimal(new Tiger());
    		test.moveAnimal(new Eagle());
    		
    		//Animal animal = new Human();
    		
    	}
    	
    	public void moveAnimal(Animal animal) {// 다형성이 구현되었다.
    		
    		animal.move();
    	}
    
    }
    

     


    실행결과

     

     

    다운 캐스팅 - instnaceof

     


    하위클래스가 상위클래스로 형 변환 되는 것은 묵시적으로 이루어진다
    다시 원래 자료 형인 하위 클래스로 형 변환 하려면 명시적으로 다운 캐스팅을 해야한다
    이때 원래 인스턴스의 타입을 체크하는 예약어가 instanceif이다

     

    package inheitance;
    
    class Animal{
    	public void move() {
    		System.out.println("동물이 움직입니다");
    	}
    }
    class Human extends Animal{
    	public void move() {
    		System.out.println("사람이 두발로 걷습니다");
    	}
    	public void readBook() {
    		System.out.println("사람이 책을 읽습니다");
    	}
    }
    
    class Tiger extends Animal{
    	public void move() {
    		System.out.println("호랑이가 네발로 뜁니다");
    	}
    	public void hunting() {
    		System.out.println("사냥을 할 수 있습니다");
    	}
    }
    
    class Eagle extends Animal{
    	public void move() {
    		System.out.println("독수리가 하늘을 날읍니다");
    	}
    	public void flying() {
    		System.out.println("하늘을 날 수 있습니다");
    	}
    }
    
    public class AnimalTest {
    	
    	public static void main(String[] args) {
    		
    		AnimalTest test = new AnimalTest();
    		
    		test.moveAnimal(new Human());
    		test.moveAnimal(new Tiger());
    		test.moveAnimal(new Eagle());
    		
    		//Animal animal = new Human();
    		
    		
    	}
    	
    	public void moveAnimal(Animal animal) {// 다형성이 구현되었다.
    		
    		animal.move();
    		
    		/*Human human = (Human)animal;
    		human.readBook();컴파일링은 되나 */
    		
    		if(animal instanceof Human) { //다운 캐스팅의 키워드
    			Human human = (Human)animal;
    			human.readBook();
    		}
    		else if(animal instanceof Tiger) {
    			Tiger tiger = (Tiger)animal;
    			tiger.hunting();
    		}
    		else if(animal instanceof Eagle) {
    			Eagle eagle = (Eagle)animal;
    			eagle.flying();
    		}
    		else {
    			System.out.println("지원되지 않는 기능입니다");
    		}	
    	}
    }
    

     

    실행결과

     

    반응형

    댓글

Designed by Tistory.