인스턴스와 클래스

Munang·2021년 11월 29일
0

자바의 정석

목록 보기
3/6

핵심 개념

  1. 객체지향언어의 장점
    • 코드 재사용성이 높다: 상속, 다형성
    • 코드의 관리가 용이: 상속, 다형성
    • 신뢰성이 높은 프로그래밍을 가능하게함: 제어자, 메서드를 이용해 데이터 보호, 코드 중복 제거
  2. 클래스의 정의
    • 객체를 정의해 놓은 것
    • 객체를 생성하는 데에 사용된다.
  3. 객체와 인스턴스
    • 클래스로부터 객체를 만드는 과정 = 인스턴스화
    • 클래스로부터 만들어진 객체 = 인스턴스
  4. 객체의 구성요소: 속성, 기능
    • 속성: 멤버변수, 특성, 필드, 상태
    • 기능: 메서드, 함수, 행위

인스턴스의 생성과 사용

[인스턴스 생성과정] - 중요하다

  • 참조형(Reference Type)의 데이터 타입을 갖는 객체(인스턴스), 배열 등은 Heap 영역에 데이터가 저장된다. 이때 변수(객체, 객체변수, 참조변수)는 Stack 영역의 공간에서 실제 데이터가 저장된 Heap 영역의 참조값(reference value, 해시코드 / 메모리에 저장된 주소를 연결해주는 값)을 new 연산자를 통해 리턴 받는다. 다시 말하면 실제 데이터를 갖고 있는 Heap 영역의 참조 값을 Stack 영역의 객체가 갖고 있다. 이렇게 리턴 받은 참조 값을 갖고 있는 객체를 통해서만 해당 인스턴스를 핸들 할 수 있다.
클래스명 변수명;
변수명 = new 클래스명();

class Tv {
	String color;
	boolean power;
	int channel;
	
	void power() { power = !power; }
	void channelUp() { ++channel; }
	void channelDown() { --channel; }

}

Tv t; //TV 인스턴스를 참조하기 위한 Tv클래스 타입의 참조변수를 선언
t = new Tv(); //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
  1. 처음 Tv클래스 타입의 참조변수 t를 생성한다. 그리고, 메모리에 t를 위한 공간이 마련된다.
    아직 인스턴스가 생성되지 않았음으로 참조변수로 아무것도 할 수 없다.
    이때 참조변수는 Stack영역에 메모리가 할당되고, null값을 가지게 된다. 

  1. 이후에 new 연산자를 이용해서 인스턴스를 생성하면 heap영역의 메모리에 데이터가 생성되고, 데이터는 heap영역에 잡히며 이때 heap영역의 주소값을 참조변수가 넘겨받게 된다.

  2. new 연산자에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 주소가 0x100인 곳에 생성되었다고 가정하자. 이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다.
    아직 = 연산자로 할당하지 않았기 때문에 tv변수는 null값을 갖는다. 

  3. 그 다음에는 대입 연산자에(=)에 의해서 생성된 객체의 주소값이 참조변수 t에 저장되나. 이제는 참조변수 t를 통해 tv인스턴스에 접근할 수 있다. 인스턴스를 다루기 위해 참조변수가 반드시 필요하다.
  • 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

[인스턴스 생성 후 가비지 컬렉터에 의한 해제]

class Tv {
	String color;
	boolean power;
	int channel;
	
	void power() { power = !power; }
	void channelUp() { ++channel; }
	void channelDown() { --channel; }

}

class TvTest {
	
	public static void main(String args[]){
		Tv t1 = new Tv();
		Tv t2 = new Tv();

		t2 = t1;
			
		}
}
  1. t2 = t1

t1은 참조변수 이므로, 인스턴스의 주소를 저장하고 있다. 이 문장이 수행되면, t2가 가지고 있던 값은 잃어버리게 되고, t1에 저장되어 있던 값이 t2에 저장되게 된다. 그렇게 되면 t2역시 t1이 참조하고 있던 인스턴스를 같이 참조하게 되고, t2가 원래 참조하고 있던 인스턴스는 더 이상 사용할 수 없게 된다.

원래 이랬다가

이렇게 되고, t2가 원래 참조하고 있던 인스턴스는 더 이상 사용할 수 없게 된다. 또한, 자신이 참조하고 있는 참조변수가 하나도 없는 인스턴스는 더 이상 사용되어질 수 없으므로 가비지 컬렉터에 의해서 자동적으로 메모리에서 제거된다.

참조변수는 하나의 인스턴스만 참조할 수 있다. 여러개의 참조변수가 하나의 인스턴스를 가리키는 것은 가능하지만 그 역은 안됨


객체 배열

  • 객체 배열 = 참조변수들을 하나로 묶은 참조변수 배열
  1. 길이가 2인 객체 배열은 3개의 객체 주소를 저장할 수 있는 배열이다.
Tv[] tvArr = new Tv[3];

  1. 객체를 생성해서 객체 배열의 각 요소에 저장하는 것을 잊으면 안된다.
  2. 객체 배열에도 같은 타입의 객체만 저장할 수 있다.
  3. 다형성을 배우고 나면 하나의 배열로 여러개의 객체를 다룰 수도 있다.

클래스의 또 다른 정의 = 데이터와 함수의 결합 = 사용자정의 타입

  1. 변수: 하나의 데이터를 저장할 수 있는 공간
  2. 배열: 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
  3. 구조체: 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
  4. 클래스: 데이터와 함수의 결합(구조체+함수)
  • 자바에서 문자열을 단순히 문자의 배열로 정의하지 않고, 클래스로 정의한 이유는 문자열과 문자열을 다루는 데 필요한 함수들을 함께 묶기 위해서이다.
  1. 시간, 시, 분을 클래스가 아닌 다른 비객체지향적 코드로 선언하게 되면, 헷갈리게 되고 다른 데이터와 섞일 수 있다. 하지만 객체지향적 언어로 사용하면 하나로 묶어주기 때문에 이런일이 발생하지 않는다.
  2. 시간, 시, 분을 클래스로 선언하려면 시,분,초는 0보다 크고 59 이하여야하는 제약 조건이 있다.
    이러한 제약 조건을 제어자와 메서드를 이용해 반영가능하다.
    → 제어자를 이용해 변수의 값을 직접 변경하지 못하도록 하고, 메서드를 통해 값을 변경하도록 작성했다.
    → 값을 변경할 때 지정된 값의 유효성을 조건문으로 점검한 다음 유효한 값일 경우에만 변경한다.

0개의 댓글