본문 바로가기
멀티캠퍼스 풀스택 과정/Java의 정석

자바의 정석2-2 객체의 생성과 사용(cv, iv, lv의 개념)

by 이쟝 2021. 12. 30.

객체의 생성과 사용

1. 객체의 생성

 

클래스명 변수명;           // 클래스의 객체를 참조하기 위한 참조변수를 선언

변수명 = new 클래스명( );  // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

 

TV t,                      // Tv클래스 타입의 참조변수 t를 선언   

t = new TV( );             // Tv인스턴스(객체)를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

-> Tv t = new Tv( );

-> 객체를 다루려면 반드시 참조변수(1)가 필요하고 객체를 생성(2)한다음에 대입연산자(3)로 연결!

// 여기서 참조변수(리모컨)는 t

 

2. 객체의 사용

- 객체가 가지고 있는 변수(속성)와 매서드(기능)를 사용

t.channel = 7;   // Tv인스턴스의 멤버변수 channel의 값을 7로 한다.

t.channelDown( );  // Tv인스턴스의 메서드 channelDown( )을 호출한다.

System.out.println(“현재 채널은 “ + t.channel + “ 입니다.”);

-> 첫 번째는 변수를 사용하는 방법(변수 사용) 두 번째는 메서드를 사용하는 방법(메서드 호출)

 

(1) 클래스 작성(설계도) 2) 객체 생성(제품 만들기) 3) 객체 사용(제품 사용)


객체의 생성과 사용 예제

a는 가능,  b는 불가능

->> 두개의 참조변수로 하나의 객체를 가리키는 것은 가능(a)하지만 하나의 참조변수로 두 개의 객체를 가리키는 것은 불가능(b)(참조변수는 하나의 값만 저장할 수 있기 때문)


Tv클래스 예제

 

public class HelloClass1 {

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

		Tv t1 = new Tv();   // Tv t1; t1 = new Tv();를 한 문장으로
		Tv t2 = new Tv();
		System.out.println("t1의 channel은 " + t1.channel + "입니다.");//0
		System.out.println("t2의 channel은 " + t2.channel + "입니다.");//0
	
		t1.channel = 7;  
		t2 = t1;  
//참조변수 t1의 값을 t2에 저장, 실제 t2값은 그대로 있고 garbage collect가 안쓰는 t2값을 제거되었고, 참조변수가 없어서 기존 t2값을 쓸 수 없음
		System.out.println("t1의 channel은 " + t1.channel + "입니다.");//7
		System.out.println("t2의 channel은 " + t2.channel + "입니다.");//7
	}
}

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의 채널을 낮추는 기능을 하는 메서드

}

객체 배열

객체 배열 == 참조변수 배열

객체의 배열은 객체를 담기 위한 것!

 

tvArr은 객체 배열

-> 객체 배열을 생성하고 꼭 객체를 생성해줘야 함! 항상 같이


선언위치에 따른 변수의 종류

 

영역별 선언된 변수(3가지)

1) 클래스 영역 (1) iv(인스턴스 변수), (2) cv(클래스 변수): static + iv

2) 메서드 영역 (3) lv(local variable, 지역변수)

-> 클래스 영역에는 선언문만 가능

 

변수의 종류 선언위치 생성시기
클래스 변수(class variable) 클래스 영역
 
클래스가 메모리에 올라갈 때
인스턴스 변수
(Instance variable)
인스턴스가 생성되었을 때(객체가 생성되었을 때)
지역변수(Local variable) 클래스 영역 이외의 영역(메서드, 생성자, 초기화 블록 내부) 변수 선언문이 수행되었을 때(메서드 종료 시 자동제거)

 

- 객체는 iv(instance variable) 변수 묶음, iv는 객체마다 1개씩

- cv는 객체 생성이 필요 없음(아무 때나 사용가능), iv는 객체 생성이 필요(객체 생성을 해야 사용 가능)


클래스 변수와 인스턴스 변수

공통 속성 -> cv(클래스 변수), 개별 속성 -> iv(인스턴스 변수)

속성 중에 공통적으로 유지되어야 하는 것에 static 붙이기 -> cv = static + iv

 

class Card {
	
	String kind; //무늬(개별)
	int number; //숫자(개별)
	static int width = 100; //폭(공통)
	static int height = 250; //높이(공통)

}
Card c = new Card(); //객체 생성 
c.kind = "HEART"; // 객체 사용(iv)
c.number = 5; //객체 사용(iv)
Card.width = 200;  //클래스 이름.속성이름, 객체 사용(cv) 
Card.height = 300; //클래스 이름.속성이름, 객체 사용(cv)

 

-> cv(클래스 변수)를 쓸 때 참조 변수를 쓰게 되면 iv랑 헷갈릴 수 있기 때문에 클래스 이름으로!

) c.width = 200; x Card.width = 200;