JAVA/in 기초

Overloading, Constructor, Inheritance, Overriding, this, super

lahuman 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