thumb
Thumbnail

(2020.12.03)

 

자바 정보은닉, this, 객체 협력, static, 변수 범위, 싱글톤

 

 

정보은닉

 

 

클래스나 멤버 변수, 메서드를 만들 때 public 접근 제어자(Access modifier)를 주로 사용해 왔다. public 접근 제어자로 선언한 변수나 메서드는 외부 클래스에서 접근이 가능하며 외부 클래스가 사용할 수 있다는 의미이다. 

 

이와 반대로 private 접근 제어자로 선언한 변수나 메서드는 외부 클래스에서 사용할 수 없다.

 

 

private1
private2

 

위 사진처럼 private 예약어를 사용한 name과 age는 외부에서 접근할 수 없으며 이 경우 getter와 setter를 이용하여야 한다. 오른쪽과 같이 setName(), setAge()를 통하여 값을 초기화하며 getName(), getAge()를 통해 값을 가져올 수 있다.

 

 

this 예약어

 

 

this

- this는 자기 자신의 생성된 인스턴스 메모리를 가리키므로 this.name 은 Person 클래스 멤버 변수인 String name을 가리킨다. 

 

- this는 생성자에서 다른 생성자를 호출하므로 디폴트 생성자에서 this("이름없음", 1)는 매개변수(String name, int age)를 가지고 있는 생성자를 가리킨다.

 

- this는 자신의 주소를 반환한다.

  ㄴ Ex) thisEx.Person@6d78f375

 

 

객체 간의 협력

 

꾸생이가 애플스토어에서 맥북을 플랙스 하는 것을 예로 들어 객체지향 프로그램을 구현해보겠습니다. 

 

 

kku
app

 

꾸생이 클래스 멤버 변수 : 이름,  가지고 있는 돈, 가방

꾸생이 클래스 메소드 : 맥북을 산다, 정보 출력

 

애플스토어 멤버 변수 : 이름, 누적 판매 수, 총판매 금액, 맥북 이름, 맥북 가격

애플스토어 메소드 : 맥북을 판다, 정보 출력

 

 

FlexMacbook.java

 

메인 메소드가 있는 FlexMacbook.java에서 3,000,000원을 가지고 있는 꾸생이 객체 1개를 생성합니다. 애플스토어 객체도 하나 생성하구요.

 

생성된 객체인 애플스토어에서 맥북을 구매해야 하므로 꾸생이의 buyMacbook()에 매개변수로 애플스토어를 전달합니다.

 

이제 알아서 지갑에 돈을 맥북 가격만큼 차감하고 가방에 맥북을 넣습니다. 애플스토어의 sellMacbook() 메소드를 실행하여 판매 성과를 기록하고 마지막으로 showInfo() 메소드를 통해 물건이 잘 구매되었나 확인합니다.

 

정상적으로 Flex 했습니다. 😎

 

 

Do it! 자바 프로그래밍 강의에서는 학생이 버스와 지하철을 타고 학교로 가는 것이 예제로 나왔습니다. 

 

 

static 변수

 

 

static 변수는 정적 변수 또는 클래스 변수라고 불리며 여러 인스턴스가 공유하며 공통으로 사용하는 변수이다. 인스턴스끼리 기준값으로 자주 사용된다.

 

* static 메소드는 멤버 변수(인스턴스 변수)를 사용할 수 없다.

 

static 예약어 자료형 변수 이름

 

static   int   Num

 

 

static 변수는 클래스 내부에 선언하지만, 인스턴스가 생성될 때마다 생성되는 변수가 아니며, 프로그램이 실행되어 메모리에 적재 됐을 때 1번만 메모리에 생성된다. 인스턴스 생성 전에도 사용 가능!

 

C언어나 C++에서도 사용됨

 

 

변수의 유효 범위

 

변수 선언 위치 사용 범위 메모리 생성과 소멸
지역 변수(로컬 변수 함수 내부에 선언 함수 내부에서만 사용 스택(Stack) 함수가 호출될 때 생성되고 함수 종류 후 소멸
멤버 변수(인스턴스 변수) 클래스 멤버 변수로 선언 클래스 내부에서 사용, private 또는 참조 변수로 다른 클래스에서 사용 가능 힙(Heap) 인스턴스가 생성될 때 힙에서 생성되고, 가비지 컬렉터가 소멸시킴
static 변수(정적, 클래스 변수) static 예약어를 사용하여 클래스 내부에 선언 클래스 내부에서 사용하며, private 또는 클래스 이름으로 다른 클래스에서 사용 가능 데이터 영역 프로그램이 시작될 때 데이터 영역에 생성되고 프로그램이 종료되고 메모리를 해제할때 소멸

 

 

싱글톤(singleton) 패턴 - static 응용

 

프로그램을 구현할 때 단 하나의 인스턴스만 필요한 경우가 있다. 객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴을 싱글톤 패턴이라고 한다.

 

예를 들어 미국이라는 국가에 애플이라는 기업이 단 1개만 존재하는 것처럼 인스턴스를 단 한 개만 생성한다는 의미.

 

 

apple
Apple.class

package singleton;

public class Apple {
	
	private static Apple apple = new Apple(); // 2. 외부에서 참조 X & 1개만 생성하기 위해 static 선언 
	
	private Apple() {} // 1.외부에서 접근하지 못하도록 private으로 생성자 선언 
	
	public static Apple getApple() {  // 3. 외부에서 접근하기 위한 메소드로 인스턴스 생성 전 호출가능하도록 static 선언 
		return apple;
	}	
}

appletest1
AppleTest.class

package singleton;

public class AppleTest {

	public static void main(String[] args) {
		
		Apple apple = Apple.getApple(); //4. getApple() 메소드를 사용 
		
		System.out.println(apple);
		
	}
}

 

appletest2
AppleTest.class

 

위 방법으로 a1과 a2를 선언하고 주소 값을 비교했을 경우 true가 나오는 것을 확인할 수 있다.