1. 필드(Field)
(1) 특징
① 클래스를 구성하는 요소 중 하나
② 클래스 내부에서 메소드 밖의 영역에 정의가 되는 지역변수의 개념
③ 어떠한 데이터를 저장하기 위한 역할(= 변수)
(2) 변수의 구분
① 전역변수
: 클래스 영역에 바로 선언하는 변수(클래스 내부이면 어디서든 사용할 수 있다.)
ⓐ 멤버변수(인스턴스변수, 필드)
- 생성 시점: new 연산자를 통해 해당 객체를 생성하는 순간에 heap 메모리 영역에 할당된다.
- 소멸 시점: 객체가 소멸될 때 같이 소멸된다.(Garbage Collector가 지워줄 때)
ⓑ 클래스변수(static 변수 - static이라는 예약어가 붙은 변수)
- 생성 시점: 프로그램이 실행과 동시에 static 영역에 할당된다.
∴ 해당 객체가 생성되지 않아도 무조건 프로그램 실행과 동시에 할당된다.
- 소멸 시점: 프로그램이 끝날 때 소멸된다.
② 지역변수
: 클래스 영역 내의 특정 구역({})에 선언하는 변수
ex) for(int i = 0; 조건식; 증감식) {} → 초기식에서 선언된 i는 지역변수이다.
- 생성 시점: 특정 구역({}) 실행 시 stack 메모리 영역에 할당된다.
- 소멸 시점: 특정 구역({}) 종료 시 소멸된다.
private int global; // 전역변수(global)
public void method(int number) { // 매개변수 = 지역변수
int local = 0; // 지역변수는 반드시 초기화를 해주어야 한다.
}
(3) 접근제한자
+ | public | 어디서든 접근이 가능 |
- | private | 오직 해당 클래스 내에서만 접근이 가능 |
~ | default | 같은 패키지에 해당 클래스 내에서 접근이 가능 |
# | protected | 같은 패키지에 해당 클래스 내에서 접근이 가능 단, 다른 패키지에서는 상속 관계라면 접근이 가능 |
(4) 클래스변수(static)와 상수 필드(static final)
① 클래스 변수(static)
ⓐ 생성 시점: 프로그램 실행과 동시에 static 영역에 할당된다. (객체를 생성하지 않아도 불러올 수 있다.)
소멸 시점: 프로그램 종료 시 소멸된다.
ⓑ static은 프로그램 실행과 동시에 메모리 영역에 할당되므로 그 값을 "공유"하기 위해 사용된다.
접근제한자 예약어 자료형 필드명; // 예약어는 생략 가능
public static String str = "static";
② 상수 필드(static final)
ⓐ 한 번 지정된 값은 계속 고정해서 쓰므로 무조건 초기화해야 한다.
ⓑ 주의! 상수 필드명은 모두 대문자로 써야 한다.
public static final 자료형 상수필드명 = 값;
// public final static으로 사용해도 된다.(예약어의 순서 상관 없음)
public class Field {
public static final int NUM = 10; // 매개변수 'NUM'(대문자)
}
만약에 NUM의 값을 변경하려고 한다면?
public class run {
public static void main(String[] args) {
Field.NUM = 20; // 에러 발생
}
}
-> NUM은 상수라서 값을 변경할 수 없다.
2. 생성자(Constructor)
(1) 특징
① 메소드명이 클래스명과 동일하고, return 자료형이 없다. (반환형이 존재하지 않는다.)
② 객체를 생성할 때 자동으로 기본값을 넣어주는 기본 생성자를 생성하거나(객체를 생성하면 메모리 공간을
할당받아야 하는데 heap 메모리 영역에 빈 공간이 있을 수 없기 때문), 임의로 초기값을 설정하고 싶을 때
매개변수 생성자를 이용한다.
③ 객체 생성 구문에 new부터가 생성자에 해당한다. 'Company c = new Company();'
④ 생성자가 여러 개 존재할 수 있다.(오버로딩)
하지만 매개변수의 자료형이나 개수, 순서가 달라야 한다.(이것들이 같으면 에러가 뜨고, 변수명이 다른 것도
에러가 뜬다.)
⑤ 주의! 매개변수 생성자를 명시적으로 작성하면 JVM이 기본 생성자를 생성해주지 않으므로 항상 기본 생성자를
만들어주어야 한다.
public 클래스명(매개변수) { // 소괄호 안 매개변수 생략 가능
만약에 매개변수 생성자일 경우 필드 초기화 구문이 들어간다.
this.empId = empId; // 매개변수 empId
}
(2) 종류
① 매개변수가 있는 생성자
② 매개변수가 없는 기본 생성자
→ 차이점: 매개변수가 있는 생성자는 필드값을 초기화하고, 기본 생성자는 초기화하지 않는다.
(3) 목적
① 객체를 생성하기 위해서 생성자를 사용한다.
② 객체를 생성하기 위함 뿐만 아니라 매개변수를 이용하여 전달된 값으로 필드를 초기화하기 위해 생성자를
사용한다.
public class User {
private String userId;
private String userPw;
private String userName;
private String pNum;
// 생성자명은 메소드명과 동일하게 User로.
public User() {} // 기본 생성자
public User(String userId) { // 매개변수가 하나인 생성자
this.userId = userId; // this()문을 이용하여 코드 줄이기
}
public User(String userId, String userPw) { // 매개변수가 두 개인 생성자
this(userId, userPw, null, null); // 필드에 선언되어 있으므로 매개변수가 없는 것은 기본값
}
public User(String userId, String userPw, String userName) { // 매개변수가 세 개인 생성자
this(userId, userPw, userName, null);
}
// 필드 전체를 받는 매개변수 생성자
public User(String userId, String userPw, String userName, String pNum) {
this.userId = userId;
this.userPw = userPw;
this.userName = userName;
this.pNum = pNum;
}
public String info() { // 문자열 String으로 모든 정보를 한번에 출력
return userId+" "+userPwd+" "+userName+" "+pNum;
}
}
public class UserRun { // 실행할 클래스
public static void main(String[] args) {
User user1 = new User(); // 기본 생성자(값이 없음)
User user2 = new User("user123", "user11"); // userId에 user123, userPw에 user11 입력
System.out.println(user1.info()); // info()를 user1로 호출
System.out.println(user2.info()); // info()를 user2로 호출
}
}
▼실행결과
null null null null // user1의 출력값
user123 user11 null null // user2의 출력값
3. 메소드(Method)
(1) 특징
① 입력값으로 어떤 일을 수행한 다음, 결과를 출력한다.
② 예약어와 매개변수, return;(반환형이 void인 경우)은 생략이 가능하다.
③ 호출할 때에 매개변수의 자료형과 개수가 일치해야 한다.
④ 메소드를 한 번 정의해두고 필요할 때마다 사용할 수 있다.
(2) 오버로딩(Overloading)
① 한 클래스 내에서 같은 메소드명으로 여러 메소드를 정의할 수 있다.
② 매개변수의 자료형 개수와 순서, 종류가 각각 다르게 작성되어야 한다.
③ 주의! 매개변수명과 접근제한자, 반환형은 오버로딩에 영향을 주지 않는다.
public void method() { // 입력값이 없음
System.out.println("null");
}
public void method(String pNum) {
// String가 추가되어 개수가 다름
}
public void method(String pNum, int num) {
// String은 같지만 int가 추가되어 개수가 다름
}
public void method(int num, String pNum) {
// 위와 비교했을 때 String, int가 있는 것은 같지만 순서가 다름
}
public void method(int pNum, String num, int cNum) {
// 위와 비교했을 때 String pNum이 int pNum으로, int num이 String num으로 매개변수의 자료형이 다름
// 하지만 매개변수명은 오버로딩에 영향을 주지 않으므로 상관 없음
}
private void method(int num) {
// 위와 비교했을 때 접근제한자가 public에서 private으로 다름
// 하지만 접근제한자는 오버로딩에 영향을 주지 않으므로 상관 없음
}