1. this 예약어
1. 자신의 메모리를 가리키는 this
this는 생성된 인스턴스 자신을 가리키는 역할을 한다.
class BirthDay {
int day;
public void setDay(int daY) {
this.day = day;
}
}
2. 생성자에 다른 생성자를 호출하는 this
this를 사용해 클래스의 생성자에서 다른 생성자를 호출할 수 있다.
(주의!) this를 사용하여 생성자를 호출하는 코드 이전에 다른 코드를 넣으면 오류가 난다!
(디폴트 생성자에서 생성이 완료되는 것이 아니라 this를 사용해 다른 생성자를 호출하므로)
class Person{
String name;
int age;
Person(){
this("이름 없음", 1); // Person(String, int) 생성자 호출
}
Person(String name, int age){
this.name = name;
this.age = age;
}
...
}
public class CallAnotherConst {
public static void main(String[] args) {
Person noName = new Person();
...
}
}
3. 자신의 주소를 반환하는 this
this를 사용하여 생성된 클래스 자신의 주소값을 반활할 수 있다.
인스턴스 주소값을 반환할 때는 this를 사용하고 반환형은 클래스 자료형을 사용한다.
2. 객체 간 협력
하나의 경우에 대해 두 객체에서 서로 다른 일이 발생하는 것이므로 이를 각각의 클래스에 메서드로 구현한다.
3. static 변수
1. 변수를 여러 클래스에서 공통으로 사용하려면?
예를 들어, 학번을 멤버 변수로 갖는 학생 클래스가 있다고 가정하자.
학생 클래스가 새로 생성될 때마다 자동으로 학번이 증가하게끔 하고 싶다.
이 경우 각 인스턴스마다 따로 생성되는 변수가 아닌 클래스 전반에서 공통으로 사용할 수 있는 기준 변수가 있어야 한다. 그리고 학생이 한 명 생성될 때마다 기준 변수 값을 하나씩 증가시켜 각 학생 인스턴스의 학번 변수에 대입해 주면 된다.
이때 클래스에서 공통으로 사용하는 변수를 static 변수로 선언한다.
2. static 변수의 정의와 사용 방법
static 변수(정적 변수, 클래스 변수)는 클래스를 선언할 때 특정 메모리에 저장되어 그 값을 모든 인스턴스가 공유한다.
클래스 내부에 선언하지만, 다른 멤버 변수처럼 인스턴스가 생성될 때마다 새로 생성되는 변수가 아니다.
3. 클래스 변수
<static 변수 참조 방법 2가지>
2가지 방법이 있지만 일반적으로 클래스명으로 직접 참조한다.
1) 인스턴스로 참조
일반 멤버 변수와 같이 인스턴스로 참조하여 사용할 수 있다.
Student student = new Student();
student.name // 위에서 생성한 인스턴스로 참조
2) 클래스명으로 직접 참조
staitc 변수는 인스턴스 생성과 관계없이 먼저 생성되므로 인스턴스가 아닌 클래스 이름으로도 참조하여 사용할 수 있다.
Student.name // Student 클래스명으로 직접 참조
4. 클래스 메서드
클래스 메서드(static 메서드)란 static 변수를 위한 메서드이다.
static 메서드도 static 변수처럼 인스턴스 참조 변수가 아닌 클래스 명으로 직접 호출 할 수 있다.
public class Student2 {
private static int serialNum = 1000; // static 변수
int studentID;
public Student2(){
serialNum++;
studentID = serialNum;
}
...
// static 메서드
public static int getSerialNum() {
return serialNum;
}
public static void setSerialNum(int serialNum) {
Student2.serialNum = serialNum;
}
}
여기서는 static 변수가 private로 선언되고 외부에서 접근할 수 없으므로 외부 클래스에서 serialNum값을 사용하기 위해 get(), set() 을 static 메서드로 제공한다.
5. 클래스 메서드와 인스턴스 변수
클래스 메서드 내부에서는 지역변수와 클래스 변수는 사용할 수 있지만 인스턴스 변수를 사용할 수 없다!
static 메서드도 static 변수처럼 인스턴스 참조 변수가 아닌 클래스 명으로 직접 호출 할 수 있다.
클래스 메서드와 클래스 변수는 인스턴스가 생성되지 않아도 사용할 수 있다!
4. 변수 유효 범위
변수 유형 | 선언 위치 | 사용 범위 | 메모리 | 생성과 소멸 |
지역 변수 (로컬 변수) |
함수 내부에 선언 | 함수 내부에서만 사용 | 스택 | 함수가 호출 될 때 생성, 끝나면 소멸 |
멤버 변수 (인스턴스 변수) |
클래스 멤버 변수로 선언 | 클래스 내부에서, private이 아니면 참조 변수로 다른 클래스에서 사용 |
힙 | 인스턴스가 생성될 때 힙에 생성, 가비지 컬렉터가 메모리를 수거할 때 소멸 |
static 변수 (클래스 변수) |
static 을 붙여 클래스 내부에 선언 | 클래스 내부에서, private이 아니면 참조 변수로 다른 클래스에서 사용 |
데이터 영역 | 프로그램이 처음 시작할 떄 상수와 함께 생성, 프로그램이 끝나고 메모리를 해제할 때 소멸 |
5. static 응용 - 싱글톤 패턴
1. 싱글톤 패턴이란?
객체지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴을 싱글톤 패턴이라고 한다.
여기서는 static을 응용하여 프로그램 전반에서 사용하는 인스턴스를 하나만 구현하는 방식이다.
예를 들어, 회사 직원을 객체 지향 프로그램으로 구현할 때 직원은 여러 명이지만 회사는 하나이다. 이런 경우 직원 인스턴스는 여러개 생성하지만 회사 객체는 하나만 생성해야 한다.
2. 싱글톤 패턴으로 회사 클래스 구현하기
1) 생성자를 private으로 만들기
컴파일러가 자동 생성해주는 디폴트 생성자는 항상 public이다. 생성자가 public이면 외부 클래스에서 인스턴스를 여러개 만들 수 있기 때문에 싱글 톤에서는 반드시 생성자를 private으로 만들어야 한다.
2) 클래스 내부에 static으로 유일한 인스턴스 생성하기
하나만 생성되어야 하는 회사 클래스 내부에서 하나의 인스턴스를 생성한다. 외부 클래스에서 이 인스턴스에 접근하지 못하도록 private로 선언한다.
3) 외부에서 참조할 수 있는 public 메서드 만들기
private로 선언한 유일한 인스턴스를 외부에서 사용할 수 있도록 public 메서드를 생성한다.
인스턴스를 반환하는 메서드는 반드시 static으로 선언하여 인스턴스 생성과 상관 없이 호출할 수 있도록 해야한다.
public class Company {
// 2
private static Company instance = new Company();
// 1
private Company(){}
// 3
public static Company getInstance(){
if(instance == null){
instance = new Company();
}
return instance;
}
}
'Java > Do It! 자바 프로그래밍' 카테고리의 다른 글
[JAVA] 10. 인터페이스 (0) | 2022.05.07 |
---|---|
[JAVA] 09. 추상 클래스 (0) | 2022.05.06 |
[JAVA] 08. 상속과 다형성 (0) | 2022.05.04 |
[DoItJava] 07. 배열과 ArrayList (0) | 2022.05.04 |
[DoItJava] 05. 클래스와 객체1 (0) | 2022.05.03 |