본문 바로가기

IT/Java

2013.01.09. Java Constructor, 변수캡슐화, Static, 상수




2013.01.09. Java Constructor, 변수캡슐화, Static, 상수


클래스 내 기본생성자 외 다양한 생성자가 필요한 이유와 주의사항

- 객체간 초기화하고자 하는 파라미터가 다를 수 있기 때문에.

ex: 회원가입시 필수정보 외 선택적으로 입력하는 추가정보들.

- 중복되는 파라미터의 경우 파라미터의 데이터타입과 그 개수가 일치해야함.

- OverLoad : 하나의 클래스 안에 클래스명이 동일한 메서드를 선언하는 행위.


Default 생성자 : 클래스에서 생성자가 존재하지 않을 경우 JVM(Java Virtual Machine)에 의해 default생성자가 자동으로 생성된다.

 단, 클래스에 파라미터를 받는 생성자가 존재할 경우 default생성자는 자동으로 생성되지 않는다.

 이 경우 에러가 발생하므로 항상 default생성자를 수동생성하는 습관을 들이는 것이 좋다. ex: public Manager(){}


This함수 : 생성자 내에서 또 다른 생성자를 호출하고자 할 때. (중복되는 코드를 방지하기 위해서).

     this를 단독으로 사용할 경우(ex: this.name) 해당 클래스의 객체를 의미한다.

주의) This함수는 항상 생성자의 첫 번째 줄에 위치해야한다!


접근제어자의 종류

① private - 동일한 클래스 내에서만 접근 가능. (w/ getter/setter와 함께 활용 → 변수의 캡슐화)

② default - 접근제어자가 존재하지 않을 경우, 동일한 패키지 내에서만 접근 가능.

③ protected - 다른 패키지에 존재하더라도 해당 패키지가 상속관계에 있다면 접근 가능.

④ public - 자유롭게 접근이 가능.


변수의 캡슐화 : 변수를 private접근제어자로 보호해줄 경우 다른 클래스에서 접근할 수 없음. 

따라서 반드시 getter/setter메서드를 통한 초기화와 호출이 요구되는데, 이를 변수의 캡슐화라 한다.

Tip) Source탭 → 'Generate setters and getters' 명령어로 간단하게 생성 가능.


클래스의 정적 구성요소 (static변수)

- static키워드를 사용하여 선언 가능.    ex: static int grandTotal = 0;

- static을 사용하면 :

1) 클래스에 포함된 메서드는 객체를 생성하지 않고도 호출할 수 있다.    ex: 클래스명.변수명(or 메서드명)

2) 클래스가 로딩될 때 static변수 및 메서드가 생성(메모리에 할당)된다.

3) 객체에 따라 값이 변하는 일반 멤버변수와 달리 클래스 생성 당시 생성된 채로 변하지 않으므로

    static키워드를 통해 정적 상태로 지정된 변수는 공용변수로서 사용하기 위한 경우가 많다.


ex: 멤버변수와 정적변수의 초기화명령문 예와 메모리 할당 시기

class Accumulator {

int total = 0;                        … 멤버변수 : new연산자로 객체를 생성시 메모리 할당

static int grandTotal = 0;        정적변수 : 클래스 로딩시 메모리 할당


※ Main메서드가 static메서드로 지정되어 있는 이유는?

Main메서드 내에선 객체를 생성할 수 있는 기회가 없기 때문에, 프로그램의 구동에 요구되는

Main메서드의 명령문들을 객체 없이도 호출할 수 있게 하기 위해 메서드 시그니쳐에 static구문을 추가해주는 것이다.


주의) 클래스 내 static구문이 적용된 메서드 내에서 non-static변수를 사용하려할 경우 에러가 발생한다.

이유) static구문이 적용된 변수나 메서드와 non-static변수 혹은 메서드는 생성되는 타이밍 자체가 다르기 때문.

해결) static메서드 내에서는 static구문이 적용된 변수를 사용하면 된다.

반대로) non-static메서드 내에서 static변수나 메서드는 참조가 가능하다. 이미 생성이 되어있기 때문.


상수필드(or 변수)의 지정

 - 객체 없이 클래스명으로 호출하기 위해 static을 적용.

 - 변수값의 변경을 막기 위해 final 적용.

 - 가급적이면 변수명은 대문자로 지정.


 ex: 상수값의 지정 및 호출의 예

     class LimitValues {

          public static final int UPPER_LIMIT = 100000;

               this.value = LimitValues.UPPER_LIMIT;