ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 다형성
    java 2020. 5. 9. 13:02

    다형성

     참조변수를 통한 객체 접근

     -클래스로부터 객체를 생성하고 생성된 객체의 주소 값을 참조 변수에 넣어 줄 때 참조 변수의 타입에 따라 생성된 객체에 접근할 수 있는 영역은 달라진다.

     

    Overriding

     -부모 클래스가 가지고 있는 메서드를 자식 클래스에서 다시 구현한 것을 가르킨다.

     -메서드를 Overriding을 하고 부모 클래스의 메서드를 호출 하고자 할 때는 super를 이용한다.

     

    참조변수의 활용 

     -부모 클래스형 참조 변수를 통해 객체에 접근하면 부모 클래스의 영역에 접근을 하지만 호출하려는 메서드가 Overriding된 경우에는 자식 클래스에서 재 정의한 메서드가 호출이 된다.

     

     

    참조변수는 하나의 틀이고 객체는 실제 안에 들어가는 내용물이라고 생각하면 될 것같다. 

    틀에 없는 내용물은 들어가지 못한다. 하지만 틀에 정의되어 있으면 그 틀 안에 실제 내용물(객체, 오버라이딩 된 메서드등)이 들어간다.

     

    메인

    public class PolyTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		Class1 c1 = new Class1();
    		SuperClass super1 = new Class1();//참조변수는 부모로, 객체생성은 자식 클래스로 선언
    		
    		//생성자 관련해서 : 생성자가 있다면 객체를 생성만 해줘도 생성자가 실행된다.
    		//Class1은 SuperClass를 상속받고 있으므로 SuperClass의 생성자가 실행이 된다.
    		//자식 클래스에도 생성자가 있을 경우 먼저 부모클래스의 생성자를 호출하고, 
            //자식클래스의 생성자를 호출한다.
    		
    		System.out.println("---------------");
    		//부모클래스에 있는 변수와 메서드를 사용할 때
    		//Class1은 SuperClass를 상속받고 있으므로 부모 클래스의 변수와 메서드를 사용할 수 있다.(제한자에 따라 다를 수 있다.)
    		c1.superV1 = 100;
    		c1.superMethod();
    		
    		super1.superV1 = 200;
    		super1.superMethod();
    		
    		System.out.println("--------------");
    		//자식클래스에 있는 변수와 메서드를 사용할 때
    		c1.class1V1 = 300;//c1은 참조변수 객체변수 모두 Class1이므로 당연히 가능
    		c1.class1Method();
    		
    		//클래스1로 객체 생성을 했지만 참조변수로 부모 클래스 형을 받은 경우
    //		super1.class1V1 = 400;
    //		super1.classMethod();
    			//에러가 발생한다.
    			//객체는 객체를 생성할 때 사용한 클래스는 클래스 1이지만 
    			//해당 객체의 주소값을 담고 있는 참조변수가 부모클래스형 참조변수기 때문에 
    			//접근할 수 있는 영역은 부모클래스의 한정된다.
    			
    			//즉, 자식클래스형 참조 변수로 선언할 경우에는 모든 변수, 메서드 접근가능
    			//부모클래스로 객체에 접근할 때는 부모클래스 영역밖에 접근 할 수 없다.
    		
    			c1.superMethod2();
    			super1.superMethod2();//자식클래스에서 오버라이딩한 메서드가 출력이 된다.
    						//즉 부모클래스형 참조변수로 메서드를 호출할 경우 
                            //원래 부모클래스에 있는 메서드를 자식클래스가 오버라이딩 했다면
    				//그 메서드는 호출하면 자식클래스에서 오버라이딩한 메서드가 호출이 된다.
    	}
    
    }

    부모클래스

    public class SuperClass {
    	
    	//생성자
    	public SuperClass() {
    		System.out.println("부모클래스의 생성자");
    	}
    	
    	public SuperClass(int a) {
    		System.out.println("부모 클래스의 생성자2 - a :" + a);
    	}
    
    	
    	int superV1;
    		
    	public void superMethod() {
    		System.out.println("superClass의 메서드 - superV1 : " + superV1);
    	}
    	
    	public void superMethod2() {
    		System.out.println("superClass의 메서드2");
    	}
    	
    	
    }
    

     

     

    자식클래스

    	//Class1은 SuperClass를 상속받고 있다.
    public class Class1 extends SuperClass{
    	
    	public Class1() {
    		//자식클래스의 생성자에서 부모클래스의 생성자를 선택해서 호출.(파라미터에 값을 줘서)
    		super(100);
    		System.out.println("자식클래스의 생성자");
    		
    	}
    	
    	int class1V1;
    	
    	public void class1Method() {
    		System.out.println("Class1의 메서드 - class1V1 :" + class1V1);
    	}
    	
    	public void superMethod2() {
    		System.out.println("자식클래스에서 overRidng한 superMethod2");
    		
    		//오버라이딩한 메서드에서 부모클래스가 가지고 있는 메서드를 호출하고 싶을 때
    		super.superMethod2();
    	}
    }
    

     

    참조 : 인프런 -안드로이드를 위한 자바 - 다형성

    참조 : https://asfirstalways.tistory.com/168

     

    [JAVA] 9. 다형성 / 객체지향적 이해, 다형성과 클래스, 다형성과 인터페이스

    Chapter 9. 다형성 (Polymorphism) 다형성의 사전적 정의는 같은 종의 생물이지만 모습이나 특징이 고유한 특징이 다양한 성질을 의미한다. 단어의 뜻부터 어려운 이 다형성이 객체지향개념의 중요한 특징 중 하나..

    asfirstalways.tistory.com

     

    'java' 카테고리의 다른 글

    폴더가 존재하는지 존재하지 않는지 보고 존재하지 않으면 생성  (0) 2020.05.09
    File.mkdir()과 File.mkdirs()의 차이점  (0) 2020.05.09
    Stream개념  (0) 2020.05.09
    generic  (0) 2020.05.07
    Calendar  (0) 2020.05.07

    댓글

Designed by Tistory.