ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Overloading, Constructor, Inheritance, Overriding, this, super
    JAVA/in 기초 2014. 2. 2. 20:57
    728x90
    • Overloading
    오버로딩이란 하나의 메소드 이름에 여러 개의 메소드를 만들 수 있게 해주는 기법이다.

    오버로딩의 정의
     - 하나의 이름으로 여러개의 메서드를 만드는 기법

    오버로딩 메소드를 만드는 규칙
     - 반드시 매개변수의 개수나 매개변수의 형이 달라야 한다.

    오버로딩을 사용하는 이유
     - 해당 클래스의 메서드를 사용할 때 사용자의 편리를 위해서
     - 매서드의 이름 하나로 여러 가지 작업에 대처할 수 있다.

    * 오버로딩은 컴파일러가 발전하면서 등장한 기술이다. 컴파일러 차원에서 메서드의 이름을 자동으로 바꾸어 주기 때문에 사용자가 펴리하게 이것을 사용하는 것이다.

    //원본 소스
    int plus(int a, int b);
    float plus(float a, float b);
    double plus(double a, double b);
    
    //컴파일된 소스
    int plus_a(int a, int b);
    float plus_b(float a, float b);
    double plus_c(double a, double b);
    
    • Constructor
    생성자란 객체의 메모리를 생성할 때 함께 호출디는 메소드이다.

    생성자의 정의
     - 객체의 생성고 동시에 자동으로 호출되는 메서드

    디폴트 생성자
     - 생성자가 없는 클래스를 위해서 컴파일러는 매개변수를 가지지 않는 디폴트 생성자를 자동으로 만들어 준다.
     - 생성자가 없을 경우에만 컴파일러에 의해서 생성된다.

    생성자의 특징
     - 생성자는 리턴타입이 없다.
     - 생성자의 이름은 클래스의 이름과 동일하다
     - 생성자느 객체의 메모리가 생성되 직후에 호출된다.

    * 생성자는 사용자가 함부로 호출할 수 있는 메서드가 아니다. 대부분 new 와 함께 사용되며 예외적으로 생성자를 호출 할 수 있는 경우는 this와 super를 이용한 경우 뿐이다.


    //기본 생성자 호출
    TopConstructor tc = new TopConstructor();
    
    //매개변수를 가진 생성자 호출
    TopConstructor tc = new TopConstructor("lahuman");
    
    생성자의 특징2
     - 디폴트 생상자를 재정의 할 수 있다.
     - 사용자가 다른 생성자를 정의 하였다면 시스템에서 제공하는 생성자는 사용할 수 없다.
     - 생성자도 오버로딩 할 수 있다.

    • Inheritance
    상속이란 미리 만들어 둔 클래스를 다시 이용하는 방법을 말한다.
    상속이란?
     - 하위 클래스가 상위 클래스를 상속받았을 때, 하위 클래스는 상위 클래스의 모든 권한을 갖게 된다.

    상속과정에서 생성자의 호출
     - 생성자는 상속되지 않는다.
     - 하위 클래스의 객체를 만들 때, 상위 클래스에서 하위 클래스 순으로 생성자가 차례대로 호출된다.

    * 상속 과정에서 상위 클래스의 메모리가 생성되지 않느다면, 자식 레벨의 메모리는 생성되지 않는다. 이러한 이유에서 하위 객체를 만들면 상위 클래스의 생성자가 먼저 호출된다.

    다중상속
     - 자바에서는 원칙적으로 다중 상속을 허용하지 않는다.
     - 인터페이스(Interface)를 이용해서 변칙적으로 다중 상속을 지원하고 있다.

    접근 제한자
     - public : 모든 클래스에서 접근 가능
     - private : 자신의 클래스에서만 접근 가능
     - protected : 상속관계에서만 접근 가능
    • Overriding

    오버라이딩이란 상위 클래스에서 있는 메서드와 똑같은 메서드를 하위 클래스에서 다시 만드는 행위를 말한다.

    //상위 클래스
    public class TopConstructor {
        private String name = "";
        private String address = "";
        private int age = 0;
    
        public TopConstructor() {
            name = "lahuman";
            address = "대한민국";
            age = 34;
        }
    
        public TopConstructor(String n, String a, int g) {
            System.out.println("Call TopConstructor(String n, String a, int g)");
            name = n;
            address = a;
            age = g;
        }
    
        public String getData() {
            String x = name + "," + address + "," + age;
            System.out.println(x);
            return x;
        }
    }
    
    
    //하위 클래스
    public class MiddleConstructor extends TopConstructor {
    
        public MiddleConstructor(String n, String a, int g) {
            super(n, a, g);
            System.out.println("Call MiddleConstructor(String n, String a, int g)");
        }
    
        @Override
        public String getData() {
            return super.getData() + " 메롱";
        }
    
        public static void main(String[] args) {
            TopConstructor tc = new MiddleConstructor("lahuman", "대한민국", 22);
            String result = tc.getData();
            System.out.println(result);
        }
    }
    


    실행 결과

    Call TopConstructor(String n, String a, int g)

    Call MiddleConstructor(String n, String a, int g)

    lahuman,대한민국,22

    lahuman,대한민국,22 메롱


    * getData()의 결과가 상위 클래스의 getData가 아닌 하위 클래스의 getData가 호출된다.

    상위 메서드 이름으로 하위 메서드 호출

     - 하위 클래스의 메모리를 상위 클래스로 캐스팅 했을 때 그리고 메서드가 재 정의 되었을때, 상위 클래스의 객체명으로 메소드를 호출하면 재정의된 메서드가 호출된다.

     - 자바의 모든 메서드에 대해서 위와 같은 사항을 제공한다.


    캐스팅

     - 다운캐스팅 : 상위 클래스의 메모리가 하위 클래스로 캐스팅되는 것을 말한다. 

     - 업캐스팅 : 하위 클래스의 메모리가 상위 클래스로 캐스팅되는 것을 말한다.


    오버라이딩의 의미

     - 상위 클래스에서 가지고 있던 기능을 하위 클래스에서 개선하겠다는 의미



    • this 
    this의 개념
     - 자기 자신을 참조하는 가상의 참조 변수
     - 컴파일러가 자동으로 넣어 주는 멤버 메서드의 첫 번째 매개변수

    this의 기능1
     - 매서드의 매개변수와 클래스의 멤버 필드가 동일 하다면 구분할때 사용한다.
     - 필요 없다면 this 키워드는 사용하지 않아도 무방하다.

    this의 기능2
     - 클래스 내부에서 this를 사용하게 되면, 객체가 생성된 후 할당된 메모리의 참조값을 갖게 된다.
     - 언젠가 생성될 내 메모리의 참조값

    this의 기능3
     - this를 이용해서 생성자 내에서 다른 생성자를 호출 할 수 있다.
     - 생성자를 재 사용할 수 있다.
     - 생성자에서 다른 생성자를 호출할 때 생성자 호출은 제일 윗부분에 사용해야 한다.

    this를 이용해서 생성자를 호출할 때의 규칙
     - 반드시 생성자 내에서 다른 생성자를 호출 해야 한다.
     - 생성자에서 this를 이용한 생성자 호출은 어떠한 작업보다도 먼저 선행되어야 한다.
     - 즉 this를 이용한 생성자 호출 앞에는 어떠한 구문도 사용할 수 없다.

    *예제 코드
    public class SampleThis {
        private int age = 0;
        private String name = "";
    
        public SampleThis() {
            this(10, "lahuman");
        }
    
        public SampleThis(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public String getData() {
            return this.name + "," + this.age;
        }
    
        public SampleThis getSampleThis(){
            return this;
        }
    
        public static void main(String[] args){
            SampleThis st = new SampleThis();
            System.out.println(st.getData());
    
            st = st.getSampleThis();
            System.out.println(st.getData());
        }
    }
    

    • super
    상위 클래스를 참조할 수 있는 가상의 참조 변수
    super.메소드
     - 자식 클래스 내에서 상위 클래스를 참조하는 가상의 참조변수
     - 무시당한 상위 클래스의 메서드를 사용하고자 할 때 사용한다.
     - 클래스 내에서마 사용 가능하다.

    super()
     - 상위 클래스의 생성자 호출


    * 상속 예제를 참조 하세요.

    728x90

    'JAVA > in 기초' 카테고리의 다른 글

    Formatting 기능  (0) 2014.02.21
    예외처리(Exception)  (0) 2014.02.21
    컬랙션(Collection)과 맵(Map) 계열  (0) 2014.02.21
    Polymorphism  (0) 2014.02.03
    Java in Memory  (0) 2014.01.19
Designed by Tistory.