06-1. this 예약어
객체 자신을 가리키는 this
this가 하는 일
- 인스턴스 자신의 메모리를 가리킴
- 생성자에서 또 다른 생성자를 호출 할 때 사용
- 자신의 주소(참조값)을 반환 함
생성자에서 다른 생성자를 호출 하는 this
- 클래스에 생성자가 여러 개 인 경우, this를 이용하여 생성자에서 다른 생성자를 호출할 수 있음
- 생성자에서 다른 생성자를 호출하는 경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸 수 없음
06-2. 객체 간 협력 (collaboration)
- 객체 지향 프로그램에서 객체 간에는 협력이 이루어짐
- 협력을 위해서는 필요한 메세지를 전송하고 이를 처리하는 기능이 구현되어야 함
- 매개 변수로 객체가 전달되는 경우가 발생
- 객체 협력의 예
버스와 지하철을 타는 예제 프로그래밍
James와 Tomas는 각각 버스와 지하철을 타고 학교에 갑니다. James는 5000원을 가지고 있었고, 100번 버스를 타면서 1000원을 지불합니다. Tomas는 10000원을 가지고 있었고, 초록색 지하철을 타면서 1200원을 지불합니다. 두 학생이 버스와 지하철을 타는 상황을 구현해 봅시다. |
- 학생 클래스 구현
![]() |
2. 버스 클래스 구현
![]() |
3. 지하철 클래스 구현
![]() |
4. 학생-버스-지하철 객체 협력하기
![]() |
5. 출력 화면
![]() |
06-3. static 변수 - 여러 인스턴스에서 공통으로 사용하는 변수
- 여러 인스턴스가 공유하는 기준 값이 필요한 경우
- 예) 학생마다 새로운 학번 생성
- 예) 카드회사에서 카드를 새로 발급할때마다 새로운 카드 번호를 부여
- 예) 회사에 사원이 입사할 때 마다 새로운 사번이 필요한 경우
static 변수 선언과 사용하기
static (예약어) int(자료형) serialNum;(변수 이름) |
- 인스턴스가 생성될 때 만들어지는 변수가 아닌, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당
- 클래스 변수, 정적변수 라고도 함 (vs 인스턴스 변수)
- 인스턴스 생성과 상관 없이 사용 가능하므로 클래스 이름으로 직접 참조
static 메서드의 구현과 활용, 변수의 유효 범위
static 메서드 만들기
일반 멤버 변수를 위한 메서드가 존재하듯 static 변수를 위한 메서드도 존재한다. = static메서드 or class메서드
- serialNum 변수를 private으로 선언하고 getter / setter 구현
Employee.java
private static int serialNum = 1000; ... public static int getSerialNum() { return serialNum; } public static void setSerialNum(int serialNum) { Employee.serialNum = serialNum; } |
외부 클래스에서 serialNum 변수를 직접 참조하지 못하도록 일단 private으로 선언하고
이 변수에 대한 get /set 메서드를 생성한다.
- 클래스 이름으로 호출 가능 (클래스 메서드, 정적 메서드)
System.out.println(Employee.getSerialNum()); |
serialNum을 직접 참조하지 않고 getSerialNum() 메서드를 호출하여 참조한다.
static 메서드 또한 static 변수처럼 인스턴스 참조 변수가 아닌 클래스 이름으로 직접 호출한다.
static 메서드(클래스 메서드)에서는 인스턴스 변수를 사용할 수 없다
- static 메서드는 인스턴스 생성과 무관하게 클래스 이름으로 호출될 수 있음
- 인스턴스 생성 전에 호출 될 수 있으므로 static 메서드 내부에서는 인스턴스 변수를 사용할 수 없음
Employee.java
public static void setSerialNum(int serialNum) { int i = 0; employeeName = "Lee"; //오류발생 Emplyee.serialNum = seralNum; } |
인스턴스가 생성되어야 메모리가 할당되는 인스턴스 변수는 클래스 메서드에서 사용할 수 없다.
정리하자면
클래스 메서드 내부에서 지역 변수와 클래스 변수는 사용할 수 있지만, 인스턴스 변수는 사용할 수 없다.
반대로 일반 메서드에서 클래스 변수를 사용하는 것은 전혀 문제가 되지 않는다.
왜냐하면 일반 메서드는 인스턴스가 생성될 때 호출되는 메서드이고,
클래스 변수는 이미 만들어진 변수이기 때문에 일반 메서드에서도 클래스 변수를 호출할 수 있기 때문!
06-4. 변수 유효 범위
- 변수의 유효 범위(scope)와 생성과 소멸(life cycle)은 각 변수의 종류마다 다름
- 지역변수, 멤버 변수, 클래스 변수는 유효범위와 life cycle, 사용하는 메모리도 다름
변수 유형 | 선언 위치 | 사용 범위 | 메모리 | 생성과 소멸 |
지역 변수 (로컬 변수) |
함수 내부에 선언 | 함수 내부에서만 사용 | 스택 | 함수가 호출될 때 생성되고, 함수가 끝나면 소멸함 |
멤버 변수 (인스턴스 변수) |
클래스 멤버 변수로 선언 | 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용 가능 | 힙 | 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨 |
static 변수 (클래스 변수) |
static 예약어를 사용하여 클래스 내부에 선언 | 클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능 | 데이터 영역 | 프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고, 메모리를 해제할 때 소멸됨 |
- static 변수는 프로그램이 메모리에 있는 동안 계속 그 영역을 차지하므로 너무 큰 메모리르 할당하는 것은 좋지 않음
- 클래스 내부의 여러 메서드에서 사용하는 변수는 멤버 변수로 선언하는 것이 좋음
- 멤버 변수가 너무 많으면 인스턴스 생성 시 쓸데없는 메모리가 할당됨
- 상황에 적절하게 변수를 사용해야 함
06-5. static 응용 - 싱글톤 패턴
싱글톤 패턴이란?
- 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
- static 변수, 메서드를 활용하여 구현 할 수 있음
싱글톤 패턴으로 회사 객체 구현하기
- 생성자는 private으로 선언
private Company() {} |
- 클래스 내부에 유일한 private 인스턴스 생성
private static Company instance = new Company(); |
- 외부에서 유일한 인스턴스를 참조할 수 있는 public 메서드 제공
public static Company getInstance() { if( instance == null) { instance = new Company(); } return instance; |
'Programming Language > JAVA' 카테고리의 다른 글
[Do it 자바 프로그래밍 입문] 객체지향 입문 복습 문제 풀이 (0) | 2023.05.22 |
---|---|
[Do it 자바 프로그래밍 입문] 07.배열과 ArrayList (0) | 2023.05.15 |
[Do it 자바 프로그래밍 입문] 05.클래스와 객체1 (0) | 2023.05.11 |
[Do it 자바 프로그래밍 입문] 연습문제 - 다이아몬드 모양 (0) | 2023.05.10 |
[Do it 자바 프로그래밍 입문] 04.제어 흐름 이해하기 (0) | 2023.05.09 |