본문 바로가기

프로그래밍/Java (기초)

초기화와 생성자(Constructor), this, super

반응형

초기화와 생성자(Constructor)


어떤 일을 시작하기전에 준비를 하는 상태.. (컴퓨터를 부팅하고, 스피커의 전원을 켜는것과 같은) 일을 초기화라고 부르며

객체 지향 프로그래밍, 즉 자바에선 이런 개념을 생성자(Constructor)라고 부른다.



class Calculator {

    int left = 100; int right = 100;

 

public Calculator(int left, int right) {

    this.left = left;

    this.right = right;

} .........


public static CalculatorRun{

public static void(String args []){

Calculator c1 = new Calculator(1020);

System.out.Print(left, right);

System.out.Print(super.left, super.right);

}

}

}



결론부터 적자면, 생성자라는 것은 클래스명과 같은 메소드를 생성자라고 한다.

즉 해당 코드의 클래스 명은 Calculator이다.


이때 생성자에 해당하는 코드는


public Calculator(int left, int right) {

    this.left = left;

    this.right = right;

}


이라고 할수 있다.



생성자는 단어 뜻처럼, 객체를 생성할때 호출된다.

쉽게 생각하면, 변수 선언을 초기화라고 하는것처럼, 클래스도 생성하면 초기화하는 것이라고 생각하면 된다.


하지만 생성자는 변수의 초기화와 다르게, 개발자가 직접 생성하지 않아도, JVM이 알아서 생성해준다.

이러한 생성자는 default 생성자라고 하며, 매개변수 없는 생성자이다.

Calculator 클래스에서는 다음과 같은 모습일것이다.



public Calculator(){};





This, Super


그렇다면 최초에 생성한 코드로 다시 돌아가보자, 


class Calculator {

    int left = 100; int right = 100;

 

public Calculator(int left, int right) {

    this.left = left;

    this.right = right;

} .........


public static CalculatorRun{

public static void(String args []){

Calculator c1 = new Calculator(1020);

System.out.Print(left, right);

System.out.Print(super.left, super.right);

}

}

}


예제 코드를 약간 수정해서 다음과 같은 경우 일때

this가 붙은 변수는 이것이 매개변수로 받은 left변수와 right변수라는 것을 뜻한다.

그러므로, print되어 나오는 값은 10,20이 나오게 된다.


하지만 

그 다음에 출력되는 print 값은 super.left, super.right인데

이 값은 100,100으로 출력되게 된다.

즉 super는 전역변수를 뜻하는것이고, 만약 상속관계에 있다면, 최상위 클래스에 있는 left와 right를 의미하게 된다.

(이는 상속에 대한 개념을 이해하면 알수 있게 된다)


즉 this와 super를 쓰는 이유는, 프로그램을 개발하고 코딩을 함에 있어, 규모가 커질수록, 분명히 같은 이름의 변수들이 

여기저기에 혼재 할수 밖에 없게 되는 숙명을 가지는데


코드의 길이가 길어지고 프로그램의 규모가 커질수록

이 변수가 전역변수인지, 혹은 메소드 내에서만 사용하는 지역변수인지 혼선을 가지게 되고, 

super의 경우 매개변수와 이름이 같고, 로직상 전역변수를 꼭 호출해야 하는 상황등이 생기기 때문에 사용한다.


(요약: super와 this는 코드의 가독성과 개발에서의 혼선을 줄이기 위해 사용됨)




또한, 예제에 굳이 

public Calculator(int left, int right) {

    this.left = left;

    this.right = right;

}


를 이용하여 코드를 넣은 것은

Calculator c1 = new Calculator(10, 20);

Calculator c2 = new Calculator(); // 에러


다음처럼 객체를 생성할때 

생성자에서 파라미터 값인 left, right를 미리 선언 해놓으므로서

다음  c1객체 처럼 코드를 동작함에 있어 반드시 필요한 값인 좌,우항의 생성을 강제 해놓고, 이 절차에 필수적인 작업을 포함 시킨것은 중요한 의미를 갖는다.


거꾸로, c2처럼 매개변수 없이 객체를 생성하면 에러를 발생하게 된다.





생성자의 특징


- 값을 반환하지 않는다. 

생성자는 인스턴스를 생성해주는 역할을 하는 특수한 메소드라고 할 수 있다. 그런데 반환 값이 있다면 엉뚱한 객체가 생성될 것이다. 따라서 반환 값을 필요로하는 작업에서는 생성자를 사용하지 않는다. 반환 값이 없기 때문에 return도 사용하지 않고, 반환 값을 메소드 정의에 포함시키지도 않는다.


- 생성자의 이름은 클래스의 이름과 동일하다.

자바에서 클래스의 이름과 동일한 메소드는 생성자로 사용하기로 약속되어 있다.



반응형

'프로그래밍 > Java (기초)' 카테고리의 다른 글

인터페이스(interface)  (0) 2016.03.26
상속(inheritance)  (0) 2016.03.26
유효범위 (Scope)  (0) 2016.03.26
입력과 출력. String[] args  (0) 2016.03.18
메소드의 입력과 출력  (0) 2016.03.18