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; |