· 3분 읽기
Last updated on

KH자바수업_5_클래스와 객체 2


이론_JAVA

목록 보기숨기기5/13
  1. KH자바수업_1_변수와 자료형, 연산자
  2. KH자바수업_2_제어문, 반복문
  3. KH자바수업_3_클래스와 객체
  4. KH자바수업_4_생성자
  5. KH자바수업_5_클래스와 객체 2
  6. KH자바수업_6_배열
  7. KH자바수업_7_다차원 배열, ArrayList
  8. KH자바수업_8_상속
  9. KH자바수업_9_다형성
  10. KH자바수업_10_추상 클래스
  11. KH_JAVA_11_인터페이스
  12. KH_JAVA_12_중첩 클래스와 중첩 인터페이스
  13. KH_JAVA_13_예외처리

this 예약어

this는 인스턴스 스스로를 가리키는 예약어이다. 

자신의 메모리를 가리키며, 생성자에서 다른 생성자를 호출하고, 자신의 주소를 반환하기도 한다.

자신의 메모리를 가리키는 this

클래스를 생성하고 자신의 메모리 주소를  출력하는 메소드를 this를 사용해서 만들어 보았다.

매개변수의 이름과 멤버변수의 이름이 같을 때 this를 사용하면 구분할 수 있다.

같은 클래스 안에 있기 때문에 멤버 변수에 private를 붙여도 가능하다.

아래는 출력 화면이다.

같은 메모리 주소를 가리킨다.

같은 메모리 주소를 가리킨다.

this로 다른 생성자 호출하기

매개변수의 개수가 다른 생성자를 this예약어를 사용해서 호출한 코드이다.

여기서 주의할 점이 있다.

this로 다른 생성자를 호출할 때는 실행되는 첫번째 line이어야만 한다.

그렇지 않게 되면 에러가 나타난다.

여기에선 에러가 안나타나지만

여기에선 에러가 안나타나지만

이 코드에선 나타난다.

이 코드에선 나타난다.

객체 간의 협력

Student, Bus, Subway 클래스를 생성하고, 각 객체 간의 협력이 이루어지는 과정을 알아보자.

학생이 버스를 탈 때 돈을 내고, 지하철을 탈 때 돈을 낸다. 버스의 승객 수, 지하철의 승객 수를 객체로 관리하고 학생의 남은 돈을 관리할 수 있도록 코드를 구현해 보자.

각 클래스의 멤버 변수(인스턴스 변수)는 private로 접근제어자를 설정하고 구현한다.

Student.class

Student.class

Bus.class

Bus.class

Subway.class

Subway.class

main함수가 존재하는 TakeTrans.class

main함수가 존재하는 TakeTrans.class

멤버 변수(인스턴스 변수)를 메소드를 통해 접근할 수 있지만, 접근하려면 getter,setter 메소드를 구현해야 한다.

버스를 탄다면 버스에서는 승객 수가 증가하고, 버스의 money가 증가한다. 또한 버스를 탄 Student 인스턴스의 money는 감소한다.

지하철도 마찬가지로 승객 수가 증가하고, 지하철의 money가 증가하며, 지하철을 탄 Student 인스턴스의 money는 감소한다.

james도 subway를 타도록 구현해보고 결과값을 출력해보자.

james의 돈이 또 줄었고, 2호선의 승객과 수입은 증가한 것을 볼 수 있다

james의 돈이 또 줄었고, 2호선의 승객과 수입은 증가한 것을 볼 수 있다

static 메서드

클래스 메서드라고도 함

메서드에 static 키워드를 사용하여 구현

주로 static 변수를 위한 기능 제공

static 메서드에서 인스턴스 변수를 사용할 수 없음

static 메서드도 인스턴스의 생성과 관계 없이 클래스 이름으로 직접 메서드 호출

package com.kh._static;

public class StudentTest {

	public static void main(String[] args) {
		Student studentLee = new Student();
		
		studentLee.setStudentId(1331);
		System.out.println(Student.getSerialNum());
		studentLee.setSerialNum(1234);
		
		Student studentSon = new Student();
		
		studentSon.setStudentId(1234);
		System.out.println(Student.getSerialNum());
		
	}

}

변수의 유효 범위

변수 유형에 따른 용도

변수 유형선언 위치사용 범위메모리생성과 소멸
지역 변수
(로컬 변수)
함수 내부에 선언함수 내부에서만 사용스택함수가 호출될 때 생성되고 함수가 끝나면 소멸함
멤버 변수
(인스턴스 변수)
클래스 멤버 변수로 선언클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서 사용 가능힙인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리를 수거할 때 소멸됨
static 변수
(클래스 변수)
static 예약어를 사용하여 클래스 내부에 선언클래스 내부에서 사용하고 private이 아니면 클래스 이름으로 다른 클래스에서 사용 가능데이터 영역프로그램이 처음 시작할 때 상수와 함께 데이터 영역에 생성되고 프로그램이 끝나고 메모리를 해제할 때 소멸됨

Static 응용 - 싱글톤 패턴

객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴이다.

싱글톤 패턴으로 회사 클래스를 생성해보자.

1. 생성자를 private로 만들기

private Company() {}

2. 클래스 내부에 static으로 유일한 인스턴스 생성하기

private static Company instance = new Company();//유일하게 생성한 인스턴스.

3. 외부에서 참조할 수 있는 public 메소드 만들기

public static Company getInstance() {
	if(instance==null) {
		instance = new Company();
	}
	return instance;
}

4. 실제로 사용하는 코드 만들기

package com.kh.singleton;

public class CompanyTest {

	public static void main(String[] args) {
				//클래스명으로 접근.
		Company company1 = Company.getInstance();
		Company company2 = Company.getInstance();
		System.out.println(company1);
		System.out.println(company2);
		System.out.println(company1==company2);
	}

}
//실행 결과
com.kh.singleton.Company@6b57696f
com.kh.singleton.Company@6b57696f
true

인스턴스를 여러개 만들어도 같은 주소를 참조한다는 것을 알 수 있다 -> 한 개 밖에 생성하지 못한다.

댓글

댓글을 불러오는 중…