본문 바로가기
프로그래밍 언어/자바의 정석 기초편

자바의 정석 기초편 ch6-6, 7 객체의 생성과 사용

by life grow 2022. 6. 22.

6-6 객체의 생성과 사용

 

1. 객체의 생성

객체를 다루려면

(1) 참조변수 (선언) 만들고(리모컨)

(2) 객체 생성

(3) 대입 연산자로 리모컨과 객체를 연결해준다.

 

자바에서 객체를 다룰 때 리모컨이 없으면

객체를 다룰 방법이 없다.

 

Tv t = new Tv();

t: 리모컨, =: 연결, new TV(); < 객체 생성

 

2. 객체의 사용(객체가 가지고 있는 변수와 메서드를 사용)

t.channel = 7;  변수 사용

참조변수 t가 가리키는 변수(채널)에 7을 저장

t.channelDown();  메서드 사용(호출)

메서드가 가지고 있는 문장들이 실행된다.

 

과정

1. 클래스 작성(설계도)

2. 객체 생성(제품)

3. 객체 사용(제품):

객체가 가지고 있는 변수와 메서드를 사용한다는 의미

 

사용방법

리모컨(참조변수)을 통해서 접근해야 한다.

 

객체의 주소가 0x100에 만들어졌다고 가정한다. 

객체가 만들어지면 메모리 어딘가에 만들어 짐

비어있는 메모리 공간에 주소를 갖게 된다.

그게 0x100, 이 값을 t에 저장한다.

new 연산자가 객체를 만들고 그 객체의 주소가 어딘지 알려준다.

 

Tv객체를 다룰 때 Tv리모컨을 통해서만 다룰 수 있다.

Tv객체에는 Tv리모컨이 필요하다.

리모 타입하고 생성하려는 객체 타입하고 일치해야 한다.

 

Tv 클래스에는 6개의 멤버를 가지고 있다.

멤버란 구성요소

Tv라는 클래스가 총 6개의 멤버(구성요소)를 가지고 있다.

변수 3개 + 메서드 3개

 

6-7 객체의 생성과 사용 - 예제

 

channel이라는 이름만 똑같지 같은 변수가 아니다

t1.channel과 t2.channel는 다르다.

객체마다 별도의 저장공간이 생긴다.

 

만약 t2 = t1;이라고 한다면 어떻게 되는가?

 

변수 t1에 있는 값이 t2로 들어간다.

t2는 0x100으로 바뀐다.

그러면 t2리모컨과 0x200의 객체가 끊어진다.

이 객체는 사용불가가 된다.

객체지향 개념에서는 참조변수가 없으면 객체를 사용할 수 없다.

사용할 수 없는 객체들을 gc(가비지 컬렉터)가 메모리에서 제거해준다.

gc:청소부(불필요하게 메모리가 낭비되는 일이 없게 해 준다.)

원래 우리가 직접 필요할 때 객체를 만들어줬다가 객체를 없애줘야 한다.

근데 자바는 gc를 통해서 주기적으로 메모리를 확인해서

사용하지 않는 객체를 제거해준다.

우리는 객체를 만들기만 하면 된다.

 

반대로 t2리모컨은 0x100의 객체와 연결이 된다.

두 개의 리모컨이 하나의 객체를 가리키는 것도 가능하다.

그 이상의 리모컨도 가능하다.

주소값만 같으면 된다.

 

하나의 참조변수로 두개의 객체를 가리키는 건 안된다.

변수는 하나의 값만 저장 가능하기 때문이다.

참조변수 t1에 0x100, 0x200 둘 다 들어갈 수 없다. 

 

클래스가 두 개인 경우

메인메서드가 있는 클래스 이름이 소스 파일 이름과 일치해야 한다.

이름이 다르면 에러는 안 나는데 실행이 안된다.

이클립스가 메인메서드가 어딨는지 알아야 자동으로 실행해준다.

소스파일 이름을 가지고 이클립스가 판단한다.

 

예제 6-1

class Hello3{
	public static void main(String[] args) {
		Tv t;                        
		t = new Tv();         // Tv인스턴스를 생성한다. 
		t.channel = 7;        // Tv인스턴스의 멤버변수 channel의 값을 7로 한다. 
		t.channelDown();      // Tv인스턴스의 메서드 channelDown()을 호출한다. 
		System.out.println("현재 채널은 " + t.channel + " 입니다."); 
	}
} 

class Tv {
	
	// Tv의 속성(멤버변수)   
		String color;           // 색상 
		boolean power;         	// 전원상태(on/off) 
		int channel;           	// 채널 

		// Tv의 기능(메서드) 
		void power()   { power = !power; }  // TV를 켜거나 끄는 기능을 하는 메서드  
		void channelUp()   {  ++channel; }  // TV의 채널을 높이는 기능을 하는 메서드 
		void channelDown() { --channel; }   // TV의 채널을 낮추는 기능을 하는 메서드  
}
결과
현재 채널은 6 입니다.

 

예제 6-2

class Ex6_2 {
	public static void main(String args[]) {
		Tv t1 = new Tv();  // Tv t1; t1 = new Tv();를 한 문장으로 가능
		Tv t2 = new Tv();
		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");

		t1.channel = 7;    // channel 값을 7으로 한다.
		System.out.println("t1의 channel값을 7로 변경하였습니다.");

		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
		
		t2 = t1;
		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
		//참조변수 t2가 가리키는 객체가 달라져서 7이 출력된다.
	}
}
결과
t1의 channel값은 0입니다.
t2의 channel값은 0입니다.
t1의 channel값을 7로 변경하였습니다.
t1의 channel값은 7입니다.
t2의 channel값은 0입니다.
t1의 channel값은 7입니다.
t2의 channel값은 7입니다.