달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2017. 7. 2. 21:33

java 자바 바인딩 개념 C. Java2017. 7. 2. 21:33

상속 (Inheritance) : 코드의 재사용

 
구조     class A {  }
           class B extends  A
 
           묵시적으로  extends Cobject 따라온다.
 
 
 
메소드 오버라이딩
: 상속에서의 메소드 재정의 개념- 자식클래스에서 부모클래스의 메소드를 동일한 이름하에 내용을
  새롭게 정의하여 사용하는것
 
ex)  class Parent {
 
             punlic void parentPrn() { System.out.println(" 난 슈퍼클래스 메소드 "); } 
       } 
 
       class  Child extends Parent{
           
              public void parentPrn(){ System.out.println(" 난 슈퍼클래스 메소드 재정의 했지요 ");  }
              public void childPrn()    { System.out.println(" 난 서브클래스 메소드 ");  }
       }
 
    
        class SuperSub01{             
              punlic void main(String []  args){
                  
                      Child c = new Child();
                      c.parentPrn();                      //재정의된 메소드 호출
                      c.childPrn();
 
                      Parent p = Parent();
                      p.parentPrn();                      //부모 메소드 호출
              }
        }
 
 
 
 
레퍼런스 변수 super
: super는 슈퍼 클래스를 가리키는 레퍼런스 변수인데 클래스 인스턴스가 생성될때 기본적으로 제공
  된다. 서브 클래스에서 오버라이딩하면 슈퍼 클래스의 해당 메서드가 은닉화되는데 이렇게 서브클
  래스에서 오버라이딩된 슈퍼클래스의 메소드나 은닉화된 변수를 호출할때
 사용한다.
 
ex)   class Parent {
             protexted int x=10;
             punlic void parentPrn() { System.out.println(" 슈퍼클래스 x출력:" + x); } 
       } 
 
       class  Child extends Parent{
              protexted int x=40;  
                  // ->슈퍼클래스에서 존재하는 멤버변수를 서브클래스에서 다시한번 정의함 
              protexted int y=30;
 
              public void parentPrn(){ 
                     super.parentPrn();   
                          // -> 슈퍼클래스의 메소드를 사용하고 싶을때는  super를 사용하면된다.
                     System.out.println(" 재정의 되었지만 슈퍼클래스의 x를사용 슈퍼클래스의x="
                                                + super.x);
                       
              }
              
              public void childPrn()    { System.out.println(" 난 서브클래스 메소드 ");  }
       }
 
    
        class SuperSub01{             
              punlic void main(String []  args){
                  
                      Child c = new Child();
                      c.parentPrn(); 
              }
        }
 
 
 
 
상속에서의 생성자 
 => 1. 생성자는 상속되지 않는다
     2. 서브 클래스에서 인스턴스가 생성될때 자신의 생성자가 호출되면서 슈퍼클래스의 생성자를
         연속적으로
자동호출한다.
         이때 자동생성되는 생성자는 전달인자가 없는 디폴트 생성자형태이다.
     3. 슈퍼클래스의 생성자가 먼저 실행되고 서브 클래스의 생성자가 실행된다.
 
 
super()
ps. 2번과같은 상황에서의 문제점
: 슈퍼클래스에서 전달인자가 있는 생성자를 만들고, 전달인자가 없는 생성자를 만들지 않았을경우
  서브클래스에서 슈퍼클래스의 생성자를 자동호출하면서 에러가 발생한다.(전달인자가 없는 디폴트 생성자를 자동호출함으로...)
 
해결방안:
1. 슈퍼 클래스에 전달인자가 없는 디폴트 생성자를 명시적으로 정의한다.
2. 서브 클래스에서 슈퍼클래스의 전달인자가 있는 생성자를 명시적으로 호출한다. 호출방법은 super()를 이용한다.
 
 
ex)   class Parent {
             //멤버필드
             protexted int x=10;
            
             //생성자
             public parent(){ System.out.println("슈퍼클래스의 전달인자가 없는 생성자") } 
                 //-> 전달인자가 있는 생성자를 만들때 이렇게 명시적으로 전달인자가 없는 생성자를
                         만들어주거나
             public parent(int xx){ x=xx; }
 
             //메소드
             punlic void parentPrn() { System.out.println("x=" + x); } 
       } 
 
 
       class  Child extends Parent{
              //서브클래스 멤버필드
              protexted int y=30;
    
             //서브클래스 생성자
              public Child(){
                super(100);   //->슈퍼클래스의 전달인자가 있는 생성자를 명시적으로 호출하면된다. 
                                            단, 호출위치는 서브클래스의 생성자에서 제일먼저 호출해야한다. 
                   y=50;
              }              
   
              //서브클래스 메소드  
               public void parentPrn(){ 
                     parentPrn("x+y=" + (x+y));                
              }
              
              public void childPrn()    { System.out.println(" 난 서브클래스 메소드 ");  }
       }
 
    
        class SuperSub01{             
              punlic void main(String []  args){
                  
                      Child c = new Child();
                      c.parentPrn(); 
              }
        }
 
 
 
 
하나의 클래스안에는 public이 하나만 있어야 한다!
 
 
오버로딩    : 동일 class 내에서 동일이름,메서드명을 사용(인자만 틀리게)
 
오버라이딩 : 상속관계에서 동일한 메서드로(동일 메소드명, 동일인자)를 재정의하여 사용
 
 
 
 
ps. 바인딩 개념 -> 메소드는 최종 오버라이딩 된것으로 호출된다.
 

동적바인딩:
프로그램 실행중 함수가 호출될 때 그 메모리 참조를 알아내는 것을 뜻합니다.
이는 메서드 오버로딩이나 오버라이딩 구현개념이죠. 즉, 메서드가 같은 이름이라도 인자나 리턴값에 따라서
동적으로 호출되니, 호출될 때 그 메서드를 참조해야 하는 것이죠.
이때 메서드가 호출된 메모리참조를 알아내는 작업을 수행하는 시간이 약간의 시간을 잡아 먹습니다.
다시 쉽게 말하자면 실행시에 참조변수와
인스턴스등을 연결하기 때문에 컴파일 때 연결하는 것보다 속도가 좀 떨어지게 됩니다.
하지만, 동적바인딩은
실행시에 연결되기 때문에 굉장한 유연성을 갖게 됩니다.

정적바인딩(컴파일시 바인딩):
참조변수와 인스턴스를 컴파일때 연결하는 것이라 컴파일시에 모든 연결(호출)이 결정나버리죠. 그래서 실행시에 연결을 변경할 수 없습니다.


'C. Java' 카테고리의 다른 글

java 자바 JDBC  (0) 2017.07.02
java 자바 생성자 this  (0) 2017.07.02
java 자바 배열  (0) 2017.07.02
java 자바 클래스속성 접근지정자  (0) 2017.07.02
File 객체 - 파일,디렉토리 생성 변경 삭제  (0) 2017.07.02
:
Posted by sfeg